0

我正在使用 AndEngine/Box2D 创建游戏。当游戏加载时,会创建一个包含精灵和身体的类的数组。当用户触摸屏幕时,按顺序排列的下一个精灵被附加到场景中,并且它的身体被设置为活动状态。sprite/body 可以稍后被销毁。为此,我分离精灵并将身体设置为非活动状态。但是,此时,场景不再记录触摸。将精灵/身体拖入路径时,它会停止。但是,场景中的其他物体不会与之交互。这让我相信它与触摸错误有关。这是我的代码:

private void destroyFiller(){ //Deletes filler
    if(filler[fillerNum].active){
        filler[fillerNum].active=false;
        mPhysicsWorld.unregisterPhysicsConnector(mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(filler[fillerNum].sprite));
        filler[fillerNum].body.setUserData("destroy");
        scene.detachChild(filler[fillerNum].sprite);
        fillerCount--;
        fillersLeftText.setText("Balls left: "+Integer.toString(fillerCount));

        if(fillerCount==0)
            gameOver();
    }
}

并将身体设置为非活动状态

scene.registerUpdateHandler(new IUpdateHandler() {

            @Override
            public void reset() {         
            }

            @Override
            public void onUpdate(float pSecondsElapsed) {
                if(fillerNum>-1){
                    if(filler[fillerNum].body.getUserData().equals("destroy")){ //"Destroys" the body which can only be done on an update
                        filler[fillerNum].body.setActive(false);
                        filler[fillerNum].body.setUserData("destroyed");
                        if(soundOn)
                            popSound.play();
                    }

这是场景触摸事件:

public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
         if(this.mPhysicsWorld != null && mEngine != null) {
                if(pSceneTouchEvent.isActionDown()) {
                    Log.e("SceneTouchEvent","Touch"); //This line doesn't execute when touching a body that passed through destroyFiller
                    createFiller(pSceneTouchEvent.getX(), pSceneTouchEvent.getY());
                    return true;
                }
            }
        return false;
    }

如果需要,还可以创建Filler:

private void createFiller(float x, float y) {
        fillerNum++;
        filler[fillerNum].active=true;
        filler[fillerNum].sprite.setPosition(x-fillerTR.getWidth()/2,y - fillerTR.getHeight()/2);
        scene.registerTouchArea(filler[fillerNum].sprite);
        filler[fillerNum].body.setUserData("fill");
        filler[fillerNum].body.setActive(true);
        mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(filler[fillerNum].sprite, filler[fillerNum].body, true, true));
        scene.attachChild(filler[fillerNum].sprite);
    }
4

1 回答 1

0

尝试在删除方法中使用 unregisterTouchArea

也尝试在 onUpdateThread 中使用它

于 2012-07-18T10:59:08.883 回答