私は、私が作業しているゲームの衝突検出システムを作成しました。そして、時々、発射物がレベル全体に散らばったプレーヤーや壁を通過する奇妙な不具合を経験しています。発射体はどの角度でも発射することができるので、各発射体の境界ボックスを複数のより小さなバウンディングボックスに分解し、空間内の発射体の回転に従ってテクスチャの中心を中心に回転させます。なんらかの理由で、時には槍の発射体がプレーヤーや壁を通過することもあります。他のエンティティを通過する砲弾
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;
}
EDIT:さらにテストでは、それは発射がするようですプレーヤーが左上隅に基づいてヒットした場合、常にヒットを検出します(これは、私の交差コードを見ると意味があります)。 Intersectメソッドを書き直して、左上隅よりも正確なものを使用する別の方法がありますか?
EDIT2:私は、特定のオブジェクトのためのhitboxesを描いた、これは私が選手を通過槍をキャッチする際の1つのインスタンスである:
プレイヤーは大きなピンクの正方形です。ヒットボックスは正しく翻訳されていませんが、他の人ではなく一部の人で作業を止めてはいけません。
これは時々私に起こった。発射体の速度は標的の幅よりも大きいか?そうであれば、更新ループ中に「スキップオーバー」する可能性があります。 – Ares
プレイヤーのヒットボックスは32x32で、発射体の速度は最大15です。 – Charsmud
15ピクセルを飛ばして正当なヒットをスキップしてしまうだけの理由が考えられます時々発生する。私が直ちに考えているのは、比較される2つの事柄がおおよそ互いに近い場合、チェックされている位置を古い位置と新しい位置のいくつかのスライス(たとえば10)に分割することです。次に発射体が – Ares