【问题标题】:Bodies not creating correct andengine没有创建正确的和引擎的机构
【发布时间】:2013-09-25 11:36:51
【问题描述】:

我正在使用我的物理世界、ContactListener,或者只是我创建的实体。

我的问题是我可以创建一个身体/精灵。身体和精灵被正确绘制,玩家无法穿过它们,但碰撞对它们不起作用。我有一个方法有这个问题,所以为了测试这个问题,当玩家射箭时,我创建了一个这样的身体:

    Sprite testSprite = new Sprite(player.getX() + 100, player.getY() + 100,
            resourcesManager.wall_region, vbom);
    Body testBody = PhysicsFactory.createBoxBody(physicsWorld, testSprite,
            BodyType.DynamicBody, PhysicsFactory.createFixtureDef(0, 0, 0));
    attachChild(testSprite);
    physicsWorld.registerPhysicsConnector(new PhysicsConnector(testSprite, testBody));
    testBody.setUserData(new UserData("Tile", testSprite, 100, testBody));
    System.out.println(testBody);

这些身体/精灵创造得很好,我无法穿过它们。但是这些测试体和箭头之间的接触并不能正常工作。

这是我的 ContactListener 中的碰撞,当箭头和瓷砖碰撞时应该发生:

 if (((boolean) ((UserData) x1.getBody().getUserData())
                        .getType().equals("Tile"))
                        && ((boolean) ((UserData) x2.getBody()
                                .getUserData()).getType().equals("arrow"))) {
                    System.out.println("Tile/Arrow");
                    engine.runOnUpdateThread(new Runnable() {
                        @Override
                        public void run() {
                            x2.getBody().setActive(false);
                            final Sprite sprite = (Sprite) ((UserData) x2
                                    .getBody().getUserData()).getSprite();
                            detachChild(sprite);
                            final PhysicsConnector physicsConnector = physicsWorld
                                    .getPhysicsConnectorManager()
                                    .findPhysicsConnectorByShape(sprite);
                            physicsWorld
                                    .unregisterPhysicsConnector(physicsConnector);

                        }
                    });
                }

但奇怪的是,这种碰撞需要一段时间才能注册。例如,我可以向 testBody 射 10 支箭,它们会弹开,但是当我射出第 11 支时,就会发生上述碰撞。

建议?我一直在处理这个问题很长一段时间,它变得非常令人沮丧,如果需要,我很乐意提供更多信息。谢谢。

【问题讨论】:

    标签: java android box2d andengine


    【解决方案1】:

    在我看来,我看到了很多错误。

    首先,您要创建具有固定属性(如 (0,0,0))的主体。 那么这段代码创建了什么样的主体我无法理解!

    首先使这件事正确并根据要求应用适当的值。

    如果您的假设是要销毁 body,那么为此编写代码意味着不要使用 active 方法。

    你必须在线程中编写销毁代码,以便它独立执行。所以你必须维护销毁体的标志,这样同一个线程就不会调用两次。

    编辑:像这样创建物理连接器,

    physicsWorld.registerPhysicsConnector(new PhysicsConnector(testSprite, testBody));
    

    【讨论】:

    • 感谢您的意见。我创建了这些 testBodies 来简单地测试碰撞是否有效,因为当我的场景开始时,我创建了几十个像这样的物体,它们在我的游戏中充当墙壁,所以夹具属性不是问题。但是,如果我在最初的身体之后创建身体,它们似乎不起作用。
    • 还通过字符串打印您接收两个主体的用户数据,以便您能够确定联系人监听器是否正在呼叫?直接在 begin 联系方法里面,没有任何 if 条件。我也看到了我对答案的编辑。
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2012-08-27
    • 1970-01-01
    • 2015-08-11
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    相关资源
    最近更新 更多