[英]libgdx Music instance obtained from passed reference to object not playing on android but playing on desktop
我正在使用LibGdx在Eclipse中編寫一個具有兩個屏幕的游戲的應用程序。 還有一個Question類,它具有兩個實例變量,它們是Music對象,另外兩個是String。 第一個屏幕獲取對Question對象的引用,並播放問題的Music實例以及包含沒有問題的答案的Music實例。 但是,當調用第二個屏幕時,對此Question對象的引用將傳遞到第二個屏幕,但是(從Question中獲得的)Music對象都不會再播放。 我知道問題會傳遞到第二個屏幕,因為第二個屏幕可以訪問問題的實例變量,它們是字符串,但不能訪問音樂。 僅當在Android上運行時,此問題才可見,當我運行桌面項目時,一切正常。 這是課題課
public class QuestionClothsType {
private int ID;
private String question;
private Music questionVoice;
private String answer;
private Music answerVoice;
private String colourAnswer;
public QuestionClothsType(int anID, String aQuestion, Music aVoice, String anAnswer, Music anAnswerVoice, String aColourAnswer){
this.ID = anID;
this.question = aQuestion;
this.questionVoice = aVoice;
this.answer = anAnswer;
this.answerVoice = anAnswerVoice;
this.colourAnswer = aColourAnswer;
}
public int getID(){
return this.ID;
}
public Music getQuestionVoice() {
return this.questionVoice;
}
public String getAnswer(){
return this.answer;
}
public Music getAnswerVoice() {
return this.answerVoice;
}
public String getColourAnswer(){
return this.colourAnswer;
}
}
這是第二個屏幕的相關部分:
….
Music applause;
Music voiceItem;
Music voiceItem2;
Music voiceItem3;
private QuestionClothsType passedQuestion;
….
public ItemsScreen(Room room, ItemType aType, QuestionClothsType aQuestion){
this.passedQuestion = aQuestion;
voiceItem = passedQuestion.getQuestionVoice();
voiceItem2 = passedQuestion.getQuestionVoice();
voiceItem3 = passedQuestion.getAnswerVoice();
…
private void checkAnswer(int answer2) {
….
if (answerColour.equals(passedQuestion.getColourAnswer())){
System.out.println("right. the answer was " + passedQuestion.getAnswer());
applause.play();
applause.setOnCompletionListener(new OnCompletionListener(){
@Override
public void onCompletion(Music aMusic){
dispose();
roomGame.setScreen(new ChestOfDrawersScreen(roomGame));
}
}
);
}
else{
System.out.println("wwrong. the answer was " + passedQuestion.getAnswer());
mistake.play();
mistake.setOnCompletionListener(new OnCompletionListener(){
@Override
public void onCompletion(Music aMusic){
voiceItem2.play();
}
}
);
}
}
….
@Override
public void show() {
voiceItem.play();
}
voiceItem和voiceItem2都不能在Android上播放(它們都從passQuestion.getQuestionVoice()獲取),而是System.out.println(“錯誤。答案為” + passedQuestion.getAnswer()); 可以打印,並且可以在桌面上正常工作。
謝謝你的幫助。 卡洛塔
我認為您應該聲明另一個資源類。 發生這種情況是因為android設備的資源少於台式機,因此它可能無法及時加載所需的資源。 聲明另一個名為Resources或您喜歡的類的類。 然后在里面做這樣的事情
public class Resources {
public static Music myMusic1;
public static Music myMusic2;
public static Music myMusic3;
public Resources() {}
public static void load() {
myMusic1 = Gdx.audio.newMusic(Gdx.files.internal("data/mymusic1.mp3"));
myMusic2 = Gdx.audio.newMusic(Gdx.files.internal("data/mymusic2.mp3"));
myMusic3 = Gdx.audio.newMusic(Gdx.files.internal("data/mymusic3.wav"));
}
}
現在像這樣在您的主Game類中調用此方法。
public class MyGame extends Game{
@Override
public void create() {
//Here call your method
Resources.load();
}
@Override public void render(int width, int height) {}
}
現在進入要在其中使用它的自定義類。
public class ItemsScreen {
//----
private void checkAnswer(int ans) {
if (ans == 3) {
//now play music where ever you like in your app.
Resources.myMusic1.play();
Resources.myMusic2.play();
} else {
//stop the music from any where in your app.
Resources.myMusic1.stop();
Resources.myMusic1.dispose();
Resources.myMusic3.play();
}
}
}
上面的示例適用於所有設備,例如android,ios,台式機。 經過測試。 這是一個通用示例,無論如何您都可以使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.