2011-12-12 18 views
6

Sto codificando un gioco di craps con interfaccia grafica. C'è un JButton chiamato "roll" che quando viene cliccato tira i dadi per il gioco. La GUI visualizza quindi ciò che hai lanciato usando i volti di die di jpeg.Java Swing Dice Rolling Animation

Tutto funziona alla grande, tranne che ora dovrei aggiungere un'animazione alla GUI. La mia idea era quella di mostrare in qualche modo rapidamente diversi valori del volto per un breve periodo di tempo (simulando un "rotolo") usando lo stesso metodo di visualizzazione dei jpeg. Tuttavia, come sicuramente sapete, non funziona.

Ho familiarità con l'idea di EDT e della classe Timer, ma non sono sicuro di come utilizzarli. Fondamentalmente voglio che quest'animazione avvenga quando premo il pulsante "roll", e quando l'animazione è finita, voglio che mostri ciò che è stato effettivamente fatto rotolare come prima.

Qualsiasi aiuto sarebbe molto apprezzato. Ecco il codice che ho finora:

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); 
       } 
      } 
     }          

MODIFICA CON CODICE AGGIORNATO !!!

Ecco dove il timer e la matrice vengono dichiarati:

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

private ImageIcon imageArray[];` 

/* CODE */ 

E qui è dove la matrice è popolato all'interno del costruttore NCrapsGUI:

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

    initComponents();` 

Questo è l'intero metodo rollActionPerformed. Immagino che il Timer inizi a destra all'inizio, ma ogni volta che provo ad avviarlo mi viene un sacco di errori. Tuttavia, quando I ho creato un nuovo JPanel separatamente e ho implementato l'action listener, non ho ricevuto errori . Ho provato ad aggiungere strumenti ActionListner a questa dichiarazione, ma NetBeans letteralmente non mi permetteva di digitare nulla in.

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; 
    } 
} 

`

+0

Non so chi ti ha votato o perché (un drive-by down-vote), ma ho votato per contrastarlo. –

+0

per la pubblicazione di consigli http://sscce.org/ +1 – mKorbel

risposta

6

La tua idea di base dietro l'animazione è una buona credo, ma se funziona o no è tutto nei dettagli di implementazione, naturalmente. Suggerisco

  • Che tu abbia letto nelle tue immagini e crei ImageIcons una volta, probabilmente all'inizio del programma.
  • Che si mettono le icone in un array ImageIcon con una lunghezza di 7 - ma si inserisce un'icona negli slot 1-6, lasciando vuoto il 0 ° elemento.
  • Se si utilizza uno Swing Timer per scambiare queste icone casualmente con un ritardo appropriato, ad esempio 200 o 300 msec.
  • Se si utilizza un oggetto casuale per ottenere un numero casuale compreso tra 1 e 6, quindi con questo numero come indice di array, estrarre l'icona dall'array.
  • Che si visualizzano ImageIcons in una JLabel (o due JLabel se si visualizzano 2 die) e si scambiano icone semplicemente chiamando il metodo setIcon(...) di JLabel.

Modifica
stato nel vostro commento che si è tentato:

timer = new Timer(100,this); 

E questo è il problema - l'utilizzo del this. Non dovresti provare a usare lo stesso ActionListner per tutto. Invece crea un ActionListener proprio lì, dove ne hai bisogno. Qualcosa di simile,

timer = new Timer(100, new ActionListener() { 
    public void actionPerformed(ActionEvent actionEvt) { 
     // ... put your ActionListener's code here 
    } 
    }); 
+2

+1. Cercherò anche di risolvere il problema del rendering di un singolo die, in primo luogo. – trashgod

+0

Inserisco tutto questo codice nel mio metodo rollActionPerformed? Oltre a popolare l'array. – lessthanjacob

+1

Creerete le vostre ImageIcons in un costruttore. Il rollActionPerformed sarà probabilmente avviato da un pulsante e avvierà il Timer che avrà il proprio ActionListener, ed è lì che si scambiano le icone casualmente fino a che non ripete x quantità di volte (gli darai una variabile contatore int che incrementerai e dai un'occhiata). –