2016-07-21 7 views
1

저는 작업중인 게임에 대한 충돌 감지 시스템을 작성했으며 때로는 발사체가 레벨 전체에 흩어져있는 플레이어 나 벽을 통과하는 이상한 글리치를 경험하고 있습니다. 발사체는 어느 각도에서나 발사 될 수 있으므로 각 발사체의 경계 상자를 여러 개의 작은 경계 상자로 분해 한 다음 우주에서 발사체의 회전에 따라 텍스처의 중심을 중심으로 회전합니다. 어떤 이유로, 스피어 발사체가 플레이어 나 벽을 통과 할 때가 있습니다.다른 엔티티를 지나가는 투사도

는 I는 텍스처의 회전을 결정하고 바운딩 박스를 번역하기 위해 다음 방법을 사용

 public double RotateToFaceTarget() 
    { 
     double rotation = Math.Atan2((double)_direction.Y, (double)_direction.X); 
     return rotation; 
    } 
    public List<BoundingBox> TranslateBoundingBox(List<BoundingBox> box, double rotation) 
    { 
     List<BoundingBox> newBounds = new List<BoundingBox>(); 
     foreach (BoundingBox b in box) 
     { 
      Vector2 boundsOrigin = new Vector2(b.Pos.X + b.Size.X/2, b.Pos.Y + b.Size.Y/2); 
      Vector2 texOrigin = new Vector2(_pos.X + _texture.Width/2, _pos.Y + _texture.Height/2); 

      Vector2 newPosBasedOnOrigin = Vector2.Transform(boundsOrigin - texOrigin, Matrix.CreateRotationZ((float)rotation)) + boundsOrigin; 

      newBounds.Add(new BoundingBox(newPosBasedOnOrigin, b.Size)); 
     } 
     return newBounds; 
    } 

_direction은 대상 위치 및 정규화의 발사체의 위치를 ​​감산함으로써 계산된다. 나는 발사체가 다른 개체와 충돌하는지 확인하기 위해이 방법을 사용하십시오

 public bool ProjectileCollision(Entity e, Projectile entity2) 
    { 
     if (entity2.CanCollide) 
     { 
      foreach(GameObject.BoundingBox b in entity2.BoundingBox) 
      { 
       foreach(GameObject.BoundingBox b2 in e.BoundingBox) 
       { 
        if (b2.Intersect(b) && (entity2.IgnoredEntities.Contains(e.Type) == false)) 
        { 
         entity2.IsActive = false; 
         e.Health -= entity2.Damage; 
         return true; 
        } 
        return false; 
       } 
      } 
      return false; 
     } 
     return false; 
    } 

그리고 이것은 내 경계 상자 교차로 방법입니다 :

 public bool Intersect(BoundingBox intersected) 
    { 
     if ((_pos.Y < intersected.Pos.Y + intersected.Size.Y) && (_pos.Y + _size.Y > intersected.Pos.Y) && (_pos.X + _size.X > intersected.Pos.X) && (_pos.X < intersected.Pos.X + intersected.Size.X)) 
     { return true; } 
     return false; 
    } 

편집 : 추가 시험에서이 발사체 것으로 보인다 플레이어가 왼쪽 상단 모서리를 기준으로 히트하면 항상 히트를 감지합니다 (이제 교차 코드를 보았습니다). Intersect 메서드를 다시 작성하여 왼쪽 위 모서리보다 정확한 것을 사용하는 또 다른 방법이 있습니까?

EDIT2

: 나는 특정 개체에 대한 hitboxes을 그린, 이것은 내가 창은 플레이어를 통해 갈 잡을 때의 한 예입니다 :

http://imgur.com/a/fAxZw

플레이어가 큰 분홍색 광장입니다. 히트 박스가 올바르게 번역되지는 않지만 일부는 작동하지 않으며 다른 일부는 작동하지 않아야합니다.

+0

가끔 이런 일이 일어났습니다. 발사체의 속도가 표적의 폭보다 큰가요? 그렇다면 업데이트 루프 중에 건너 뛸 수 있습니다. – Ares

+0

플레이어의 히트 박스는 32x32이고 발사체의 속도는 최대 15입니다. – Charsmud

+0

15 픽셀을 점프하면 합법적 인 히트를 건너 뛸 수있는 몇 가지 경우를 생각할 수 있습니다. 때로는 발생합니다. 나의 즉각적인 생각은 비교되는 두 가지가 대략 서로 가깝다면 이전 위치와 새로운 위치의 몇 개의 조각 (예를 들어, 10)으로 검사 할 위치를 분리하는 것이다. 그런 다음 발사체가 – Ares

답변

0

높은 속도와 작은 물체 때문에 발사체가 물체를 통과 할 수 있습니다. 오브젝트가 교차하는지 점검하는 것 외에도 오브젝트 과 교차하는지 점검하여 오브젝트가 화재 발생 라인에 있는지 점검해야합니다. 당신은 레이 캐스팅으로 이것을 달성 할 수 있습니다.

당신의 경우 나는 다른 기능이 있는지 확인하는 기능이 있습니다. 객체가 다른 객체의 반경 내에 있는지 여부를 간단하게 검사합니다. 그렇다면 나는 물체가 다른 물체쪽으로 날아가는 지 확인하고 물체 사이의 거리를 확인했다. 거리가 정말로 가까울 때 충돌이 일어났습니다.