0

AndEngine/Box2Dを使用してゲームを作成しています。ゲームが読み込まれると、スプライトとボディを含むクラスの配列が作成されます。ユーザーが画面に触れると、次のスプライトが順番にシーンにアタッチされ、そのボディがアクティブに設定されます。スプライト/ボディは後で破棄できます。これを行うには、スプライトを切り離し、ボディを非アクティブに設定します。ただし、その時点で、シーンはタッチを登録しなくなります。スプライト/ボディをパスにドラッグすると、停止します。ただし、シーン上の他のボディはそれと相互作用しません。これは、タッチエラーと関係があると私に信じさせます。これが私のコードです:

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;
    }

そして、必要に応じてcreateFiller:

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 に答える