物理学与Box2d和Andengine教程

时间:2012-11-04 17:06:02

标签: android box2d andengine gravity

大家好我正在尝试开发像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

        }});

1 个答案:

答案 0 :(得分:3)

当用户触摸屏幕时,您不应该改变重力,因为不应该这样做。 当他触摸屏幕时,只需应用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() {}
});