使用PathModifier或MoveYModifier来模拟精灵跳跃

时间:2012-01-12 05:11:59

标签: java android andengine

我在AndEngine中使用此方法来确定用户触摸的场景。

@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
     if(pSceneTouchEvent.isActionDown()) {
         Log.e("Arcade", "Scene Tapped");
                   //Simulate player jumping

     }
    return false;
}

我想要做的是当点击场景时,我想让玩家跳跃。

现在有两件事情,最好是使用PathModifier,还是MoveYModifier,考虑到它是横向模式? 如果要么提供这样的例子。 感谢

编辑:

我设法使用物理来模拟使用此跳转..

@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
     if(pSceneTouchEvent.isActionDown()) {
         Log.e("Arcade", "Scene Tapped");

          final Vector2 velocity = Vector2Pool.obtain(mPhysicsWorld.getGravity().x * -0.5f,mPhysicsWorld.getGravity().y * -0.5f);
          body.setLinearVelocity(velocity);
          Vector2Pool.recycle(velocity);
         return true;
     }
    return false;
}

正如你在答案中所说的改变引力。唯一的问题是,当用户不断触摸屏幕时,精灵会不断上升和上升。如何将其设置为用户只能单击一次并且无法让他再次跳转直到精灵撞到地面,这是一个矩形?

1 个答案:

答案 0 :(得分:3)

使用MoveYModifier。记住,你可以根据需要注册多个修饰符。因此,例如,如果游戏中的平台游戏和角色总是在X轴上移动,并且如果他想要的话他可以跳跃(像Gravity Guy或Yoo Ninja,尽管这些游戏改变了重力,这是其他的东西)。 p>

你可以这样做:

Entity playerEntity = ..//It doesn't matter if the player is a sprite, animated sprite, or anything else. So I'll just use Entity here, but you can declare your player as you wish.

final float jumpDuration = 2;
final float startX = playerEntity.getX();
final float jumpHeight = 100;

final MoveYModifier moveUpModifier = new MoveYModifier(jumpDuration / 2, startX, startX + jumpHeight);
final MoveYModifier moveDownModifier = new MoveYModifier(jumpDuration / 2, startX + jumpHeight, startX);
final SequenceEntityModifier modifier = new SequenceEntityModifier(moveUpModifier, moveDownModifier);

playerEntity.registerEntityModifier(modifier);

修改

关于你的第二个问题:

  1. 在场景中创建变量boolean mIsJumping;跳转开始时 - 将其设置为true。如果用户点击屏幕并mIsJumping == true,则跳转。
  2. 现在,向PhysicsWorld注册ContactListener。只要玩家与地面之间存在联系,请将mIsJumping设置为false
  3. 在AndEngine论坛中有许多使用ContactListener的示例,quick search会产生一些。如果你需要一个例子,你可以要求一个:)

    编辑2: ContactListener示例:

    1. 有2个变量来保存玩家和地面的ID:private static final String PLAYER_ID = "player", GROUND_ID = "ground";
    2. 创建地面实体和玩家正文时,请将其ID设置为用户数据:playerBody.setUserData(PLAYER_ID);groundBody.setUserData(GROUND_ID);
    3. 在场景中创建一个ContactListener字段:

      private ContactListener mContactListener = new ContactListener() { 
      /**
       * Called when two fixtures begin to touch.
       */
      public void beginContact (Contact contact) {
          final Body bodyA = contact.getFixtureA().getBody();
          final Body bodyB = contact.getFixtureB().getBody();
      
          if(bodyA.getUserData().equals(PLAYER_ID)) {
              if(bodyB.getUserData().equals(GROUND_ID))
                  mIsJumping = false;
          }
          else if(bodyA.getUserData().equals(GROUND_ID)) {
              if(bodyB.getUserData().equals(PLAYER_ID))
                  mIsJumping = false;
          }
      
      }
      
      /**
       * Called when two fixtures cease to touch.
       */
      public void endContact (Contact contact) { }
      
      /**
       * This is called after a contact is updated.
       */
      public void preSolve(Contact pContact) { }
      
      /**
       * This lets you inspect a contact after the solver is finished. 
       */
      public void postSolve(Contact pContact) { }
      };
      
    4. 最后,注册该联系人监听器:physicsWorld.setContactListener(mContactListener);

    5. 编辑3:

      要在X轴上移动精灵,可以使用Body.applyForce方法施加力,或使用Body.applyLinearImpulse方法施加冲动。玩弄参数,找出下一步的作用。

      矢量应仅包含X部分;试试Vector2 force = Vector2Pool.obtain(50, 0);。然后以这种方式施加力:body.applyForce(force, body.getWorldCenter());