我正在学习如何使用box2d和andEngine。我试图让我的精灵与身体移动。我在onCreateScene中编写了所有内容之前就已经工作了,但现在我想为我的精灵创建一个单独的类。所以现在我的onCreateScene看起来像这样:
mScene = new Scene();
mScene.registerUpdateHandler(physicsWorld);
Kapsel kapselBialy = new Kapsel(100, 100, 100, 100, ResourceManager.getInstance().mBialyKapselRegion, getVertexBufferObjectManager(), physicsWorld);
mScene.registerTouchArea(kapselBialy);
mScene.setTouchAreaBindingOnActionDownEnabled(true);
mScene.attachChild(kapselBialy);
pOnCreateSceneCallback.onCreateSceneFinished(mScene);
我的Kapsel课程看起来像这样:
public class Kapsel extends Sprite {
private Body body;
public Kapsel(float pX, float pY, float pWidth, float pHeight,
ITextureRegion pTextureRegion,
VertexBufferObjectManager pVertexBufferObjectManager, PhysicsWorld physicsWorld) {
super(pX, pY, pWidth, pHeight, pTextureRegion, pVertexBufferObjectManager);
createPhysics(physicsWorld);
}
//definiowanie zahchowań po dotyku
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY){
if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP){
body.setLinearVelocity(-((pSceneTouchEvent.getX()/32 - body.getPosition().x) * 10), -((pSceneTouchEvent.getY()/32 - body.getPosition().y) * 10));
}
return true;
}
//Tworzenie ciała i fizyki dla kapsla
private void createPhysics(PhysicsWorld physicsWorld){
body = PhysicsFactory.createCircleBody(physicsWorld, this, BodyType.DynamicBody, PhysicsFactory.createFixtureDef(1.0f, 0.5f, 0.5f));
physicsWorld.registerPhysicsConnector(new PhysicsConnector(this, body, true, true));
}
}
我的精灵正确显示,但触摸事件不起作用。我错过了什么吗?
答案 0 :(得分:1)
在Kapsel
中,您正在构造函数中引用this
。这是因为构造函数调用createPhysics
,而physicsWorld.registerPhysicsConnector(new PhysicsConnector(this, body, true, true))
又调用this
。请注意PhysicsConnector
在传递给this
构造函数时的引用方式。
至少可以说,在构造函数中以这种方式引用{{1}}并不是一个好主意。您可以阅读有关此主题的更多信息here。
我很确定这就是你遇到问题的原因。尝试重新排列代码,以免发生。您可以查看有关如何解决这些情况的一些建议here。
答案 1 :(得分:0)
好的问题是onPopulateScene()
我没有放pOnPopulateSceneCallback.onPopulateSceneFinished();
。事实证明,即使您在onCreateScene()中定义场景和精灵,仍然需要将它放在onPopulateScene()中。我仍然会记住,我不应该把这个'在构造函数中(即使它工作:))。