【问题标题】:Andengine coin pickup nullpointer exceptionAndengine 取币空指针异常
【发布时间】:2015-01-29 16:41:21
【问题描述】:

我是游戏开发新手,曾尝试用 AndEngine 构建赛车游戏。 当我的精灵(汽车)与硬币碰撞时,它会发出声音并消失。
我使用平铺地图编辑器来加载我的硬币对象。
平铺地图编辑器中的坐标系统,它为地图创建 xml,并且引擎 gles 2 - 锚点中心被反转。我以为 tmxExtension 会处理这种转换.. 到目前为止,我正在计算每个对象的位置并在 xml 编辑器中更改其位置以更正位置。还有其他更简单的方法吗?

这是我加载地图的代码:

private void createLevel() {
    coins = new LinkedList < Sprite > ();
    try {

        final TMXLoader tmxLoader = new TMXLoader(activity.getAssets(), engine.getTextureManager(),
        TextureOptions.BILINEAR_PREMULTIPLYALPHA, vbom);

        this.mTMXTiledMap = tmxLoader.loadFromAsset("tmx/uom_map_test2.tmx");
    } catch (final TMXLoadException e) {
        Debug.e(e);
    }

    FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f);
    Rectangle rect1 = new Rectangle(
    0,
    0,
    1,
    camera.getBoundsYMax(),
    vbom);
    Body wall1 = PhysicsFactory.createBoxBody(physicsWorld, rect1, BodyType.StaticBody, wallFixtureDef);
    wall1.setUserData(wall1);

    FixtureDef wallFixtureDef2 = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f);
    Rectangle rect2 = new Rectangle(
    1100,
    0,
    1,
    camera.getBoundsYMax(),
    vbom);
    Body wall2 = PhysicsFactory.createBoxBody(physicsWorld, rect2, BodyType.StaticBody, wallFixtureDef2);


    for (final TMXObjectGroup group: this.mTMXTiledMap.getTMXObjectGroups()) {
        for (final TMXObject object: group.getTMXObjects()) {

            if (object.getName().equals("coin")) {
                Sprite coin = new Sprite(object.getX(), object.getY(), object.getWidth(), object.getHeight(), resourcesManager.coinTextureRegion, vbom);
                FixtureDef coinFixtureDef = PhysicsFactory.createFixtureDef(0, 0.3f, 0.3f);

                Body bod = PhysicsFactory.createBoxBody(physicsWorld, coin, BodyType.DynamicBody, coinFixtureDef);
                bod.setUserData("coin");
                coins.add(coin);
                coin.setUserData(bod);

            } else if (object.getName().equals("sea")) {
                FixtureDef seaFixtureDef = PhysicsFactory.createFixtureDef(0, 0, 0f);
                Rectangle rect = new Rectangle(
                object.getX(),
                object.getY(),
                object.getWidth(),
                object.getHeight(),
                vbom);

                Body bod = PhysicsFactory.createBoxBody(physicsWorld, rect, BodyType.DynamicBody, seaFixtureDef);
                bod.setUserData("sea");

            }


        }

    }

    /*for(TMXLayer layer : this.mTMXTiledMap.getTMXLayers()){
           layer.detachSelf();
           layer.setPosition(0,0);
           attachChild(layer);*/

    for (int layerID = 0; layerID < this.mTMXTiledMap.getTMXLayers().size(); layerID++) {
        this.mTMXTiledMap.getTMXLayers().get(layerID).detachSelf();
        attachChild(this.mTMXTiledMap.getTMXLayers().get(layerID));

        //       layer0:sea              layer1:grass               layer2:road

        for (int i = 0; i < coins.size(); i++) {
            this.attachChild(coins.get(i));
        }

        camera.setBounds(0, 0, mTMXTiledMap.getWidth(), mTMXTiledMap.getHeight());
        camera.setBoundsEnabled(true);



    }
}

另外,我使用联系监听器来管理硬币碰撞

public void beginContact(Contact contact) {
    Body a = null, b = null;
    // TODO Auto-generated method stub
    try {
        a = contact.getFixtureA().getBody();
        b = contact.getFixtureB().getBody();
    } catch (NullPointerException n) {
        //do nothing
    }

    if (a != null && b != null) {

        if (a.getUserData() != null && b.getUserData() != null) {
            if (a.getUserData().equals("player") && b.getUserData().equals("coin") || b.getUserData().equals("player") && a.getUserData().equals("coin")) {

                if (a.getUserData().equals("coin")) {
                    removeCoins(a);
                    resourcesManager.coinCollect.play();
                    addToScore(10);
                    showLevelCleared();
                } else if (b.getUserData().equals("coin")) {
                    removeCoins(b);
                    resourcesManager.coinCollect.play();
                    addToScore(5);
                }
            }
        }
    } 
}

然而,并非所有硬币的碰撞都被检测到。我得到一个空指针异常,这就是我包含一个捕获的原因。
这有什么原因吗?

【问题讨论】:

  • 能否请您加入 logcat?
  • tim687:对于硬币检测,我更改了代码,而不是创建身体并在与玩家发生碰撞时移除身体,我使用计时器处理程序并检查与 player.collideswith(coin) 的碰撞,它完美运行.. 但是,我仍然找不到更简单的 GLes 2 锚中心坐标转换解决方案。

标签: android andengine


【解决方案1】:

我建议不要创建单独的计时器处理程序来检查冲突,而是在 onManagedUpdate 中执行所有这些操作

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多