【发布时间】:2017-04-14 02:03:37
【问题描述】:
我尝试使用动画将 jframe 中的标签从一个地方移动到另一个地方 定时器在摆动,我总是得到定时器发送的最后一个动画 例如:
cetrian 标签有一个变量“place”,它每时每刻都保存标签的位置 place 是一个 0
label.setposition(pointslist.place.getx(),pointslist.place.gety());
通过这种方式,它将标签的位置设置在位置 52
public void move_player1{
timer = new Timer(20, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
//Move 1 px everytime
if(player1.getLocation().x<pointslist.values()[place].getx()&&player1.getLocation().y==pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x+1, player1.getLocation().y);
if(player1.getLocation().x==pointslist.values()[place].getx()&&player1.getLocation().y>pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x, player1.getLocation().y-1);
if(player1.getLocation().x>pointslist.values()[place].getx()&&player1.getLocation().y==pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x-1, player1.getLocation().y);
if(player1.getLocation().x>pointslist.values()[place].getx()&&player1.getLocation().y>pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x-1, player1.getLocation().y-1);
if(player1.getLocation().x<pointslist.values()[place].getx()&&player1.getLocation().y<pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x+1, player1.getLocation().y+1);
if(player1.getLocation().x<pointslist.values()[place].getx()&&player1.getLocation().y>pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x-1, player1.getLocation().y-1);
if(player1.getLocation().x>pointslist.values()[place].getx()&&player1.getLocation().y<pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x-1, player1.getLocation().y+1);
if(player1.getLocation().x<pointslist.values()[place].getx()&&player1.getLocation().y>pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x+1, player1.getLocation().y-1);
if(player1.getLocation().x==pointslist.values()[place].getx()&&player1.getLocation().y==pointslist.values()[place].gety()){
timer.stop();
}
}
});
timer.start();
}
现在让我们说在其他函数中我得到一个随机数 x 并让标签像这样一个一个地遍历所有点:
int x=*random* (for example 6);
for(int i=0;i<x;i++)
{
place++;
move_player1();
}
如果玩家站在第 52 点,我想在 gui 中看到 玩家逐点移动直到到达 58 但它不起作用 我在 gui 中看到玩家直接从第 52 点移动到第 58 点,而我希望它只 1 比 1 移动 我该如何解决?如何在第一次完成之前停止第二个计时器的运行?
--------编辑: 这是一个可运行的示例
大型机:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
public class mainframe extends JFrame{
private JPanel gamepanel;
private JPanel DicePanel;
private Die Dice;
private final int WIDTH=850;
private final int HEIGHT=610;
private final String BACKGROUNDPATH=".\\images\\lns.png";
public JButton button;
public int place;
JLabel player1;
Timer timer;
public mainframe(){
this.setSize(WIDTH,HEIGHT);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
gamepanel=new JPanel();
gamepanel.setBounds(new Rectangle(570,HEIGHT));
gamepanel.setLayout(new BorderLayout());
JLabel backgroundimg=new JLabel(new ImageIcon(BACKGROUNDPATH));
gamepanel.add(backgroundimg);
player1=new JLabel(new ImageIcon(".\\images\\player1.png"));
player1.setBounds(pointslist.POINT1.getx(),pointslist.POINT1.gety(),59,29);
backgroundimg.add(player1);
place=1;
DicePanel=new JPanel();
DicePanel.setLayout(new BorderLayout());
DicePanel.setPreferredSize(new Dimension(WIDTH-gamepanel.getWidth()-15,HEIGHT));
Dice=new Die();
//Button
button = new JButton("ROLL THE DICE !");
button.setFont(new Font("Arial",Font.BOLD,20));
button.setPreferredSize(new Dimension(200,100));
DicePanel.add(button,BorderLayout.SOUTH);
this.setLayout(new BorderLayout());
this.add(gamepanel,BorderLayout.CENTER);
this.add(DicePanel,BorderLayout.LINE_END);
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Dice.roll();
int dienum=Dice.getFaceValue();
System.out.println(dienum);
for(int i=0;i<dienum;i++)
{
place++;
move_player1();
}
}
public void move_player1()
{
timer = new Timer(50, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
//Move 1 px everytime
if(player1.getLocation().x<pointslist.values()[place].getx()&&player1.getLocation().y==pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x+1, player1.getLocation().y);
if(player1.getLocation().x>pointslist.values()[place].getx()&&player1.getLocation().y==pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x-1, player1.getLocation().y);
if(player1.getLocation().x==pointslist.values()[place].getx()&&player1.getLocation().y>pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x, player1.getLocation().y-1);
if(player1.getLocation().x>pointslist.values()[place].getx()&&player1.getLocation().y>pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x-1, player1.getLocation().y-1);
if(player1.getLocation().x<pointslist.values()[place].getx()&&player1.getLocation().y<pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x+1, player1.getLocation().y+1);
if(player1.getLocation().x<pointslist.values()[place].getx()&&player1.getLocation().y>pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x-1, player1.getLocation().y-1);
if(player1.getLocation().x>pointslist.values()[place].getx()&&player1.getLocation().y<pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x-1, player1.getLocation().y+1);
if(player1.getLocation().x<pointslist.values()[place].getx()&&player1.getLocation().y>pointslist.values()[place].gety())
player1.setLocation(player1.getLocation().x+1, player1.getLocation().y-1);
if(player1.getLocation().x==pointslist.values()[place].getx()&&player1.getLocation().y==pointslist.values()[place].gety())
{
timer.stop();
}
}
});
timer.start();
}
});
}
public static void main(String[] args) {
mainframe frame = new mainframe();
frame.setVisible(true);
}
}
骰子类:
class Die{
// Note: If we changed the class definition to "public class Die"
// then we would put this class definition in a separate file Die.java
// Represents one die (singular of dice) with faces showing values
// between 1 and 6.
private final int MAX = 6; // maximum face value
private int faceValue; // current value showing on the die
//-----------------------------------------------------------------
// Constructor: Sets the initial face value.
//-----------------------------------------------------------------
public Die()
{
faceValue = 1;
}
// Alternate Constructor
public Die(int value)
{
faceValue = value;
}
//-----------------------------------------------------------------
// Rolls the die and returns the result.
//-----------------------------------------------------------------
public int roll()
{
faceValue = (int)(Math.random() * MAX) + 1;
return faceValue;
}
//-----------------------------------------------------------------
// Face value mutator.
//-----------------------------------------------------------------
public void setFaceValue (int value)
{
faceValue = value;
}
//-----------------------------------------------------------------
// Face value accessor.
//-----------------------------------------------------------------
public int getFaceValue()
{
return faceValue;
}
// Returns a string representation of this die.
public String toString()
{
String result = Integer.toString(faceValue);
return result;
}
}
以及所有位置的枚举:
public enum pointslist {
NOPOINT(-10,-10),
POINT1(15,500),
POINT2(70,500),
POINT3(125,500),
POINT4(180,500),
POINT5(230,500),
POINT6(285,500),
POINT7(338,500),
POINT8(390,500),
POINT9(445,500),
POINT10(500,500),
POINT11(500,450),
POINT12(445,450),
POINT13(390,450),
POINT14(338,450),
POINT15(285,450),
POINT16(230,450),
POINT17(180,450),
POINT18(125,450),
POINT19(70,450),
POINT20(15,450),
POINT21(15,395),
POINT22(70,395),
POINT23(125,395),
POINT24(180,395),
POINT25(230,395),
POINT26(285,395),
POINT27(338,395),
POINT28(390,395),
POINT29(445,395),
POINT30(500,395),
POINT31(500,342),
POINT32(445,342),
POINT33(390,342),
POINT34(338,342),
POINT35(285,342),
POINT36(230,342),
POINT37(180,342),
POINT38(125,342),
POINT39(70,342),
POINT40(15,342),
POINT41(15,290),
POINT42(70,290),
POINT43(125,290),
POINT44(180,290),
POINT45(230,290),
POINT46(285,290),
POINT47(338,290),
POINT48(390,290),
POINT49(445,290),
POINT50(500,290),
POINT51(500,235),
POINT52(445,235),
POINT53(390,235),
POINT54(338,235),
POINT55(285,235),
POINT56(230,235),
POINT57(180,235),
POINT58(125,235),
POINT59(70,235),
POINT60(15,235),
POINT61(15,180),
POINT62(70,180),
POINT63(125,180),
POINT64(180,180),
POINT65(230,180),
POINT66(285,180),
POINT67(338,180),
POINT68(390,180),
POINT69(445,180),
POINT70(500,180),
POINT71(500,130),
POINT72(445,130),
POINT73(390,130),
POINT74(338,130),
POINT75(285,130),
POINT76(230,130),
POINT77(180,130),
POINT78(125,130),
POINT79(70,130),
POINT80(15,130),
POINT81(15,75),
POINT82(70,75),
POINT83(125,75),
POINT84(180,75),
POINT85(230,75),
POINT86(285,75),
POINT87(338,75),
POINT88(390,75),
POINT89(445,75),
POINT90(500,75),
POINT91(500,20),
POINT92(445,20),
POINT93(390,20),
POINT94(338,20),
POINT95(285,20),
POINT96(230,20),
POINT97(180,20),
POINT98(125,20),
POINT99(70,20),
POINT100(15,20);
private final int x;
private final int y;
pointslist(int x,int y)
{
this.x=x;
this.y=y;
}
public int getx(){return x;};
public int gety(){return y;};
}
请注意,例如,如果玩家需要移动 从8号广场到14号广场走捷径 而不是遍历所有 9 10 11 12 13 我不想要它,我希望它一直到一个 certian 广场
【问题讨论】:
-
A
Timer充当伪循环,因此每次滴答作响,都是该循环的迭代,因此您的for-loop不会帮助您 -
这个概念相对简单(没有冒犯性),有几十个如果不是数百个例子展示了基本原理。你有一个起点,你有一个终点,你有一个(速度的)向量,你只需要通过向量量更新位置,直到它达到或超过目标点
-
我没有速度向量,我不知道速度向量如何帮助我我不想只改变标签的移动方式我有问题问题中的一半被隐藏了请再读一遍
-
你的向量是 +1 位置
-
除非你能提供一个可运行的例子,否则我怀疑我们可以做更多的事情来帮助你