【问题标题】:Using PathModifier or MoveYModifier to simulate sprite jumping使用 PathModifier 或 MoveYModifier 模拟精灵跳跃
【发布时间】:2012-01-12 05:11:59
【问题描述】:

我在 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;
}

正如您在答案中所说,通过改变重力。唯一的问题是,当用户不断触摸屏幕时,精灵会不断上升和上升。我该如何设置用户只能点击一次并且不能让他再次跳跃,直到精灵撞到地面,这是一个矩形?

【问题讨论】:

  • 我有同样的问题,我使用路径创建了自定义形状并在画布上绘制,当我试图通过从左上角拖动来调整形状时,该参数被更改为仅从形状的左上角?

标签: java android andengine


【解决方案1】:

使用MoveYModifier。请记住,您可以根据需要注册任意数量的修饰符。因此,例如,如果游戏是一个平台游戏,并且角色总是在 X 轴上移动,并且他可以随意跳跃(比如 Gravity Guy 或 Yoo Ninja,尽管这些游戏会改变重力,但这是另一回事)。

你可以这样做:

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. 现在,将ContactListener 注册到您的PhysicsWorld。每当玩家与地面接触时,将mIsJumping 设置为false

AndEngine 论坛中有很多使用ContactListeners 的示例,quick search 产生了一些示例。如果你需要一个例子,你可以要求一个:)

编辑 2: ContactListener 示例:

  1. 有 2 个变量来保存玩家和地面的 ID:private static final String PLAYER_ID = "player", GROUND_ID = "ground";
  2. 在创建ground body和player body时,将它们的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);

编辑 3:

要在 X 轴上移动精灵,您可以使用 Body.applyForce 方法施加力,或使用 Body.applyLinearImpulse 方法施加脉冲。玩弄这些论点,找出下一个有效的方法。

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

【讨论】:

  • 谢谢钟!正如你提到的,我找到了一种使用物理的方法,它比 MoveYModifier 效果更好,跳跃看起来更逼真。我遇到的唯一问题是我在编辑中描述的。看看吧。
  • 你使用 Box2D 还是 PhysicsHandler?
  • 我正在使用新的 GLES2 Box2D 扩展。
  • 能否举个联系监听的例子,我没用过。
  • 另外,我怎样才能让精灵在 x 轴上被拖动,与物理无关?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多