【问题标题】:set collisions between different body type设置不同体型之间的碰撞
【发布时间】:2013-07-17 10:34:10
【问题描述】:

我创建了一个Kinematic体型平面精灵,它将连续移动。所以,我为身体设置了一个线速度,这就是它不断移动的原因。但是我有屏幕边界屋顶,地面,左墙,右墙。所有这些都是静态的。当飞机移动时,它不会与任何边界墙发生碰撞。之后,研究Box-2d手册,我发现Kinematic Body永远不会与其他Kinematic BodyStatic Body发生碰撞>。因此,无论我将墙设置为运动学还是静态体,它都不会与平面发生碰撞。当我将墙设置为 Dynamic 时,它会因重力而倒下。那么,我应该怎么做才能设置我的飞机和墙壁之间的碰撞呢?

代码如下:

private void initializePlaneAndBoundary() {

        /*
         * create wall boundary
         */
        final Rectangle ground = new Rectangle(0, camera_Height - 2,
                camera_Width, 2, vbom);
        final Rectangle roof = new Rectangle(0, 0, camera_Width, 2, vbom);
        final Rectangle left = new Rectangle(0, 0, 2, camera_Height, vbom);
        final Rectangle right = new Rectangle(camera_Width - 2, 0, 2,
                camera_Height, vbom);

        final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0,
                0.5f, 0.5f);
        PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground,
                BodyType.StaticBody, wallFixtureDef);
        PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof,
                BodyType.StaticBody, wallFixtureDef);
        PhysicsFactory.createBoxBody(this.mPhysicsWorld, left,
                BodyType.StaticBody, wallFixtureDef);
        PhysicsFactory.createBoxBody(this.mPhysicsWorld, right,
                BodyType.StaticBody, wallFixtureDef);

        attachChild(ground);
        attachChild(roof);
        attachChild(left);
        attachChild(right);


        aPilot = new Pilot(222, 333, pilotTexures, vbom) {
            @Override
            protected void onManagedUpdate(float pSecondsElapsed) {

                super.onManagedUpdate(pSecondsElapsed);

            }
        };
        pilotBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, aPilot,
                BodyType.KinematicBody, FIXTURE_DEF);
        this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(
                aPilot, pilotBody, true, true));
        pilotBody.setLinearVelocity(DEMO_VELOCITY_X, DEMO_VELOCITY_Y);
        attachChild(aPilot);

    }

【问题讨论】:

    标签: android box2d andengine


    【解决方案1】:

    我看到了两种方式:

    1. 使用动态体而不是运动学。要移动身体,您可以将gravityScale 设置为零并通过设置速度来移动,或者使用b2MotorJoint、b2MouseJoint 或其他方法。
    2. 如果您确实需要运动体,并且想要捕捉与地面的接触(例如通过设置接触侦听器),那么您应该通过 b2WeldJoint 将另一个动态体附加到该运动体。然后,您可以听到这个动态体的联系,并根据您的意愿做出反应。

    【讨论】:

    • 我也同意第一个建议。为此,您必须使用动态主体。
    • 感谢您的回复。设置动态体而不是运动学后,它与墙壁碰撞,没问题。与墙边界碰撞后,平面自动停止。为什么?飞机体应该以给定的速度连续运动。任何想法? @帕维尔
    • @shihab_returns,如果您想通过接触侦听器捕捉碰撞,但不想要物理交互,请将您的身体设置为传感器(将所有固定装置 b2FixtureDef::isSensor 设置为 true)。
    • @Pavel:当我设置 b2FixtureDef.isSensor = true 我的飞机超出了边界!!!
    • @shihab_returns,这是你想要的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2020-05-28
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多