Usando PathModifier ou MoveYModifier para simular sprite salto
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?
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:
- Criar uma variável
boolean mIsJumping
em sua cena;Quando o salto inicia - lo paratrue
.Se o usuário toca a tela emIsJumping == true
, não pular. - Agora, registrar um ContactListener para o seu
PhysicsWorld
.Sempre que há o contato entre o leitor e o solo, definidomIsJumping
parafalse
.
Há muitos exemplos de utilização ContactListener
s 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:
- Temos 2 variáveis para armazenar IDs para o jogador e o chão:
private static final String PLAYER_ID = "player", GROUND_ID = "ground";
- 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);
egroundBody.setUserData(GROUND_ID);
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) { } };
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());
.