Обработка - Minim Audio Player - Игрок не останавливается внутри оператора if

Я пытался понять это целую вечность. Stop() функция не работает в операторе if (песни просто воспроизводятся поверх друг друга, а не паузы и перемотки). Если я размещу Stop() Вызов функции за пределами оператора if, похоже, что он работает (т.е. не воспроизводится файл вообще, что является ожидаемым поведением) Хотите знать, если кто-нибудь может пролить свет?

-------------- ОБРАЗЕЦ КОДА -------------------------

      import processing.serial.*;
import ddf.minim.*;
String id;
Card Card1 = new Card();
Minim minim;//audio context;
AudioPlayer Backgroundplayer;

   public class Card{ // CARD OBJECT so can set up each card.
     String id;
     String FileToPlay;
     boolean Playing = false;
     AudioPlayer player;
     public Card(){}
     public  Card(String ID, String FILETOPLAY){
       id = ID;
       FileToPlay = FILETOPLAY;
     }
     void Load(){
       player = minim.loadFile(FileToPlay);
     }
     void Play(){
        if(Playing == false){
           player.play();
           Playing = true;
           println("PLaying");
          }else if(Playing == true){
            Playing = false;
            Stop();
        }

   }

        void Stop(){
         println("Stopping");
         player.pause();
          player.rewind();
       }

   }

void setup() {
  size(400, 300);
}

void draw() {

}

void mouseClicked() {
  Card1.id = id;
  Card1.FileToPlay = "drumploop.wav";
  Card1.Load();
  Card1.Play();
}

Желаемый результат - играть разные звуки с каждой картой. Однако, когда карта сканируется, и если карта уже воспроизводит клип, при повторном сканировании она должна остановить воспроизведение назначенного клипа, в то время как остальные другие клипы все еще воспроизводятся.

1 ответ

Кажется, у вас сложилось впечатление, что if/else утверждение в вашем Play() Функция будет активирована дважды: один раз, когда вы начинаете воспроизводить клип, и один раз, когда вы проигрываете другой клип.

Однако дело обстоит иначе: кажется, вы когда-либо называете Play() функционировать один раз для каждого экземпляраCard, Другими словами, даже если вы можете создавать несколько экземпляров Card и зовет Play() функция на каждом, это все еще только один раз за экземпляр! Давайте сделаем это более очевидным:

Card card1 = new Card("one", "clip1.wav");
card1.Load(); //load the first clip
card1.Play(); //play the first clip

Card card2 = new Card("two", "clip2.wav");
card2.Load(); //load the second clip
card2.Play(); //play the second clip

Обратите внимание, что когда вы звоните card2.Play()ничто не зовет card1.Play() или же card1.Stop()первый клип продолжается!

Вам придется специально позвонить Stop() Функция любых воспроизводимых клипов, если вы хотите, чтобы они остановились перед воспроизведением нового:

Card card1 = new Card("one", "clip1.wav");
card1.Load(); //load the first clip
card1.Play(); //play the first clip

Card card2 = new Card("two", "clip2.wav");
card1.Stop(); //stop the first clip
card2.Load(); //load the second clip
card2.Play(); //play the second clip
Другие вопросы по тегам