2016-06-02 3 views
1

잠재적 인 충돌을 판별하기 위해 쿼드 트리를 사용하는 Monogame/C# 프로젝트에서 작업 충돌 시스템을 사용하고 그에 따라 테스트합니다. 내 문제는 충돌이 이전 프레임에 있는지 여부에 따라 OnCollisionEnter() 또는 OnCollisionStay() 중 하나와 충돌 한 개체에 메서드를 보낼 수있게하려는 것입니다. 다음 코드에서 Monogame/C# - 이전 프레임에 충돌이 있었는지 확인

은 OnCollisionEnter()가 호출되지 않습니다 :

public class Collision : iSystem 
{ 
    private List<Entity> currentCollisions; // Collisions occurring in the current frame 
    private List<Entity> previousCollisions; // Collisions from the previous frame 

    public override void Initialize(Entity caller) 
    { 
     currentCollisions = new List<Entity>(); 
     previousCollisions = new List<Entity>(); 
     base.Initialize(caller); 
     hasInitialized = true; 
    } 

    public override void Update(GameTime gameTime) 
    { 
     List<Entity> nearby = Global.QuadTree.GetNeighbours(parent); 

     for (int i = 0; i < nearby.Count; i++) 
     { 
      if (nearby[i] != parent) 
       if (parent.Collider.Intersects(nearby[i].Collider)) 
       { 
        currentCollisions.Add(nearby[i]); 
        AlertEntity(nearby[i]); 
       } 
     } 


     previousCollisions = currentCollisions; // Ready for the next frame 
     currentCollisions.Clear(); 
     base.Update(gameTime); 
    } 

    public void AlertEntity(Entity entity) 
    { 
     if (previousCollisions.Contains(entity)) 
      parent.OnCollisionStay(entity.Collider); 
     else 
      parent.OnCollisionEnter(entity.Collider); // This is never called 
    } 
} 

그 이유를 제시 할 수 있다면

('부모'구성 요소 '충돌'이 부착되어있는 기업을 말한다) 이 일이 일어나고 있습니다, 나는 감사 할 것입니다. 감사합니다

+1

현재 충돌을 이전 충돌로 설정하기 전에 제거해야합니까? 나는 비슷한 것을 할 것이다 'previousCollisions = currentCollisions; //하지 빈 now' 설정 'currentCollisions는 = 새로운 목록 (); ' 지우기 currentCollisions도 명확 previousCollisions 그들이 내 실제 코드에서 그들에게 같은 목록 개체 – Danny

+0

를 참조하는 것이기 때문에,'currentCollisions.Clear는()'이후 'previousCollisions = currentCollisions'입니다. 그것을 가르쳐 주셔서 고마워요 : ( 당신이 제안한 것! 나는 그들이 동일한 객체를 참조했다는 것을 몰랐습니다. 결코 저에게 문제가되지 않았습니다. 감사합니다! @Danny –

+0

그러면 else 브랜치가 _always_ 히트처럼 보입니다. 왜냐하면'previousCollisions'는 항상 비어있을 것이기 때문에'currentCollisions.Clear()'를 호출하면 그것들이 모두 같은 List 객체를 참조하기 때문에'previousCollisions'도 지울 것입니다. 'new List ()'. 당신의 술어가 실제 코드에서 올바르게 설정되었는지 확인합니다. 편집 : 편집 된 답변을 보았습니다. 나는 그것을 실제 답변에 넣을 것입니다. – Danny

답변

1

currentCollisions.Clear()을 호출해도 모두 List 개체를 참조하기 때문에 previousCollisions이 모두 지워집니다. currentCollisions.Clear()을 호출하는 대신 new List<Entity>()으로 설정해야합니다.

// . . . 

previousCollisions = currentCollisions; // Ready for the next frame 
currentCollisions = new List<Entity>(); // Now both lists are not clear 
base.Update(gameTime); 
관련 문제