【问题标题】:andEngine: Why the touch event doesn't work?andEngine:为什么触摸事件不起作用?
【发布时间】:2014-12-29 19:27:35
【问题描述】:

我正在学习如何使用 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));
}
}

我的精灵正确显示,但触摸事件不起作用。我错过了什么吗?

【问题讨论】:

    标签: java android touch andengine game-physics


    【解决方案1】:

    Kapsel 中,您从构造函数中引用this。这是因为构造函数调用了createPhysics,而后者又调用了physicsWorld.registerPhysicsConnector(new PhysicsConnector(this, body, true, true))。注意this 在传递给PhysicsConnector 构造函数时是如何被引用的。

    至少可以说,在构造函数中以这种方式引用this 并不是一个好主意。您可以阅读更多关于此主题的内容here

    我很确定这就是您遇到问题的原因。尝试重新排列代码,以免发生这种情况。您可以查看一些关于如何解决这些情况的建议here

    【讨论】:

    • 这是我怀疑的,但没有解决方法的想法。我会努力改变的
    • 好的,所以在没有太多成功之后,我从构造函数中的 createPhysics 辞职,并在初始化 Kapsel 后使用它,如 'code'Kapsel kapsel = new Kapsel(...) 然后 kapsel.createphysics(physicsworld)。但它仍然不起作用。也许问题实际上出在 onAreaTouched 方法上?
    • 看起来问题在 onAreaTouched 方法中,因为当我删除 body 时它仍然不起作用。
    【解决方案2】:

    好的,问题是在onPopulateScene() 中我没有放入pOnPopulateSceneCallback.onPopulateSceneFinished();。事实证明,即使您在 onCreateScene() 中定义了场景和精灵,仍然需要将其放入 onPopulateScene() 中。不过我会记住,我不应该把'this'放在构造函数中(即使它有效:))。

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多