I'm creating a didactic game and when the bird collides with some object the sound happens but it gets infinitely repeating it, I can not stop.
public class FlappyBird extends ApplicationAdapter {
private SpriteBatch batch;
private Texture[] passaros;
private Texture fundo;
private Texture canoBaixo;
private Texture canoTopo;
private Texture gameOver;
private Random numeroRandomico;
private BitmapFont fonte;
private BitmapFont mensagem;
private Circle passaroCirculo;
private Rectangle RetanguloCanoTopo;
private Rectangle RetanguloCanoBaixo;
private Sound sound;
private Sound asas;
private Music soundmorreu;
private Sound soundcolisao;
//atributos de configuração
private float larguraDispositivo;
private float alturaDispositivo;
private int estadoJogo = 0;
private int pontuacao = 0;
private float variacao = 0;
private float velocidadeQueda = 0;
private float posicaoInicialVertical;
private float posicaoMovimentoCanoHorizontal;
private float espacoEntreCanos;
private float deltaTime;
private float alturaEntreCanosRandomica;
private boolean marcouPonto; //padrao já é falso
//Camera
private OrthographicCamera camera;
private Viewport viewport;
private final float VIRTUAL_WIDTH = 768;
private final float VIRTUAL_HEIGTH = 1024;
@Override public void create () { batch = new SpriteBatch (); numberRandom = new Random (); passCircle = new Circle (); / * RectangleCanoTopo = new Rectangle (); RetanguloCanoBaixo = new Rectangle (); shape = new ShapeRenderer (); * / source = new BitmapFont (); font.setColor (Color.WHITE); source.getData (). setScale (6);
passaros = new Texture[3];
passaros[0] = new Texture("passaro1.png");
passaros[1] = new Texture("passaro2.png");
passaros[2] = new Texture("passaro3.png");
fundo = new Texture("fundo.png");
mensagem = new BitmapFont();
mensagem.setColor(Color.WHITE);
mensagem.getData().setScale(3);
canoBaixo = new Texture("cano_baixo.png");
canoTopo = new Texture("cano_topo.png");
gameOver = new Texture("game_over.png");
soundcolisao = Gdx.audio.newSound(Gdx.files.internal("sfx_hit.ogg"));
sound = Gdx.audio.newSound(Gdx.files.internal("sfx_point.ogg"));
asas = Gdx.audio.newSound(Gdx.files.internal("sfx_wing.ogg"));
soundmorreu = Gdx.audio.newMusic(Gdx.files.internal("sfx_die.ogg"));
/**********
Configurações da camera
*/
camera= new OrthographicCamera();
camera.position.set(VIRTUAL_WIDTH/2, VIRTUAL_HEIGTH/2, 0);
viewport = new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGTH, camera);
larguraDispositivo = VIRTUAL_WIDTH;
alturaDispositivo = VIRTUAL_HEIGTH;
posicaoInicialVertical = alturaDispositivo / 2;
posicaoMovimentoCanoHorizontal = larguraDispositivo;
espacoEntreCanos = 300;
}
@Override public void render () {
camera.update();
//Limpar frames anteriores
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT );
deltaTime = Gdx.graphics.getDeltaTime();
//batendo asas
variacao += deltaTime * 10;
if(variacao > 2) variacao = 0;
//estado inicio jogo
if(estadoJogo == 0){
if(Gdx.input.justTouched()){
estadoJogo = 1;
}
} else {
velocidadeQueda++;
if(posicaoInicialVertical > 0 || velocidadeQueda < 0)
posicaoInicialVertical = posicaoInicialVertical - velocidadeQueda;
if(estadoJogo == 1){
posicaoMovimentoCanoHorizontal -= deltaTime * 200;
if(Gdx.input.justTouched()){
velocidadeQueda = -15;
asas.play(1.0f);
}
//verifica se o cano saiu inteiramente da tela
if(posicaoMovimentoCanoHorizontal < -canoTopo.getWidth()){
posicaoMovimentoCanoHorizontal = larguraDispositivo;
alturaEntreCanosRandomica = numeroRandomico.nextInt(400) - 200;
marcouPonto = false;
}
//Verifica pontuação
if(posicaoMovimentoCanoHorizontal < 120){
if (!marcouPonto){
pontuacao++;
marcouPonto = true;
sound.play(1.0f);
}
}
}else{// tela gameover
if( Gdx.input.justTouched() ){
estadoJogo = 0;
marcouPonto = false;
pontuacao = 0;
velocidadeQueda = 0;
posicaoInicialVertical = alturaDispositivo / 2;
posicaoMovimentoCanoHorizontal = larguraDispositivo;
}
}
}// fim else estado jogo 0
// configure camera projection data batch.setProjectionMatrix (camera.combined);
batch.begin();
batch.draw(fundo, 0, 0, larguraDispositivo, alturaDispositivo);
batch.draw( canoTopo, posicaoMovimentoCanoHorizontal, alturaDispositivo / 2 + espacoEntreCanos / 2 + alturaEntreCanosRandomica);
batch.draw( canoBaixo, posicaoMovimentoCanoHorizontal, alturaDispositivo / 2 - canoBaixo.getHeight() - espacoEntreCanos / 2 + alturaEntreCanosRandomica );
batch.draw(passaros[ (int)variacao ], 120, posicaoInicialVertical);
fonte.draw(batch, String.valueOf(pontuacao), larguraDispositivo / 2, alturaDispositivo - 50);
if(estadoJogo == 2){
batch.draw( gameOver, larguraDispositivo / 2 - gameOver.getWidth() / 2, alturaDispositivo / 2);
mensagem.draw(batch, "Toque para Reiniciar", larguraDispositivo / 2 -200, alturaDispositivo / 2 -gameOver.getHeight() / 2);
}
batch.end();
passaroCirculo.set(120 + passaros[0].getWidth() / 2,
posicaoInicialVertical + passaros[0].getHeight() / 2, passaros[0].getWidth() / 2);
RetanguloCanoBaixo = new Rectangle(
posicaoMovimentoCanoHorizontal, alturaDispositivo / 2 - canoBaixo.getHeight() - espacoEntreCanos / 2 + alturaEntreCanosRandomica,
canoBaixo.getWidth(), canoBaixo.getHeight()
);
RetanguloCanoTopo = new Rectangle(
posicaoMovimentoCanoHorizontal, alturaDispositivo / 2 + espacoEntreCanos / 2 + alturaEntreCanosRandomica,
canoTopo.getWidth(), canoTopo.getHeight()
);
//Teste de colisão
if( Intersector.overlaps( passaroCirculo, RetanguloCanoBaixo ) ||
Intersector.overlaps(passaroCirculo, RetanguloCanoTopo) ||
posicaoInicialVertical <= 0 || posicaoInicialVertical >= alturaDispositivo ){
estadoJogo = 2;
soundcolisao.play(1.0f);
}