使用PathModifier或MoveYModifier模拟sprite跳
题
我用这个方法在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;
}
正如你所说的答复中通过改变的严重性。唯一的问题是,当用户保持接触屏幕的精灵保持不断上升,上升。我怎么能将它设置在哪里的用户可以只需点击一次不能让他跳一次,直到对象落地,这是一个矩形?
解决方案
使用 MoveYModifier
.记住,你可以注册多的修饰语,只要你想。因此,如果,例如,游戏一个平台游戏和字一直移动的X轴上,他可以jumpt如果他想要的(就像地心引力的家伙或柳忍者,尽管这些游戏变化的严重性,这是别的东西).
你可以做像:
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);
编辑:
为你的第二个问题:
- 创建一个变量
boolean mIsJumping
在你的场景;时跳开始设置它true
.如果用户水龙头屏幕和mIsJumping == true
, 不不 跳。 - 现在,注册一个 ContactListener 你的
PhysicsWorld
.每当有联系之间播放机和地面设置mIsJumping
要false
.
有很多样的使用 ContactListener
s在AndEngine论坛, 快速搜索 产生一些。如果你需要一个例子,可以要求一个:)
编辑2: ContactListener
示例:
- 有2个变量保持Id播放机和地面:
private static final String PLAYER_ID = "player", GROUND_ID = "ground";
- 在创建当地主体和播放机身体、组件作为用户的数据:
playerBody.setUserData(PLAYER_ID);
和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);
编辑3:
移动你的精灵在X轴,你可以申请一个部队使用 Body.applyForce
方法,或者适用的一个脉冲使用 Body.applyLinearImpulse
法。玩的参数和找到工作的下一步。
矢量应该包括一个X的一部分;尝试 Vector2 force = Vector2Pool.obtain(50, 0);
.然后用力,这种方式: body.applyForce(force, body.getWorldCenter());
.