저는 작업중인 게임에 대한 충돌 감지 시스템을 작성했으며 때로는 발사체가 레벨 전체에 흩어져있는 플레이어 나 벽을 통과하는 이상한 글리치를 경험하고 있습니다. 발사체는 어느 각도에서나 발사 될 수 있으므로 각 발사체의 경계 상자를 여러 개의 작은 경계 상자로 분해 한 다음 우주에서 발사체의 회전에 따라 텍스처의 중심을 중심으로 회전합니다. 어떤 이유로, 스피어 발사체가 플레이어 나 벽을 통과 할 때가 있습니다.다른 엔티티를 지나가는 투사도
는 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을 그린, 이것은 내가 창은 플레이어를 통해 갈 잡을 때의 한 예입니다 :플레이어가 큰 분홍색 광장입니다. 히트 박스가 올바르게 번역되지는 않지만 일부는 작동하지 않으며 다른 일부는 작동하지 않아야합니다.
가끔 이런 일이 일어났습니다. 발사체의 속도가 표적의 폭보다 큰가요? 그렇다면 업데이트 루프 중에 건너 뛸 수 있습니다. – Ares
플레이어의 히트 박스는 32x32이고 발사체의 속도는 최대 15입니다. – Charsmud
15 픽셀을 점프하면 합법적 인 히트를 건너 뛸 수있는 몇 가지 경우를 생각할 수 있습니다. 때로는 발생합니다. 나의 즉각적인 생각은 비교되는 두 가지가 대략 서로 가깝다면 이전 위치와 새로운 위치의 몇 개의 조각 (예를 들어, 10)으로 검사 할 위치를 분리하는 것이다. 그런 다음 발사체가 – Ares