衝突検出がよりeffecient作ります。私はかなり経験の浅いプログラマは、現在のC#を学習し、一般的にはゲームデザインを学ぶためにしようとしている(C#のXNA)
私はMicrosoftのXNAフレームワークを使用して、Galaga-esque Scrolling Shooterゲームを構築しています。私はいくつかの悪い設計上の選択を行う、見掛け倒しのOOPの構造に苦労しているいくつかのラフな裁判の後、私は最終的にエンジンの立派なスタートを作ってみました。
現在、私は、競合の検出をゲームに遅れないようにすることに問題があります。私の現在のエンジンは、リストオブジェクト内のすべてのアクティブなゲームオブジェクトを保持し、各オブジェクトを衝突しているかどうかをチェックします。言うまでもなく、それはずっと良いかもしれません。
ここで私の衝突チェックは、ObjectHandlerクラスで行われます。
public override void Update(GameTime gameTime)
{
...
//Handle collisions
foreach (GameObject obj in Objects)
{
ICollideable e = obj as ICollideable;
//Check if the object implements ICollideable
if (e != null)
{
//Check collision with each other object
foreach (GameObject obj2 in Objects)
{
//Check if the second object implements ICollideable
ICollideable e2 = obj2 as ICollideable;
//check if they are in the same sector
if (e2 != null && SameSector(e.Sector,e2.Sector))
{
//Check if the collision masks interesect
//if so call each object's collision event
if (e.Mask.Intersects(e2.Mask))
{
e.CollisionEvent(e2);
e2.CollisionEvent(e);
}
}
}
}
}
...
}
ここにはSameSector関数があります。
private bool SameSector(Point p1, Point p2)
{
if (Math.Abs(p1.X-p2.X)<=1 && Math.Abs(p1.Y-p2.Y)<=1)
return true;
else
return false;
}
「マスク」は、XNAフレームワークの一部であるRectangleオブジェクトです。あなたが見ることができるように私はそれがで広場の各オブジェクトのセット60x60空間分割システム、のようなものを実装しました。しかし、私はそれがかどうかを確認するために同じくらいの時間がかかると私は便利な何かをやったことは本当にわからないんだけど2つのオブジェクトは、衝突しているかどうかをチェックするのと同じセクタ(または隣接するセクタ)にあります。
私はこれに似た質問を既に投稿しましたが、私の質問にはそれほど満足できませんでした。それから私は時間管理システムが有用であることを集めました。私は最終的にそれを実装しようとするでしょうが、私はプログラミングにまだかなり新しいんだと、私はより高度な設計掘り下げる前に、自分自身をチェックし、衝突を最適化したいと思います。
私の現在の衝突チェックを効果的に最適化する方法はありますか?