Я пытаюсь остановить определенный метод, который воспроизводится, когда пользователь переходит - PullRequest
0 голосов
/ 04 апреля 2019

Я делаю игру, специфичную для меня игру с угрозой, и в игре у меня есть фоновые шумы, например, если пользователь правильно задает вопрос, звучит дребезжащий звук и аплодисменты толпы.Это не огромная проблема с нарушением игры, однако я хотел бы знать, есть ли какой-нибудь способ остановить шум, если пользователь нажимает «ОК» в подсказке JOptionPane.Я также хотел бы заявить, что я очень плохо знаком с кодированием.

Я пытался найти способ остановить воспроизведение файла, однако я не смог ничего найти, поэтому, если кто-нибудь знает, как это сделать, либоВоспроизводимый файл может быть остановлен или метод, в котором файл хранится сам по себе, может быть остановлен, что было бы замечательно.

package testing;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import static java.awt.Font.BOLD;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class testing implements ActionListener{

    static String Choice;       


    static String[][] Questions = {{"The Raptor is the mascot for which basketball team"}};

    static String[][] Answers = {{"Toronto Raptors"}};

public  JButton[][] t = new JButton[5][5];

public static void main(String[] args) {
    new testing();
    }

static int n = 100;

public testing() {

    JFrame scoreframe = new JFrame("SCORE");
    scoreframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    scoreframe.setSize(400,250);
    scoreframe.setVisible(true);

    JFrame gameframe = new JFrame("Jeopardy");
    gameframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    gameframe.setSize(1920,1080);
    gameframe.setLayout(new GridLayout(6, 4));


    for (int r = 0; r < 5; r++) {
        for (int c = 0; c < 5; c++) {
            String vakue = String.valueOf(n);
            t[r][c] = new JButton(vakue);
            t[r][c].setBackground(Color.BLUE);
            t[r][c].setForeground(Color.YELLOW);
            t[r][c].putClientProperty("rows", r);
            t[r][c].putClientProperty("columns", c);
            t[r][c].setFont(new Font("Swis721 BlkEx BT", BOLD, 40));
            t[r][c].addActionListener(this);
            gameframe.add(t[r][c]);
        }
        n = n +300;

        gameframe.setVisible(true);
    }
}

public static void crowd() {

      try {
       File file = new File( "crowd.wav");
       Clip clip = AudioSystem.getClip();
       clip.open(AudioSystem.getAudioInputStream(file));
       clip.start();

      } catch (Exception e) {
      }
     }

public static void applause() {

      try {
       File file = new File( "Applause.wav");
       Clip clip = AudioSystem.getClip();
       clip.open(AudioSystem.getAudioInputStream(file));
       clip.start();

      } catch (Exception e) {
      }
     }

public static void check() {

      try {
       File file = new File( "check.wav");
       Clip clip = AudioSystem.getClip();
       clip.open(AudioSystem.getAudioInputStream(file));
       clip.start();

      } catch (Exception e) {
      }
     }

@Override
 public void actionPerformed(ActionEvent e) {
    JButton A = new JButton();
    A = (JButton) e.getSource();
    int rows = (int) A.getClientProperty("rows");
    int cols = (int) A.getClientProperty("columns");
    Choice = JOptionPane.showInputDialog(null, Questions[rows][cols]);
    String score = A.getText();
  A.addActionListener(this);

    if (Choice.equalsIgnoreCase(Answers[rows][cols])) {
         check();
         applause();
         crowd();
      JOptionPane.showMessageDialog(null, "That's right! The correct answer was: " + Answers[rows][cols]+"! \nYou win " + score + "$");

            A.setEnabled(false);
    }    
}
}

Я сузил свой код, поэтому, если кто-то пытается попробовать его в своей программе, ему не приходится иметь дело с чем-то дополнительным.По сути, я разбил свой код, чтобы показать проблему, но я знаю, что вы не сможете услышать звуки, однако для целей помощи, скажем так, звуки были все 10 минут (на самом деле это не так, но давайте скажем, что они) если вы запустите мой код и нажмете первую кнопку в позиции 1,1, он спросит вас, для какой баскетбольной команды талисман является раптором, поэтому при вводе ответа («Торонто хищники») появляется сообщение о том, что пользователь получилПравильный вопрос и сколько денег они зарабатывают, так как это происходит, 10-минутная музыка играет сзади.Они нажимают «ОК», и музыка остается в задней части для всей звуковой дорожки, как я могу сделать так, чтобы, когда пользователь нажимал «ОК», звуки прекратились?

1 Ответ

0 голосов
/ 04 апреля 2019

Прежде всего, вы хотите сохранить ссылку на текущий клип (не имеет значения, воспроизводится ли он сейчас или нет).Для этого создайте статическую переменную, содержащую клип.Затем определите функции play и stop, когда каждая play сначала попытается набрать stop.Кроме того, лучше НЕ копировать и вставлять один и тот же код в разные функции:

private static Clip clip = null;

public static void stop() {
    if (clip != null) {
        clip.stop();
        clip = null;
    }
}

public static void play(String toPlayName) {
    stop();
    File toPlay = new File(toPlayName);
    try {
        clip = AudioSystem.getClip();
        clip.open(AudioSystem.getAudioInputStream(toPlay));
        clip.start();
    } catch (Exception e) {
    }
}

public static void crowd() {
    play("crowd.wav");
}

public static void applause() {
    play("Applause.wav");
}

public static void check() {
    play("check.wav");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...