0

AndEngine で開発しています。ゲームはほぼ完成していますが、更新ループで .collideswith を何度もチェックしているため、残念ながら fps が低下することがあります。これが問題であることを理解しました.Box2dを使用してボディなどを変更しようとしましたが、理論的にはこれがまさに必要ですが、それを理解することはできません!

基本的に、4 つの配列があります。車用に 1 つ、敵用に 3 つ。車は左から右に走行し、これらの敵に接触すると速度が変化します。アレイをロードするときに、車と敵のそれぞれにボディを割り当てる必要がありますか? そして、どうやって確認するのですか?for ループを実行してから、'isBodyContacted(carBody, iceBergBody);' を実行しますか? 更新された外観で?それは少し混乱しています!

参考までに、私の車をロードします。

private void loadCar() {
            for (int i = 0; i < rManager.getInstance().carArray.length; i++) {
                    rManager.getInstance().carArray[i] = new Car(new Sprite(
                                    rManager.getInstance().spawnPoint[i].getSpawnPos().x,
                                    rManager.getInstance().spawnPoint[i].getSpawnPos().y,
                                    rManager.getInstance().car_region,
                                    engine.getVertexBufferObjectManager()) {
                            @Override
                            public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
                                            final float pTouchAreaLocalX,
                                            final float pTouchAreaLocalY) {

                                    if (pSceneTouchEvent.isActionMove()
                                                    && GameManager.getInstance().getDebugMode() == true) {
                                            this.setPosition(pSceneTouchEvent.getX(),
                                                            pSceneTouchEvent.getY());
                                    }
                                    return true;
                            }
                    });
            }

            for (int i = 0; i < rManager.getInstance().carArray.length; i++) {
                    rManager.getInstance().carArray[i].getCarSprite().setScale(0.5f);
                    rManager.getInstance().carArray[i].getCarSprite().setAnchorCenter(
                                    0, 0);
                    colourX = (randNumber(2, 9));
                    colourY = (randNumber(2, 9));
                    colourZ = (randNumber(2, 9));
                    colourX /= 10;
                    colourY /= 10;
                    colourZ /= 10;
                    rManager.getInstance().carArray[i].getCarSprite().setColor(colourZ,
                                    colourY, colourZ);
                    attachChild(rManager.getInstance().carArray[i].getCarSprite());
                    this.registerTouchArea(rManager.getInstance().carArray[i]
                                    .getCarSprite());
                    this.setTouchAreaBindingOnActionDownEnabled(true);
            }
    }

敵をロード中..

void loadIceBerg() {
            for (int i = 0; i < rManager.getInstance().iceBergArray.length; i++) {
                    rManager.getInstance().iceBergArray[i] = new IceBergEnemy(
                                    new Sprite(randNumber(200, 700), randNumber(0, 480),
                                                    rManager.getInstance().iceBerg_region,
                                                    engine.getVertexBufferObjectManager()) {
                                            @Override
                                            public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
                                                    this.setPosition(pSceneTouchEvent.getX(), pSceneTouchEvent.getY());
                                                    if (this.getY() > rManager.getInstance().camera.getHeight() - (this.getHeight() / 2) || this.getY() < 0 + (this.getHeight() / 2))
                                                    {
                                                            this.setPosition(200 - (pDifficultyLevel * 20),
                                                                            -100);
                                                                                                                            showScore(50, " ice berg!");
                                                            this.setVisible(false);

                                                    }      

                                                    if(pSceneTouchEvent.isActionUp())
                                                    {
                                                            updateScore(50);
                                                            GameManager.getInstance().updateTotalIceBergEnemiesKilled();

                                                    }



                                                    return true;
                                            }
                                    });

                    rManager.getInstance().iceBergArray[i].getIceBergSprite()
                                    .setPosition(
                                                    rManager.getInstance().iceBergArray[i]
                                                                    .getIceBergSprite().getX(),
                                                    rManager.getInstance().iceBergArray[i]
                                                                    .getIceBergSprite().getY());
                    rManager.getInstance().iceBergArray[i].getIceBergSprite().setScale(
                                    0.8f);
                    this.registerTouchArea(rManager.getInstance().iceBergArray[i]
                                    .getIceBergSprite());
                    this.setTouchAreaBindingOnActionDownEnabled(true);

                    attachChild(rManager.getInstance().iceBergArray[i]
                                    .getIceBergSprite());
            }
    }

何か衝突!

else if (rManager.getInstance().iceBergArray[2]
                                                    .getIceBergSprite().collidesWith(
                                                                    rManager.getInstance().carArray[r]
                                                                                    .getCarSprite())) {
                                            rManager.getInstance().carArray[r].setCarSpeed(0f);
                                    }

                                    else if (rManager.getInstance().iceBergArray[3]
                                                    .getIceBergSprite().collidesWith(
                                                                    rManager.getInstance().carArray[r]
                                                                                    .getCarSprite())) {
                                            rManager.getInstance().carArray[r].setCarSpeed(0f);
                                    }

                                    else if (rManager.getInstance().iceBergArray[4]
                                                    .getIceBergSprite().collidesWith(
                                                                    rManager.getInstance().carArray[r]
                                                                                    .getCarSprite())) {
                                            rManager.getInstance().carArray[r].setCarSpeed(0f);
                                    }

                                    else if (rManager.getInstance().iceBergArray[5]
                                                    .getIceBergSprite().collidesWith(
                                                                    rManager.getInstance().carArray[r]
                                                                                    .getCarSprite())) {
                                            rManager.getInstance().carArray[r].setCarSpeed(0f);
                                    }

多くのチュートリアルを見つけましたが、オブジェクトの配列を参照しているようには見えません。まさに私が必要としているものです。誰かが私を助けたり、何らかの簡単なチュートリアルを提供したりできれば、それは大歓迎です。ありがとう!!

4

1 に答える 1

0

衝突の可能性のある各組み合わせをチェックするためにループを使用しないでください。代わりに、ワールド全体のリスナーを登録し、ボディにユーザー データを設定する必要があります (例: type = "car", "enemy")。次に、リスナーで、どの 2 つのオブジェクトが衝突したかを確認します。この例をチェックしてください:

http://www.andengine.org/forums/gles2/collision-events-t7140.html#p31300

于 2013-05-20T03:27:41.647 に答える