Java Swing Dice Роллинг Анимация - PullRequest
6 голосов
/ 12 декабря 2011

Я кодирую игру в кости с графическим интерфейсом. Есть JButton, называемый «бросить», который при нажатии бросает кости для игры. Затем в графическом интерфейсе отображается то, что вы катали, используя jpeg для штампов.

Все отлично работает, кроме того, что я должен теперь добавить анимацию в GUI. Моя идея состояла в том, чтобы как-то быстро отобразить различные номиналы в течение короткого периода времени (имитируя «бросок»), используя тот же метод отображения jpeg. Однако, как я уверен, вы все знаете, это не сработает.

Я знаком с идеей EDT и классом Timer, но не знаю точно, как их использовать. По сути, я хочу, чтобы эта анимация появлялась, когда я нажимал кнопку «прокрутить», а когда анимация закончена, я хочу, чтобы она отображала то, что на самом деле было свернуто, как это делалось раньше.

Любая помощь будет принята с благодарностью. Вот код, который у меня есть до сих пор:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


/* This is the GUI declaration */
public class NCrapsGUI extends JFrame {
     //code...   
/* Action when "roll" is clicked */
    private void rollActionPerformed(java.awt.event.ActionEvent evt){                                         
        game.rollDice();
            //Rolls both die
            sumOfDice.setText(Integer.toString(game.getSum()));
            //Displays the sum of the die
            numRolls.setText(Integer.toString(game.getNumRolls()));
            //Displays the number of rolls in each game
            // <editor-fold defaultstate="collapsed" desc="Die JPEG's">
            // If statements display the die face based on the number rolled
            if (game.getDie1Value() == 1) {
                 die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face1.jpg")));
            }
            if (game.getDie1Value() == 2) {
                die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face2.jpg")));
            }
            if (game.getDie1Value() == 3) {
                die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face3.jpg")));
            }
            if (game.getDie1Value() == 4) {
                die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face4.jpg")));
            }
            if (game.getDie1Value() == 5) {
                die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face5.jpg")));
            }
            if (game.getDie1Value() == 6) {
                die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face6.jpg")));
            }
            if (game.getDie2Value() == 1) {
                die2Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face1.jpg")));
            }
            if (game.getDie2Value() == 2) {
                die2Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face2.jpg")));
            }
            if (game.getDie2Value() == 3) {
                die2Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face3.jpg")));
            }
            if (game.getDie2Value() == 4) {
                die2Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face4.jpg")));
            }
            if (game.getDie2Value() == 5) {
                die2Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face5.jpg")));
            }
            if (game.getDie2Value() == 6) {
                die2Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face6.jpg")));
            }
            //</editor-fold>
            /* 
             * If the game is beyond the first roll, it checks to see if the sum of the
             * values rolled equal 7 or the point value for a loss or win respectively.
             * If it is a win, it adds a win. Likewise for a loss.
             */
            if (game.getGameStatus() == 2) {
                if (game.getSum() == game.getPoint()) {
                    game.addWin();
                    numWins.setText(Integer.toString(game.getWins()));
                    game.setGameStatus(1);
                    game.setPoint(0);
                    game.resetRolls();
                    return;
                }
                if (game.getSum() == 7) {
                    game.addLoss();
                    numLosses.setText(Integer.toString(game.getLosses()));
                    game.setGameStatus(1);
                    game.setPoint(0);
                    game.resetRolls();
                    return;
                }
            }

            /*
             * This checks to see if the game is on the first roll. If it is, it checks 
             * if the sum of the die is 7 or 11 for a win, or 2, 3, or 12 for a loss. If
             * not, it passes it on to the next roll and sets the point value to the sum
             */
            if (game.getGameStatus() == 1) {
                game.setPoint(game.getSum());
                dieSum.setText(Integer.toString(game.getPoint()));

                if (((game.getSum() == 7) || ((game.getSum() == 11)))) {
                    game.addWin();
                    numWins.setText(Integer.toString(game.getWins()));
                    game.setPoint(0);
                    dieSum.setText(Integer.toString(game.getPoint()));
                    game.resetRolls();
                    return;
                }

                if (((game.getSum() == 2) || ((game.getSum()) == 3)) || (game.getSum()) == 12) {
                    game.addLoss();
                    numLosses.setText(Integer.toString(game.getLosses()));
                    game.setPoint(0);
                    dieSum.setText(Integer.toString(game.getPoint()));
                    game.resetRolls();
                    return;
                } else {
                    game.setGameStatus(2);
                }
            }
       }                                    

РЕДАКТИРОВАТЬ С ОБНОВЛЕННЫМ КОДОМ !!!

Здесь объявлены таймер и массив:

public class NCrapsGUI extends JFrame
{
private Timer timer; 
private int numPlayers;
private int totalIcons = 6;

private ImageIcon imageArray[];`

/* CODE */

И вот где массив заполняется внутри конструктора NCrapsGUI:

imageArray = new ImageIcon[totalIcons];
   for (int i = 0; i < 6 ;i++)
    {
        int temp = i + 1;
        imageArray[i] = new ImageIcon("face" + temp + ".jpg");
    }

    initComponents();`

Это весь метод rollActionPerformed. Я предполагаю, что Таймер начинается правильно в начале, но всякий раз, когда я пытаюсь запустить его, я получаю массу ошибок. Тем не менее, когда я Я сделал новый JPanel отдельно, и заставил его реализовать слушателя действия, я не получил ошибки. Я пытался добавить реализации ActionListner к этому объявлению, но NetBeans буквально не позволил бы мне набрать что-нибудь.

private void rollActionPerformed(java.awt.event.ActionEvent evt) {                                     



game.rollDice();
//Rolls both die

sumOfDice.setText(Integer.toString(game.getSum()));
//Displays the sum of the die

numRolls.setText(Integer.toString(game.getNumRolls()));
//Displays the number of rolls in each game

// <editor-fold defaultstate="collapsed" desc="Die JPEG's">
// If statements display the die face based on the number rolled
if (game.getDie1Value() == 1) 
{
    die1Disp.setIcon(imageArray[0]);
}

if (game.getDie1Value() == 2) 
{
    die1Disp.setIcon(imageArray[1]);
}

if (game.getDie1Value() == 3)
{
    die1Disp.setIcon(imageArray[2]);
}

if (game.getDie1Value() == 4) {
    die1Disp.setIcon(imageArray[3]);
}

if (game.getDie1Value() == 5) {
    die1Disp.setIcon(imageArray[4]);
}

if (game.getDie1Value() == 6) 
{
    die1Disp.setIcon(imageArray[5]);
}

if (game.getDie2Value() == 1) 
{
    die2Disp.setIcon(imageArray[0]);
}

if (game.getDie2Value() == 2) 
{
    die2Disp.setIcon(imageArray[1]);
}


if (game.getDie2Value() == 3) 
{
    die2Disp.setIcon(imageArray[2]);
}

if (game.getDie2Value() == 4)
{
    die2Disp.setIcon(imageArray[3]);
}

if (game.getDie2Value() == 5) 
{
    die2Disp.setIcon(imageArray[4]);
}

if (game.getDie2Value() == 6) 
{
    die2Disp.setIcon(imageArray[5]);
}

//</editor-fold>

/* 
 * If the game is beyond the first roll, it checks to see if the sum of the
 * values rolled equal 7 or the point value for a loss or win respectively.
 * If it is a win, it adds a win. Likewise for a loss.
 */

if (game.getGameStatus() == 2) {
    if (game.getSum() == game.getPoint()) {
        game.addWin();
        numWins.setText(Integer.toString(game.getWins()));
        game.setGameStatus(1);
        game.setPoint(0);
        game.resetRolls();
        return;
    }

    if (game.getSum() == 7) {
        game.addLoss();
        numLosses.setText(Integer.toString(game.getLosses()));
        game.setGameStatus(1);
        game.setPoint(0);
        game.resetRolls();
        return;
    }
}

`

1 Ответ

6 голосов
/ 12 декабря 2011

Я думаю, что ваша основная идея, лежащая в основе анимации, хороша, но, конечно, все зависит от того, работает она или нет. Я предлагаю

  • То, что вы читаете в своих изображениях и делаете ImageIcons один раз, вероятно, в начале программы.
  • Чтобы вы поместили значки в массив ImageIcon длиной 7, но вы поместите значок в 1-6 слотов, оставив 0-й элемент пустым.
  • То, что вы используете Swing Timer для случайного обмена этими значками с некоторой соответствующей задержкой, скажем, 200 или 300 мсек.
  • То, что вы используете объект Random для получения случайного числа от 1 до 6, а затем с этим числом в качестве индекса вашего массива извлеките Icon из массива.
  • Чтобы вы отображали ImageIcons в JLabel (или двух JLabel, если вы отображаете 2 кубика) и меняли иконки, просто вызывая метод setIcon(...) JLabel.

Редактировать
В своем комментарии вы указали, что пытались:

timer = new Timer(100,this);

И это ваша проблема - ваше использование this. Вы не должны пытаться использовать один и тот же ActionListner для всего. Вместо этого создайте ActionListener прямо там, где вам это нужно. Что-то вроде

  timer = new Timer(100, new ActionListener() {
     public void actionPerformed(ActionEvent actionEvt) {
        // ... put your ActionListener's code here 
     }
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...