Pergunta

Eu estou usando este método em AndEngine para determinar a cena que está sendo tocado pelo usuário.

@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
     if(pSceneTouchEvent.isActionDown()) {
         Log.e("Arcade", "Scene Tapped");
                   //Simulate player jumping

     }
    return false;
}

O que eu quero fazer é quando a cena é aproveitado, quero permitir que o jogador saltar.

Agora duas coisas para isso seria melhor usar PathModifier, ou MoveYModifier considerar é o modo paisagem?Se forneça um exemplo de tal.Obrigado

EDITAR:

eu consegui usar a Física para simular um salto usando isso..

@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 você disse na resposta ao alterar a gravidade.O único problema é que, quando o usuário mantém a tocar no ecrã, os sprites continue indo para cima e para cima e para cima.Como posso definir onde o usuário pode clicar apenas uma vez e não consigo fazer com que ele salte novamente até que o sprite de atingir o solo, que é um retângulo?

Foi útil?

Solução

Use o MoveYModifier.lembre-se, você pode se registrar como muitos modificadores como você deseja.Assim, se, por exemplo, o jogo uma plataforma de jogo e o personagem sempre se move sobre o eixo X, e ele pode jumpt se ele quer (Como a Gravidade Cara ou Yoo Ninja, embora estes jogos de alterar a gravidade, que é outra coisa).

Você poderia fazer assim:

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 a sua segunda pergunta:

  1. Criar uma variável boolean mIsJumping em sua cena;Quando o salto inicia - lo para true.Se o usuário toca a tela e mIsJumping == true, não pular.
  2. Agora, registrar um ContactListener para o seu PhysicsWorld.Sempre que há o contato entre o leitor e o solo, definido mIsJumping para false.

Há muitos exemplos de utilização ContactListeners em AndEngine fóruns, um pesquisa rápida rendimentos de alguns.Se você precisa de um exemplo, você pode perguntar para um :)

EDIT 2: ContactListener exemplo:

  1. Temos 2 variáveis para armazenar IDs para o jogador e o chão: private static final String PLAYER_ID = "player", GROUND_ID = "ground";
  2. Quando você cria o chão do corpo e que o jogador corpo, suas Identificações como os dados do usuário: playerBody.setUserData(PLAYER_ID); e groundBody.setUserData(GROUND_ID);
  3. Criar um ContactListener como um campo em seu cena:

    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 fim, registre-se que o contato do ouvinte: physicsWorld.setContactListener(mContactListener);

EDIT 3:

Para mover o seu sprite sobre o eixo X, você pode aplicar uma força utilizando Body.applyForce o método, ou aplicar um impulso usando Body.applyLinearImpulse o método.Brincar com os argumentos e encontrar o que funciona da seguinte.

O vetor deve consistir em um X apenas a parte;Tente Vector2 force = Vector2Pool.obtain(50, 0);.Em seguida, aplique a força desta maneira: body.applyForce(force, body.getWorldCenter());.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top