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?

¿Fue útil?

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:

  1. Crear una variable boolean mIsJumping en tu escena;Cuando comience el salto, configúrelo en true.Si el usuario toca la pantalla y mIsJumping == true, no saltar.
  2. Ahora, registre un Contacto oyente para usted PhysicsWorld.Siempre que haya contacto entre el jugador y el suelo, establezca mIsJumping a false.

Hay muchos ejemplos de uso. ContactListeners en los foros de AndEngine, un búsqueda rápida rinde algo.Si necesitas un ejemplo, puedes pedirlo :)

EDITAR 2: ContactListener muestra:

  1. Tenga 2 variables para guardar las identificaciones del jugador y del terreno: private static final String PLAYER_ID = "player", GROUND_ID = "ground";
  2. Cuando crea el cuerpo de tierra y el cuerpo del jugador, establezca sus ID como datos de usuario: playerBody.setUserData(PLAYER_ID); y groundBody.setUserData(GROUND_ID);
  3. 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) { }
    };
    
  4. 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());.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top