Java 使用路径修改器或移动修改器模拟精灵跳跃
我在AndEngine中使用此方法来确定用户正在触摸的场景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
@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轴是物理的一部分?