2016-06-17 3 views
0

나는 한동안 히트 감지 알고리즘을 연구 해왔다. 배열에있는 일련의 사각형을 가지고 있으며 루프를 통해 배열을 살펴본 후 항목 (버스)가 교차하고 있습니다.액션 스크립트 : 교차하지 않는 여러 오브젝트가 교차합니까?

// Gets important variables from controller class 
var blocks:Array = main.blocks; 
var map:Map = main.game.gameMap; 
var game:GameMapScreen = main.game; 
var bus:Bus = main.game.gameMap.bus; 
var busSpeed:uint = 5; 

// Centers the 'map' around the 'bus' 
game.x = (bus.x) * -1 + stage.stageWidth/2; 
game.y = (bus.y) * -1 + stage.stageHeight/2; 
map.setChildIndex(bus, map.numChildren - 1); 

// Creates the new x and y values for where the bus will move 
var angle:Number = (bus.rotation/360) * (Math.PI * 2); 
var dx:Number = Math.cos(angle); 
var dy:Number = Math.sin(angle); 
var newX:Number = dx * busSpeed; 
var newY:Number = dy * busSpeed; 

// Gets a clone of rectangle around bus, moves it to new x and y 
busRect.x += newX; 
busRect.y += newY; 

하고 그럼 블록 어레이를 통과하고 다시 버스 직사각형 각 블록의 직사각형

var hitting:Boolean = false; 
for(var i:uint = 0; i < blocks.length; i++) 
{ 
    if(busRect.intersects(blocks[i].getRect(map)) 
    { 
     hitting = true; 
     break; 
    } 
} 

테스트 후 타격 있는지 확인 다음과 같이

원래 코드 간다 , 그렇지 않으면 이동합니다.

if(!hitting) 
{ 
    bus.x += newX; 
    bus.y += newY; 
} 

내가 발견 한 문제는 버스가 블록을 교차시키지 않으면 두 블록을 "교차"하는 것처럼 보입니다.

블록은 교차하지 않아야하는 중간에 공백이있는 격자 모양으로 정렬되어 있지만 실제로는 블록을 삽입 할 때 교차점 2와 1 인 것처럼 보입니다.

여러 번 확인하고 다른 사람들과상의 한 후에는 문제를 파악할 수 없습니다. 우리가 유행처럼 그리드에 블록을 배열하고 어레이에 스틱을 넣은 다음 무언가를 때리는 지 확인합니다. 실제로 교차하지 않으면 2 블록을 교차하고 교차하는 경우 1 블록을 찾습니다.

아이디어가 있으십니까?

+0

예 - 그 뜻입니다. 죄송합니다. 다른 컴퓨터에서 복사하고 있습니다. –

+0

'Rectangle' 클래스에는'intersections' 함수가 없습니다. '교차'또는 '교차'를 의미합니까? – samgak

+0

또한, 버스를 움직일 때'x'와'y'를 그 값으로 설정하는 대신'newX','newY'를 추가해야합니까? – samgak

답변

0

나는이 문제를 해결했다. 실제 "블록"을 사용하는 대신, 공간으로 겹치는 사각형 위에 사각형을 만들었습니다. 플레이어가 더 이상 2 + 직사각형을 교차하지 않을 때 히트 감지가 작동합니다.

관련 문제