簡體   English   中英

從傳遞給對象的引用獲得的libgdx音樂實例不是在android上播放而是在桌面上播放

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM