0

我在 AndEngine 中开发我几乎完成了我的游戏,但不幸的是,由于我在更新循环中检查了很多 .collideswith,因此它偶尔会遇到低 fps 的问题。我现在明白这是问题所在,我一直在尝试使用 Box2d 和身体来改变它,例如理论上,这正是我需要的,但我无法掌握它!

基本上,我有 4 个数组;一个用于汽车,三个用于敌人。汽车从左到右行驶,如果它们与这些敌人中的任何一个接触,它的速度会根据情况而变化。当我加载他们的数组时,我是否必须为每辆汽车和敌人分配一个身体?然后我该如何检查?我是否运行一个 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

您不应使用任何循环来检查每种可能的碰撞组合。相反,您应该为整个 World 注册一个监听器并在您的身体上设置用户数据(例如 type = "car", "enemy")。然后在侦听器中,您只需检查哪两个对象发生了碰撞。看看这个例子:

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

于 2013-05-20T03:27:41.647 回答