gpt4 book ai didi

Java Swing 骰子滚动动画

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:51 26 4
gpt4 key购买 nike

我正在编写一个 GUI 掷骰子游戏。有一个名为“roll”的 JButton,单击它会为游戏掷骰子。 GUI 然后使用 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,并让它实现了 Action 监听器,我没有错误。我尝试将 implements 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;
}
}

`

最佳答案

我认为你的动画背后的基本想法是好的,但它是否有效当然取决于实现细节。我建议

  • 您读入图像并制作一次 ImageIcons,可能是在程序开始时。
  • 您将图标放入长度为 7 的 ImageIcon 数组中——但是您会将图标放入 1-6 槽中,而第 0 项为空。
  • 您使用 Swing Timer 以适当的延迟随机交换这些图标,比如 200 或 300 毫秒。
  • 您使用一个 Random 对象获取 1 到 6 之间的随机数,然后将此数字作为您的数组索引,从数组中获取 Icon。
  • 您在 JLabel 中显示 ImageIcons(如果您显示 2 个骰子,则显示两个 JLabel)并通过简单地调用 JLabel 的 setIcon(...) 方法来交换图标。

编辑
您在评论中声明您尝试过:

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

关于Java Swing 骰子滚动动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8469941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com