지도에서 걷지 못하는 캐릭터, 적과 개체가있는 게임에 대해 hitTestPoint를 수행하는 가장 좋은 방법을 찾으려합니다.지도 기반 게임에서 hitTestPoint를 통한 AS3 충돌 감지
나는 여기에서 볼 수있는 버전을 만들었습니다. http://www.hosted101.net/hit/mapHitTest.html (이동하려면 화살표 키를 누릅니다. 정사각형입니다).
이전에 제안한 방법을 사용하여지도의 모든 개체의 보조 버전을 만들었으며 플레이어의 절반 크기로 증가 시켰으며 플레이어의 centerX 및 centerY에서 hitTestPoint를 실행하고 있습니다.
위대한 작품입니다.
그러나 나는 최적이 아니며 사용자가 볼 수없는 경우에도 이러한 모든 추가 "경계 상자"를 만들면 불편할 수 있습니다.
그래서 두 번째 버전을 만들었습니다. 경계 박스가없는 이번에는 http://www.hosted101.net/hit/mapHitTestNew.html (이동하려면 화살표 키).
플레이어의 centerX와 centerY에서 여전히 실행 중이므로 객체에 접근했지만 centerX/Y보다 아래에 있으면이 객체를 통과 할 수 있습니다.
내 질문은 이것입니다 : hitTest 객체 대 플레이어/적 /이 같은 게임의 모든 것, 가장 좋은 방법은 무엇입니까? (이 간단한 프로젝트에 대한 고정 예제가 유용 할 것입니다)
정말 추가 테두리 상자가있는지도 레이어의 복제본을 만들거나보다 깨끗한 방식으로 수행 할 수 있습니까?
아래 코드는 mapHitTestNew의 코드입니다.
감사합니다.
var moveL:Boolean = new Boolean
var moveR:Boolean = new Boolean
var moveU:Boolean = new Boolean
var moveD:Boolean = new Boolean
var moveSpeed:int = 2
stage.addEventListener(KeyboardEvent.KEY_DOWN, updateKeysDown)
stage.addEventListener(KeyboardEvent.KEY_UP, updateKeysUp)
function updateKeysDown(e:KeyboardEvent){
var _keyCode = e.keyCode
switch (_keyCode){
case 37:
moveL = true;
break;
case 38:
moveU = true;
break;
case 39:
moveR = true;
break;
case 40:
moveD = true;
break;
}
collisionCheck()
}
function updateKeysUp(e:KeyboardEvent){
var _keyCode = e.keyCode
switch (_keyCode){
case 37:
moveL = false;
break;
case 38:
moveU = false;
break;
case 39:
moveR = false;
break;
case 40:
moveD = false;
break;
}
}
/**
***
*** Hit Test
***
***
**/
function collisionCheck():void{
var _MC:MovieClip = new MovieClip;
_MC.x = player.x
_MC.y = player.y
_MC.mouseEnabled = false
var centerX:Number = _MC.x + (player.width/2)
var centerY:Number = _MC.y + (player.height/2)
if(moveL){
trace("Stage 1 Move")
centerX -= moveSpeed
if(map.hitTestPoint((centerX-player.width/2), centerY, true)){
trace("Stage 1 HIT TEST!")
moveL = false
}
}
if(moveR){
trace("Stage 2 Move")
centerX += moveSpeed
if(map.hitTestPoint((centerX+player.width/2), centerY, true)){
trace("Stage 2 HIT TEST!")
moveR = false
}
}
if(moveU){
trace("Stage 3 Move")
centerY -= moveSpeed
if(map.hitTestPoint(centerX, (centerY-player.height/2), true)){
trace("Stage 3 HIT TEST!")
moveU = false
}
}
if(moveD){
trace("Stage 4 Move")
centerY += moveSpeed
if(map.hitTestPoint(centerX, (centerY+player.height/2), true)){
trace("Stage 4 HIT TEST!")
moveD = false
}
}
refreshMovement()
}
function refreshMovement():void{
if(moveL){
player.x -= moveSpeed
}
if(moveR){
player.x += moveSpeed
}
if(moveU){
player.y -= moveSpeed
}
if(moveD){
player.y += moveSpeed
}
}
확인 BitmapData 클래스의 hitTest() 메서드를 호출합니다. http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#hitTest%28%29 – okayGraphics