Use the 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);
EDIT:
对于你的第二个问题:
- 创建一个变量
boolean mIsJumping
在你的场景中;当跳跃开始时 - 将其设置为true
。如果用户点击屏幕并且mIsJumping == true
, don't jump.
- 现在,注册一个联系监听器 http://code.google.com/p/andenginephysicsbox2dextension/source/browse/src/com/badlogic/gdx/physics/box2d/ContactListener.java?r=1605f6e82f710ef9ebbe07632d6b055239d3b520给你的
PhysicsWorld
。每当玩家与地面接触时,设置mIsJumping
to false
.
有很多使用示例ContactListener
在 AndEngine 论坛中,产生一些。如果您需要示例,可以索要一个:)
EDIT 2: ContactListener
sample:
- 有 2 个变量来保存玩家和地面的 ID:
private static final String PLAYER_ID = "player", GROUND_ID = "ground";
- 创建地面主体和玩家主体时,将它们的 ID 设置为用户数据:
playerBody.setUserData(PLAYER_ID);
and groundBody.setUserData(GROUND_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);
EDIT 3:
要在 X 轴上移动精灵,您可以使用以下命令施加力Body.applyForce
方法,或使用施加脉冲Body.applyLinearImpulse
方法。尝试一下这些论点并找到下一步可行的方法。
该向量应仅包含 X 部分;尝试Vector2 force = Vector2Pool.obtain(50, 0);
。然后按如下方式施加力:body.applyForce(force, body.getWorldCenter());
.