2011-12-12 152 views
6

我正在編寫一個骰子的GUI遊戲。有一個叫做「roll」的JButton,當點擊時擲骰子進行遊戲。然後GUI會顯示您使用jpeg模具面部滾動的內容。Java搖擺骰子滾動動畫

一切工作很好,除了我現在應該添加一個動畫到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; 
    } 
} 

`

+0

不知道是誰推倒你或者爲什麼(通過推倒推倒),但我投票決定抵消它。 –

+0

發佈http://sscce.org/ +1 – mKorbel

回答

6

動畫背後的基本想法是好的,我認爲,但它是否有效或者不是全部在實施細節當然。我建議你

  • 你讀你的圖像和一次ImageIcons,可能在程序的開始。
  • 將圖標放入長度爲7的ImageIcon數組中 - 但您會將圖標放入1-6個插槽中,並將第0項留空。
  • 您使用擺動計時器以某種適當的延遲隨機交換這些圖標,例如200或300毫秒。
  • 您使用Random對象來獲取1到6之間的隨機數,然後將此數字作爲數組索引,從數組中獲取Icon。
  • 通過簡單地調用JLabel的setIcon(...)方法,您可以在JLabel中顯示ImageIcons(或者如果顯示2個die,則顯示兩個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 
    } 
    }); 
+2

+1建議。首先,我還會着眼於解決渲染單個芯片的問題。 – trashgod

+0

我是否將所有這些代碼放入了我的rollActionPerformed方法中?除了填充數組。 – lessthanjacob

+1

您將在構造函數中創建ImageIcons。 rollActionPerformed可能會由一個按鈕啓動,並啓動定時器,該定時器將擁有自己的ActionListener,並且您可以隨意交換圖標,直到它重複x次(您將給它一個int計數器變量,檢查)。 –