如何使用libgdx播放音乐

3

我在使用libgdx播放音乐时遇到了问题。我的代码如下:

package com.me.fixGame;

import java.util.Random;


import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Texture;


import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
//import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.utils.Scaling;
import com.sun.jmx.snmp.tasks.Task;


public class fixGame implements ApplicationListener {
    SpriteBatch batch;
    SpriteBatch spriteBatch;
    Texture trash; 
    Texture paper;
    SpriteBatch spritebatch;
    Vector2 position;
    Vector2 pas;
    boolean collide;
    boolean countMe=false;
    Vector2 size;
    Vector2 size2;
    Vector2 pos;
    Rectangle bounds;
    float posSpeed=30;
    Rectangle bounds2;
    float delay = 1; // seconds
    boolean counted= false;
    int score = 3;
    //Texture Gogreen;
    String myScore;
    Texture background; 
    CharSequence str = "Lives left: 3"; // = myScore;
    CharSequence line = "Score: 0"; // = myScore;
    String myLife;
    int life=0;
    BitmapFont font;
    float x;
    float y;
    Sound sound;
    boolean collision = false;
    @Override
    public void create() {  

        //Gogreen = new Texture(Gdx.files.internal("data/gogreenNow.jpg"));
        background = new Texture(Gdx.files.internal("data/trash.png"));

        x= background.getWidth();
        y=background.getHeight();
        //float delaySeconds = 1;
        spriteBatch = new SpriteBatch();
        trash = new Texture(Gdx.files.internal("data/trash.png"));
        paper = new Texture(Gdx.files.internal("data/paper1.jpg"));
        sound = Gdx.audio.newSound(Gdx.files.internal("data/testjava.mp3"));

        position = new Vector2(100, 50);
        pos = new Vector2(54, 14);
        batch = new SpriteBatch();
        BitmapFont font = new BitmapFont();

        size2 = new Vector2(trash.getWidth() ,trash.getHeight() );
        //size2.y = trash.getHeight();
        //size2.x = trash.getWidth();
        size = new Vector2(paper.getWidth() ,paper.getHeight());

        bounds= new Rectangle(pos.x, pos.y, size.x, size.y);
        bounds2= new Rectangle(position.x, position.y, size2.x, size2.y);

    }

    @Override
    public void dispose() {

    }
    public void update(){
        bounds.set(pos.x, pos.y, size.x, size.y);
        bounds2.set(position.x, position.y, size2.x, size2.y);
        float pos1=Gdx.input.getAccelerometerX();
        //if(pos1<0)
        //  pos1=(-1)*pos1;
        position.x = position.x - 5*pos1;
    }

    @Override
    public void render() {
        sound.play(0.5f);
        sound.dispose();    
        if(bounds.overlaps(bounds2)){
            collision=true; 
            counted=true;
        }else{
            collision=false;
        }

        if(collision==true){

        } 
        if(pos.y<640){
            counted=false;
        } else if(pos.y > 640 && collision==false && counted==false){
            counted=true;
            score= score-1;
            myScore = "Lives left: " + score;
            str = myScore;
        }


        if(bounds.overlaps(bounds2)){
            countMe=true;
            life= life+50;
            myLife = "Score: " + life;
            line = myLife;
        }


        if(position.x<0){
            position.x= position.x+11;
        }
        if(position.x>425){
            position.x= position.x-11;
        }


        update();
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        pos.y=pos.y-posSpeed;
        //posSpeed = posSpeed+(2/3);
        if(pos.y<0){
            pos.y = 700;
            Random randomGenerator = new Random();
            pos.x = randomGenerator.nextInt(500);
        }
        BitmapFont font = new BitmapFont();


        batch.begin();

        batch.draw(background, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        if (!collision) {
            batch.draw(paper, pos.x, pos.y);

        }

        //batch.draw(paper, pos.x, pos.y);
        batch.draw(trash, position.x, position.y);
        font.setScale(3);

        font.setColor(0.0f, 0.0f, 1.0f,1.0f);
        font.draw(batch, str, 300,900);
        font.draw(batch, line, 300, 950);
        batch.end();
        font.dispose();     
    }

     @Override  
    public void resize(int width, int height) {

    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }
}

我在这里调用的音频文件是:

 sound = Gdx.audio.newSound(Gdx.files.internal("data/testjava.mp3"));

我使用的播放代码是:

 sound.play();
 sound.dispose(); 

出于某种原因,它在我的桌面和手机上都无法正常工作。我测试了声音文件,实际上它确实有声音。


1
问题是,您在渲染循环中调用 play(0.5f),并在播放后直接调用 dispose()。请在create方法中调用play并查看其是否正常工作。并且在您的ApplicationListener的dispose()方法内调用 dispose(). - Robert P
1个回答

9
你需要在播放音频后,摆脱 sound.dispose(); 的调用,因为它会释放音频文件 :)
只需将其放入游戏的 dispose(); 方法中,这样它就会在游戏完成后被删除。
此外,在你的渲染循环内部不应该调用 sound.play(0.5f);。请记住,此函数每秒将被调用约60次,你不希望声音每秒开始60次。
因此,如果是某种随着特定事件而来的音效,比如发射子弹或击中目标等,请在实际发生事件时仅调用一次 sound.play();https://github.com/libgdx/libgdx/wiki/Sound-effects 如果要播放背景音乐,可以尝试流式传输音频文件。这个维基页面对此非常有用:https://github.com/libgdx/libgdx/wiki/Streaming-music 希望对你有所帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接