まず第一に、私は自分のゲームロジックを短期間しか書いていないので、これが率直に思えるかもしれないことをおizeびします。
私は四分木とグリッドベースの衝突検出についてたくさん読んできました。私はロジックを理解しています-基本的にオブジェクトが近くにない限り、衝突をチェックしないでください。しかし、実際にこれをどのように実行するかについては言及されていません。
私は私の頭の中にいくつかの可能な方法を持っていますが、どれがベストかわからない
一般的な衝突テスト-最適化なし
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
近隣を保存する(方法1) しかし、衝突を最適化して近くのオブジェクトのみをチェックする場合はどうでしょう。それでもすべてのオブジェクトを実行しますか、それともチェックするオブジェクトの近くに配列を作成しますか?
var objects:Array = new Array();
var neighbours:Array = new Array();
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
neighbours.push(objectA, objectB);
}
}
}
//somewhere else
for(i:int = 0; i < neighbours.length; i++){
//only check neighbours
for(j:int = i + 1; j < neighbours.length; j++){
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
すべてのオブジェクトをループしますが、コリジョンの隣人だけをチェックします(方法3) もう1つの可能性は、衝突をテストする前にオブジェクトが近くにあるかどうかをチェックしながらすべてをループすることです。
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
//they are near - check collision!
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
}
オブジェクトをタイルデータに保存する(方法3) タイルベースのシステムを使用すると、別のオプションを使用できます。特定のタイルにあるオブジェクトをタイルデータ自体に保存します。オブジェクトがどのタイル上にあるかを確認するには、周囲のタイルが衝突する可能性のあるオブジェクトを含んでいます:
var ObjectA;
for(var i:int = 0; i < 4; i ++){
//check 4 surrounding tiles from object A
if(Object.currentTile + surroundingTile[i] CONTAINS collidable object){
//check collision!
if(objectA.collidesWith(surroundingTile.object){
//handle collision logic
}
}
}
私はいつも実世界を例として見ようとしています。同じ色のアイテムを比較したい場合、色が一致していなくてもすべてのアイテムをチェックするのは非論理的なようです(方法2、各アイテムをチェックします)。すべてをチェックするのではなく、おそらく同じ色のアイテム(互いに近くにあるオブジェクト)を収集し、それらをチェックします(方法1)。
衝突チェックの項目は常に移動しているため、順序が混同されるため、これは適切な比較ではありません。それは私を混乱させるものです。
各アイテムをチェックする方が効率的で、近隣の配列を生成し続ける負担を取り除きますか?
それとも、衝突をチェックするためにそれほど多くのオブジェクトをループする必要がないように、隣人を見つける方が効率的ですか?
各タイルのデータを変更し続けることも非常に集中的に思えるので、それが良いアイデアかどうかはわかりません。
射撃前にオブジェクトが範囲内にある場合、タワーがオブジェクトを検出する必要があるタワー防衛ゲームを考えてきました。また、すべてのアイテムをチェックするのはばかげているように見えますが、時には近くにオブジェクトがまったくないこともあります。
長い投稿をおaびします。いつも自分自身の説明に苦労しています!