2014-11-28 32 views
1

나는 초보자입니다. 저는 Monogame과 Farseer Physics Library를 C#으로 사용하고 있습니다.C# Monogame & Farseer Physics : Collisions

내 게임에서 ball (원)이 corner of a rectangle (또는 다른 원)에 닿을 때마다 Y 축 방향 만 변경한다고 가정합니다.

그러나 의도 한대로 Y 축 방향이 바뀌지 만 모서리에 어떻게 맞았는지에 따라 약간 오른쪽 (또는 그에 따라 왼쪽)으로 이동합니다 또는 다른 원). 그것은 어떤 힘이 볼에 가해지고있는 것처럼 보이며, X 축에서도 움직입니다.

http://i.imgur.com/rEbNTua.png?1

이 운동은 시원하고 모든이며, 많은 이해하지만, 내 게임, 그것은, 그러므로 나는 그것을 제거하지 않습니다.

어떻게 가능합니까? 나는 일부 기본값을 변경해야 할 것 같아요.

이 내 코드가 어떻게 생겼는지처럼 :

높은 속도로 또한
BallBody.BodyType = BodyType.Dynamic; 
BlockBody.BodyType = BodyType.Static; 
Ball.LinearVelocity = new Vector(0,-1); // ball going up 
BallBody.OnCollision += Ball_OnCollision; 

public bool Ball_OnCollision(Fixture f1, Fixture f2, Contact contact) 
{ 
    // if the Ball (f1), collides with the Block (f2) 
    if (f2.Body == BlockBody) 
    // change the direction of the Ball on Y-Axis 
    Ball.LinearVelocity = new Vector(0,-1); 
    return true; 
} 

이 발생 : 볼이 블록을 통과 할 수 결코

enter image description here

에도 불구하고 (터널링) , 공이 블록 영역에 들어 가지 않도록 어떻게 수정해야하는지 알고 싶습니다.

답변

1

아쉽게도 Box2D를 사용하는 것은 놀랍지 않습니다. 내가 시도했을 때 가장 잘 관리 할 수 ​​있었던 것은 접촉이 시작될 때 공의 속도를 기록한 다음 접촉이 끝나면 원하는 속도로 수동으로 속도를 설정하는 것이 었습니다. 공이 한 번에 한 블록 씩 만 시작하고 끝날 때 제대로 작동하지만, 경우에 따라 볼이 같은 시간 단계에서 두 개의 블록을 만질 수 있습니다. 터치 한 블록의 배열을 살펴보고, 어느 각도에서 돌 아가야하는지 예상해야합니다. 결국 나는 그저 그 일을 감추고 포기하지 않았다.

+0

공이 정확히 2 개의 직사각형을 터치 할 수 없어야합니다. 원이 정확하게 1 픽셀 정확도로 사각형의 아래쪽을 터치하고 2 개의 사각형이 같은 픽셀에 동시에 존재하지 않기 때문에 ? – dimitris93

+0

충돌이 일어 났을 때 (이전의 1 프레임) BEFOREHAND를 알고 싶습니다. 따라서 OnCollision이 아닌 OneFrameBeforeCollision 함수가 필요합니다. 어떻게 이런 식으로 구현할 수 있습니까? Body.CollisionCategories 속성 (Categorie.Cat1, Categorie.Cat2, ..., Categorie.Cat31) 중 일부가 31 개가 더 쉽게 찾고있는 것을 알고 있습니까? 나는 이것들에 대한 어떤 문서도 찾을 수 없다. 나는 그들이 무엇을하는지 또는 그들이 어떤 식 으로든 내 사건을 돕는지를 모른다. – dimitris93

+0

두 개의 블록이 서로 닿는 곳에 충돌하면 공이 동시에 두 개의 블록을 쉽게 닿을 수 있습니다. 불행히도 Box2D는 사전에 체크가 불가능합니다. 물리 엔진은 다음 시간 단계 전에 힘을 적용하고 무언가의 방향을 바꾸는 지 어떻게 알 수 있습니까? – iforce2d