2011-04-23 3 views
1

작은 게임 인 2D를 만들고 있는데 플레이어가 있습니다.물체의 충돌 시스템?

편집 :

이 내가 지금 무엇을 가지고 : 나는 한쪽에서 갈 때

 int oldX = player.x; 
    int oldY = player.y; 

    int newX = oldX - player.getSpeedX(); 
    int newY = oldY - player.getSpeedY(); 

    if(player.getBounds().intersects(brush1.getBounds())){ 
     player.x = newX; 
     player.y = newY; 
    }else{ 
     player.x = oldX; 
     player.y = oldY; 
    } 

을하지만, 정말 이상한 행동, 그것은 등, 속도를 변경

+0

이것에 [서클 라인 충돌 검출 (http://stackoverflow.com/questions/1073336/circle-line-collision-detection) – schnaader

+0

더 상관 응답의 중복 가능성 아마도? – Stan

답변

1

선 세그먼트와 원의 교차를 검사하는 수식과 코드에 대해서는 SO answer을 살펴보십시오.

나머지 코드는 분명해야합니다. 이동하기 전에 충돌이 발생했는지 확인하십시오 (이동하지 않는 경우).

원하는 동작에 따라 가능한 한 벽 가까이로 이동 한 다음 평행으로 이동하여 원을 벽을 따라 "밀기"시킬 수도 있습니다. 이것은 이동 벡터를 벽과 동일한 방향의 선에 투영하여 수행 할 수 있습니다.

편집 :

코드는 두 벡터의 dot product을 계산하는 Dot 함수를 사용하여 충돌을 확인하는 대답의 코드를 사용하는 방법에 대한 몇 가지 의견. Vector 클래스를 만들거나 (좋은 연습과 그러한 프로젝트에 유용합니다) formulas here을 사용하여 직접 내적 제품 만 계산할 수 있습니다.

벡터 클래스를 사용하면 코드를 쉽게 읽을 수 있지만 직접 float에서도 조작 할 수 있습니다. 예를 들어, 답변의 시작 부분에 설명 된대로 d (광선의 방향 벡터) 및 f (중심 구에서 광선 시작까지의 벡터)의 계산을 살펴 보겠습니다.

// L, E, C, d and f are of some vector type 
d = L - E; 
f = E - C; 

벡터 클래스 없이는 당신은 코드를 조금 복부 팽만 만하고, 별도의 X/Y는 모든 변수에 대해 조정해야합니다 : 공식이 사용 된 벡터 클래스, 이것은 쉽게 될 것입니다 그냥 같은 :

// Twice as much variables, but all of them are usual floats. 
dx = Lx - Ex; 
dy = Ly - Ey; 
fx = Ex - Cx; 
fy = Ey - Cy; 
+0

글쎄, 난 아직 좋은 코더 아니에요, 그리고 난 정말 그 중 하나를 이해하지 않습니다. 정말 그렇게 힘드니? – Stan

+0

가장 어려운 점은 수학 문제입니다. 이 경우 응답에서 코드를 복사/붙여 넣기하고 확장하여 코드가 잘 작동하는지 제안해야합니다. 내 대답을 편집하고 이에 대한 몇 가지 의견을 남깁니다. – schnaader

+0

타원형을 직사각형으로 편집하면 더 쉽게 될까요? 아니면 같은 것이 될까요? – Stan

0

나는 당신의 코드 스 니펫은 몇 가지 버그가 있다고 생각합니다. 추천 수정 :

int oldX = player.x; 
int oldY = player.y; 

// *add* speed to old pos to get new pos 
int newX = oldX + player.getSpeedX(); 
int newY = oldY + player.getSpeedY(); 

if(player.getBounds().intersects(brush1.getBounds())){ 
    // Collision! Keep old position. 
    // Reverse speed (just a suggestion). 
    player.setSpeedX(-player.getSpeedX()); 
    player.setSpeedY(-player.getSpeedY()); 
}else{ 
    // No collision. Set position to *new* pos, not old pos. 
    player.x = newX; 
    player.y = newY; 
} 
+0

그것은 여하튼 모든 물체를 거쳐 가고 있습니다. – Stan

관련 문제