0

私は現在Androidゲームを作成しており、高速衝突検出を扱っています。私は解決策を考え出しましたが、これを行うための最も好ましい方法を知りたいです。

私の解決策:フレームを30単位移動するゲームオブジェクトがある場合、別のゲームオブジェクトをまっすぐ通過する可能性があります。したがって、更新するときは、ゲームオブジェクトを1単位繰り返し、目的の速度に達するまで衝突検出を実行してから、レンダリングします。

これはゲームオブジェクトであり、プレーヤーのレーザーまたはプレーヤー自体がレーザーと衝突したかどうかをチェックします。

public void update(PlayerDroid[] holderPlayerDroid) {
            // Update the location
            //y = y + velocity;
            //stupidBadDroidPositionShape.setLocation(this.x, this.y);

            // Updates regarding interactions with the enemy out of the StupidBadDroids perspective, which is the PlayeDroid
            for(int numberOfPlayerDroid = 0; numberOfPlayerDroid < holderPlayerDroid.length; numberOfPlayerDroid++) {
                // Check if the StupidBadDroid got hit
                for(int iterations = 0; iterations < velocity; iterations++) {
                    y = y + 1;
                    stupidBadDroidPositionShape.setLocation(this.x, this.y);
                    // Check if StupidBadDroid collides with the enemy (which is the player)
                    if(Physics.shapeInShape(holderPlayerDroid[numberOfPlayerDroid].getPlayerPositionShape(), getPlayerPositionShape())) {
                        isDead = true;
                    }
                    for(int i = 0; i < holderPlayerDroid[numberOfPlayerDroid].amountOfVisibleLasers; i++) {
                        if(holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].isDisposed() == false) {
                            if(Physics.shapeInShape(holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].getLaserPositionShape(), getPlayerPositionShape())) {
                                isDead = true;
                                holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].dispose();
                            }
                        }

                    }
                }



            }

    }

この方法は非常にCPUを要求します。私が適用できるより良い解決策があると思いますか?

4

1 に答える 1

1

あなたはトンネリングについて説明しており、継続的な衝突検出を行おうとしています。ソリューションをブルート フォースしようとしているため、この方法は CPU を集中的に使用します。

忠実度が高いほど、ソリューションはより技術的になります。忠実度があまり必要ない場合は、オブジェクトが各フレームでたどるパスが直線的であると想定し、ヒットボックスを「拡張」して、フレーム中にオブジェクトが移動した距離全体をカバーすることができます。したがって、たとえば、各ポイントを一度に個別の距離だけ移動する代わりに、ポイントを単純に線分に展開して、それらが交差するかどうかを確認できます。ただし、ヒットボックスはポイントにはならないので、パスの長さだけ「引き延ばす」だけです。これは非常にローファイなソリューションです。同じオブジェクトで複数の衝突が発生した場合、「最初に」発生した衝突を常に選択するとは限りません。

非常に複雑なソリューションについては、試してください -

http://www.bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Detection_and_Physics_FAQ

于 2013-09-04T12:54:51.003 に答える