【问题标题】:Physics with Box2d and Andengine tutorialBox2d 和 Andengine 的物理教程
【发布时间】:2012-11-04 17:06:02
【问题描述】:

大家好,我正在尝试开发像 Jetpack 这样的游戏,所以我想设置一个通常向下推的重力,当用户点击屏幕时,重力会改变它向上推。我搜索了一周的教程来解释如何做到这一点,但我没有找到我搜索的内容。有人可以向我解释如何做到这一点或发布教程链接吗?

谢谢!!

    main = new Sprite(sX, sY, mainTextureRegion);
    main.setScale(1);
    main.setFlippedHorizontal(true);
    scene.attachChild(main);
    mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false);
    final FixtureDef objectFixtureDef = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);
    final Body body = PhysicsFactory.createBoxBody(mPhysicsWorld, main, BodyType.DynamicBody, objectFixtureDef);
    mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(main, body, true, true));
    final Vector2 gravity = new Vector2(0, 5f);
    mPhysicsWorld.setGravity(gravity);

    scene.registerUpdateHandler(new IUpdateHandler() {
        @Override
        public void onUpdate(float pSecondsElapsed) {

      }

        @Override
        public void reset() {
            // TODO Auto-generated method stub

        }});

【问题讨论】:

    标签: android box2d andengine gravity


    【解决方案1】:

    当用户触摸屏幕时,您不应该改变重力,因为它不应该那样做。 当他触摸屏幕时,只需应用一个 LinearImpulse(检查它是否已经处于最大速度)或类似的东西,使其上升。重力不应该改变,因为它应该总是吸引你所有的物理对象。如果你改变重力,你就会改变所有物体的行为,而不仅仅是玩家。

    编辑

    要让物理引擎工作,您必须在每次渲染时调用 PhysicsWorld 类的 step() 方法。 Andengine 的问题在于您根本不直接访问 render() 方法,因为 Andengine 根本处理它。 因此,您需要在 onLoadEngine() 方法中返回的 Engine 对象上注册一个 IUpdateHandler。 这样,接口的 onUpdate() 方法将在每次渲染时被调用,在这里您可以调用 step() 方法来让物理部分工作。浮点值告诉您自上次渲染以来经过了多少秒,但您不必关心它。该方法每秒被调用多次。

    希望对你有帮助。

    编辑 2

    我认为这应该可行:

    //on the Scene object or on the Engine one
    scene.registerUpdateHandler(new IUpdateHandler() {
        @Override
        public void onUpdate(float pSecondsElapsed) {
            mPhysicsWorld.onUpdate(pSecondsElapsed);
        }
    
        @Override
        public void reset() {}
    });
    

    【讨论】:

    • 嗯,好的,谢谢.. 但我想要的是如何设置重力的代码示例... 知道,我可以传递给 LinearImpulse :)
    • 重力是在创建 Box2DWorld 时设置的。然后你也可以用 setGravity() 方法改变它。
    • 你是否在每次渲染时调用 World 对象的 step() 方法?
    • 这方面我真的帮不了你,而且可能有很好的教程。首先,您应该扩展 BaseGameActivity,然后我相信您可以在 Engine 对象上注册一个处理程序。只需在网上搜索即可。
    • 但是我已经做到了!!我的游戏已经可以运行了,我只需要这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多