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