【问题标题】:In AndEngine, manipulating a body always returns a NullPointerException在 AndEngine 中,操作一个 body 总是返回一个 NullPointerException
【发布时间】:2012-11-07 22:20:35
【问题描述】:

我从 AndEngine (GLES2) 开始,我正在尝试制作一个简单的桨式 Sprite,并且在使用 TouchScreen 时它连接的身体会移动。但是,无论我如何调整代码,当我尝试对相关主体进行调用时,它总是返回 NullPointerException,无论调用是什么。

这是我创建 Paddle 的代码:

// Create the Paddle, body for said paddle, and register with the PhysicsWorld
    final FixtureDef objectFixtureDef = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);    
    paddleSprite = new Paddle(mPaddle, getVertexBufferObjectManager());
    Body paddleBody = PhysicsFactory.createBoxBody(mPhysicsWorld, paddleSprite, BodyType.DynamicBody, objectFixtureDef);
    mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(paddleSprite, paddleBody, true, false));
    paddleBody.setUserData("Paddle");

// .... other Code for initializing sprites ..... //
    mScene.attachChild(paddleSprite);
    mScene.registerTouchArea(paddleSprite);
    mScene.setTouchAreaBindingOnActionDownEnabled(true);


// Method for TouchScreenInteraction
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
    if(this.mPhysicsWorld != null){
    paddleBody.setTransform(new Vector2((pSceneTouchEvent.getX() - paddleSprite.getWidth() / 2)/PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT,
            (pSceneTouchEvent.getY() - paddleSprite.getHeight() / 2)/PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT),
            0);
    return true;
    }
return false;
}

paddleSprite、paddleBody 和physicsWorld 是全局对象,因此访问不是问题。

NullPointerException 在我触摸屏幕的那一刻发生。如果我删除了有问题的函数调用,它会起作用,因为在稍微触摸它之后偶尔会破坏游戏。除了这个问题,Box2D 引擎运行平稳,另一个动态对象(一个小球)与桨的交互也很好。

如果无法从中确定问题,我可以发布其余代码,但我已经坚持了一周,非常感谢一些帮助,以便我可以真正开始项目。

非常感谢您!

【问题讨论】:

  • 你能提供所有代码吗?您正在实现 Interface Scene.IOnSceneTouchListener,我认为您应该使用 @Override

标签: android opengl-es-2.0 box2d andengine


【解决方案1】:

这行是你的问题。您正在创建一个新的本地范围paddleBody

Body paddleBody = PhysicsFactory.createBoxBody(...);

当您尝试将它用于触摸事件时,您使用的类级别 paddleBody 可能根本没有被初始化。只需从违规行中删除 Body 即可避免创建新对象:

paddleBody = PhysicsFactory.createBoxBody(...);

【讨论】:

  • 哦,哇!我没听清楚,我完全忘记了如果你不小心的话,在 Java 中重新定义范围非常容易。我很欣赏这额外的眼睛,现在我可以毫无问题地重新使用 box2d。谢谢!
【解决方案2】:

paddleBody 是您方法中的局部变量。使其全球化。

【讨论】:

    猜你喜欢
    • 2013-06-29
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2021-12-27
    相关资源
    最近更新 更多