【发布时间】:2015-02-05 19:39:30
【问题描述】:
我将再次重新发布这个问题,试图更准确,并希望我能得到一些帮助,因为这让我发疯了。我正在开发一个最多 6 人的棋盘游戏,每个人都有不同颜色的棋子。我在 BufferedImage 数组中加载了以下图像,将其视为精灵:
这是相对代码,将每个彩色骰子的每个面放在 BufferedImage[] 中的一个位置:
private BufferedImage[] initAnimationBuffer() {
BufferedImage[] result = new BufferedImage[36];
for (int i = 0; i < 6; i++) {
for (int j = i; j < 6 + i; j++)
result[i + j] = DieSprite.getSprite(j, i, 0);
}
return result;
}
然后每个玩家,根据他的颜色,也将有以下矩阵,其中包含根据获得的骰子值/位置的颜色的面。换句话说,这个矩阵包含图像的“一条线”,并按值索引:
private BufferedImage[][] initExactDieFaces() {
BufferedImage[][] result = new BufferedImage[6][1];
int row = -1;
String myColor = this.coreGame.getMyPartecipant().getColor();
if (myColor.equals(Constants.COLOR[0])) {
row = 0;
} else if (myColor.equals(Constants.COLOR[1])) {
row = 2;
} else if (myColor.equals(Constants.COLOR[2])) {
row = 4;
} else if (myColor.equals(Constants.COLOR[3])) {
row = 1;
} else if (myColor.equals(Constants.COLOR[4])) {
row = 5;
} else if (myColor.equals(Constants.COLOR[5])) {
row = 3;
}
int offset = 0;
for (int i = 0; i < 6; i++) {
result[i][0] = DieSprite.getSprite(row, i, offset);
offset += 2;
}
return result;
}
我想要的是以下内容: - 当按下“翻转骰子”按钮时,我希望在 JPanel 内的特定 JLabel 中显示(例如)20 个随机骰子面(它们应该取自第一个数组 AnimationBuffer) - 上一个动画完成后,我希望显示获得的骰子发射结果(根据颜色 pawn,取自 ExcatDieFaces)。
要做到这一点,我知道我需要 Swing Timer,但我无法将它们放在一起;下面是 startAnimationDie 方法的一些代码,当按下“翻转骰子”按钮时会调用该方法:
private void startAnimationDie(final JPanel dieContainer) {
final BufferedImage[] animationBuffer = initAnimationBuffer();
final BufferedImage[][] exactDieFaces = initExactDieFaces();
final AnimationSprite animation = new AnimationSprite(
animationBuffer, Constants.DIE_ANIMATION_SPEED);
/* getting launch value fromt the core Game */
int launchResult = coreGame.launchDie();
coreGame.getMyPartecipant().setLastLaunch(launchResult);
final Timer timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dieContainer.removeAll();
dieContainer.updateUI();
animation.start();
JLabel resultDie = new JLabel();
resultDie.setBounds(60, 265, Constants.DIE_SIZE,Constants.DIE_SIZE);
resultDie.setIcon(new ImageIcon(animationBuffer[new Random().nextInt(36)]));
dieContainer.add(resultDie);
dieContainer.updateUI();
updateUI();
repaint();
}
});
/* animation begins, rolling faces are shown each time the Timer ends*/
for(int i = 0; i<20; i++)
timer.start()
/* showing the final face according to the pawn color and the obtained result from the launch */
dieContainer.removeAll();
dieContainer.updateUI();
AnimationSprite resultAnimation = new AnimationSprite(exactDieFaces[launchResult - 1], 6);
resultAnimation.start();
resultAnimation.update();
resultDie.setIcon(new ImageIcon(exactDieFaces[launchResult - 1][0]));
resultDie.setBounds(60, 265, Constants.DIE_SIZE, Constants.DIE_SIZE);
dieContainer.add(resultDie);
dieContainer.updateUI();
dieContainer.repaint();
}
我怎样才能让它工作?我想我应该使用 Swing.invokeAndWait 但我不能把所有的部分放在一起......你能帮忙吗?
【问题讨论】:
-
首先不要调用
updateUI,除非您安装自定义外观,否则您永远不需要调用它。其次,不要删除所有组件,只需更新标签的 die 图像 (setIcon)。第三,使用单个Timer,它可以重复给定的次数(使用计数器)并且会更新模具面...... -
好的,对于前两个建议我没问题。关于计时器,我使用的是计数器,不是吗?它是在 for 循环中激活的……如果可以的话,请给我更多帮助……
-
你启动
Timer20 次,没有任何效果...除了启动一次...您必须将Timer视为一种循环... -
好的,所以计时器每次结束时都会重新开始......那么我应该如何以及在哪里停止它?
-
((Timer)evt).stop()一旦counter达到20(或它的限制)...
标签: java swing animation sprite