Usando PathModifier o MoveYModifier para simular saltos de sprites
Pregunta
Estoy usando este método en AndEngine para determinar la escena que toca el usuario.
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
if(pSceneTouchEvent.isActionDown()) {
Log.e("Arcade", "Scene Tapped");
//Simulate player jumping
}
return false;
}
Lo que quiero hacer es que cuando se toque la escena, quiero permitir que el jugador salte.
Ahora, dos cosas para esto: ¿sería mejor usar PathModifier o MoveYModifier considerando que es modo horizontal?En caso afirmativo, proporcione un ejemplo de ello.Gracias
EDITAR:
He logrado usar Física para simular un salto usando esto.
@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;
}
Como dijiste en la respuesta cambiando la gravedad.El único problema es que cuando el usuario sigue tocando la pantalla, los sprites siguen subiendo y subiendo.¿Cómo puedo configurarlo para que el usuario solo pueda hacer clic una vez y no pueda hacerlo saltar nuevamente hasta que el objeto toque el suelo, que es un rectángulo?
Solución
Utilizar el MoveYModifier
.recuerda, puedes registrar tantos modificadores como quieras.Entonces si por ejemplo el juego es de plataformas y el personaje siempre se mueve en el eje X, y puede saltar si quiere (Como Gravity Guy o Yoo Ninja, aunque estos juegos cambian la gravedad que es otra cosa).
Podrías hacer como:
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);
EDITAR:
Para tu segunda pregunta:
- Crear una variable
boolean mIsJumping
en tu escena;Cuando comience el salto, configúrelo entrue
.Si el usuario toca la pantalla ymIsJumping == true
, no saltar. - Ahora, registre un Contacto oyente para usted
PhysicsWorld
.Siempre que haya contacto entre el jugador y el suelo, establezcamIsJumping
afalse
.
Hay muchos ejemplos de uso. ContactListener
s en los foros de AndEngine, un búsqueda rápida rinde algo.Si necesitas un ejemplo, puedes pedirlo :)
EDITAR 2: ContactListener
muestra:
- Tenga 2 variables para guardar las identificaciones del jugador y del terreno:
private static final String PLAYER_ID = "player", GROUND_ID = "ground";
- Cuando crea el cuerpo de tierra y el cuerpo del jugador, establezca sus ID como datos de usuario:
playerBody.setUserData(PLAYER_ID);
ygroundBody.setUserData(GROUND_ID);
Crear un
ContactListener
como un campo en tu escena: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) { } };
Por último, registre ese contacto oyente:
physicsWorld.setContactListener(mContactListener);
EDITAR 3:
Para mover tu sprite sobre el eje X, puedes aplicar una fuerza usando Body.applyForce
método, o aplicar un impulso usando Body.applyLinearImpulse
método.Juega con los argumentos y descubre qué funciona a continuación.
El vector debe constar únicamente de una parte X;Intentar Vector2 force = Vector2Pool.obtain(50, 0);
.Luego aplica la fuerza de esta manera: body.applyForce(force, body.getWorldCenter());
.