当前位置: 动力学知识库 > 问答 > 编程问答 >

java - How to play music using libgdx

问题描述:

I have had trouble playing music using libgdx. My code is as follows:

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() {

}

}

My sound file i call over here:

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

And the code i use to play it is:

 sound.play();

sound.dispose();

For some reason it does not work on my desktop and my phone. I tested the the sound file actually had some sound in it. So if any body knows please reply.

网友答案:

You need to get rid of the sound.dispose(); call right after playing the sound, since it will dispose the sound file ;)

Just put it into your game's dispose(); method, so it will get removed after the game is done.

Also, you shouldn't call sound.play(0.5f); within your render-loop. Remember this function will get called about 60 times a second and you don't want to have the sound start 60 times a second.

So if it's some kind of sound effect that comes with a special event, like firing a bullet or hitting a target etc, just call sound.play(); one time, when you are actually firing the event.

https://github.com/libgdx/libgdx/wiki/Sound-effects

If you want to play background music, you should try streaming the music file. The wiki is awesome for that: https://github.com/libgdx/libgdx/wiki/Streaming-music

Hope it helps :)

分享给朋友:
您可能感兴趣的文章:
随机阅读: