Java 使用路径修改器或移动修改器模拟精灵跳跃

Java 使用路径修改器或移动修改器模拟精灵跳跃,java,android,andengine,Java,Android,Andengine,我在AndEngine中使用此方法来确定用户正在触摸的场景 @Override public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { if(pSceneTouchEvent.isActionDown()) { Log.e("Arcade", "Scene Tapped"); //Simulate player jumping

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

正如你在回答中所说,通过改变重力。唯一的问题是,当用户不断触摸屏幕时,精灵会不断地向上移动。我如何将其设置为用户只能单击一次,并且在精灵落地之前不能让他再次跳跃,这是一个矩形?

使用
移动修改器。记住,您可以注册任意数量的修改器。例如,如果游戏是一个平台游戏,角色总是在X轴上移动,如果他想跳,他就可以跳(比如重力小子或忍者,尽管这些游戏改变了重力,这是另外一回事)

你可以这样做:

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);
编辑:

关于第二个问题:

  • 在场景中创建一个变量
    布尔误跳
    ;跳转开始时-将其设置为
    true
    。如果用户点击屏幕,并且
    跳错==true
    ,则不要跳
  • 现在,向您的
    物理世界注册一个。当球员与地面接触时,将
    误跳
    设置为
  • 在AndEngine论坛中有许多使用
    ContactListener
    s的示例,其中有一些。如果你需要一个例子,你可以要求一个:)

    编辑2:
    ContactListener
    示例:

  • 有两个变量来保存播放器和地面的ID:
    private static final String player\u ID=“player”,地面\u ID=“地面”
  • 创建地面主体和球员主体时,将其ID设置为用户数据:
    playerBody.setUserData(球员ID)
    groundBody.setUserData(地面ID)
  • 在场景中创建一个
    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) { }
    };
    
  • 最后,注册联系人侦听器:
    physicsWorld.setContactListener(mContactListener)

  • 编辑3:

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


    向量应仅包含X部分;尝试
    vector2force=Vector2Pool.获得(50,0)。然后按如下方式应用力:
    body.applyForce(force,body.getWorldCenter())

    我也有同样的问题,当我试图通过从左上角拖动来调整形状大小时,我使用路径创建了自定义形状并在画布上绘制。哪些参数仅从形状的左上角更改为重新调整大小?谢谢!正如你提到的,我找到了一种用物理方法来做的方法,它比MoveYModifier更有效,跳跃看起来更真实。我唯一的问题是我在编辑中描述的内容。检查一下。你使用Box2D或
    PhysicsHandler
    ?我正在使用新的GLES2 Box2D版本。你能举一个我从未使用过的contact listener的例子吗?还有,我怎样才能允许精灵在x轴上拖动,而x轴是物理的一部分?