2012-09-07 2 views
2

XNA에서 2D 게임을 개발 중이며 현재 물리 수업을 진행하고 있습니다. 내 현재 작업은 다른 개체와 충돌 할 때 개체를 중지하는 것입니다. 내가 내 게임 호출 이제까지 두 물체가 충돌이 함수를 만들었습니다 :충돌시 이동 차단

public void BlockMovement(gameObject target) { 
    //you can call width by just typing width. same for height 
    owner.position.X += (owner.position.X - target.position.X); 
    owner.position.Y += (owner.position.Y - target.position.Y); 
} 

문제는 대신에 정지 점이다. 움직이는 물체는 너비만큼 밀어 넣습니다. 누군가 제발 보여줄 수/내가 어떻게 sooo에 대한 많은 프로젝트에서 오랫동안 붙어있어 이렇게 할 말해.

감사

+2

다른 곳에서 충돌 검사를 수행하고 있습니까? 멈추고 싶다면 속도를 제로로하지 않는 이유는 무엇입니까? 게임 오브젝트의 세부 사항을 보지 않거나 적어도 위치를 업데이트하는 방법을 보지 않고 일들을 멈추게하는 법을 말하는 것은 어렵습니다. – itsme86

+1

그래, 왜 BlockMovement()에서 개체의 X 및 Y 위치를 이동하려고하는지 잘 모르겠다. 바운스 등을 시도하지 않는 한, 완전히 움직이지 않기를 원할 것입니다. 더 많은 코드가 있으므로 변경해야 할 사항에 대해 더 잘 알 수 있습니까? 덕분에 – cush

답변

1

목표와 소유자의 너비와 높이를 계산에 넣지 않습니다. 대상/소유자의 X, Y는 어디에 있습니까? 중간? 왼쪽 상단?

충돌은 머리에 머리 당신이 속도 변수를 해달라고 경우

velocity=sqrt(x_velocity*x_velocity+y_velocity*y_velocity); //some pseudo 

public void BlockMovement(gameObject target) { 
    //you can call width by just typing width. same for height 
    owner.position.X -=owner.x_velocity*penetration_length/(owner.velocity); 
    owner.position.Y -=owner.y_velocity*penetration_length/(owner.velocity); 
} 

//so, if big part of speed is in x-direction then the position will 
//change mostly on x-direction and opposite to velocity 

, 다시 2 반복의 위치 기록을 도입 할 수 있습니다 실제 속도 방향을 계산하는 경우.

+0

. 위치가 중간에 위치해야합니다. – user1494136

0

당신은 두 가지 선택이 있습니다

1) 이동하기 전에 충돌을 예측하고 지금까지 2) 이동 또는 일어나는에서 충돌을 방지, 충돌을 감지하고 충돌을 해결을 따라

내 게임은 통과 할 수없는 타일과 충돌 할 때 개체를 중지하는 데 방법 2를 사용합니다. 이러한 절차는 아래에 설명되어 있습니다.

objectPreviousPosition = object.position 
object.move() 
if(object.isCollidingWith(wall)) 
    object.position = objectPreviousPosition 

이것은 매우 기본적이고 충돌이 감지되는 방식을 설명하지 않으며 충돌 논리가 true를 반환하는 경우 수행 할 작업 만 설명합니다. 또한이 메서드는 플레이어의 업데이트로 인해 충돌이 발생하면 모든 이동을 방지합니다. 따라서이 방법을 사용하면 벽을 따라 "미끄러지는"효과를 얻을 수 없습니다.

원하는 경우 슬라이딩 효과를 얻으려면 플레이어의 방향을 결정하고 그 방향을 기준으로 플레이어의 위치를 ​​조정하여 충돌을 해결해야합니다. 예를 들어

:

if(object.movementDirection == movementDirection.UpRight) 
    if(player colliding with wall to right) 
     keep Y coordinate and set X coordinate to put player on left side of wall 

이 너무 리터럴 코드를하지 않는 모든 의사입니다.