2012-07-08 2 views
1

지도에서 걷지 못하는 캐릭터, 적과 개체가있는 게임에 대해 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 
} 
} 
+0

확인 BitmapData 클래스의 hitTest() 메서드를 호출합니다. http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#hitTest%28%29 – okayGraphics

답변

0

오버 헤드보기를 사용하는 것처럼 들릴 수 있습니다 (상자가 X 및 Y로 이동한다고 가정 할 때). 나는 0과 1을 가진 2D 배열을 가질 것입니다 (true/falses). 당신의 캐릭터가 움직일 때, 그것이 차지하는 타일에 대해 캐릭터 히트 박스를 찾으십시오. 일반적으로 1에서 4 타일입니다.

어떤 점이든간에 TRUE가 있으면 그는 뭔가를 치고 있습니다. 당신은 단지 활성 개체에 대한 상자를 칠 필요는이 방법 (그들은 등 이동)

나는 또한 당신을 위해 최선을 작동하는 것 같다 솔루션이 글을 확인하고 구현하는 것이 :

http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/

+0

게시물에 감사드립니다. 가능한 한 많이하고 싶었던 것이 었습니다. 타일 ​​기반 시스템을 사용하지 마십시오 (작은 타일에 지정하지 않는 한) 이동의 자유가 많이 제거됩니다. 제안 된 타일 ("배열") 시스템으로이를 수행하는 것이지도 객체 주변의 경계 상자를 사용하는 것과 비교할 때 가장 좋은 방법이라고 말씀해 주시겠습니까? –