gpt4 book ai didi

java - 为什么跳跃动画不显示?

转载 作者:行者123 更新时间:2023-12-02 02:47:42 26 4
gpt4 key购买 nike

我是一名初级程序员,最近开始尝试用 Java 制作游戏。

它非常基本,不包含任何类(尽管它应该),但无论如何我尝试使用 JLabel 作为我的 Sprite 在 JPanel 上制作跳跃动画但是每当我尝试使用 Thread.sleep(millis) 来计算标签每次移动之间的间隔时,Java 似乎会跳过它并将标签移动到最后一个位置。

JFrame frame = new JFrame("malario");
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);

frame.setVisible(true);
frame.setSize(700, 700);
JPanel panel = new JPanel();

panel.setLayout(null);
panel.setBackground(Color.blue);
JLabel malario = new JLabel("Malario");
malario.setOpaque(true);
malario.setBackground(Color.green);
panel.add(malario);

malario.setBounds(100, 550, 50, 50);

JLabel platform = new JLabel();
platform.setOpaque(true);
platform.setBounds(0,600,700,50);
panel.add(platform);
frame.setContentPane(panel);
frame.addKeyListener(new KeyListener() {
int originalx = 100;
int originaly = 550;
int currentlocx = originalx;
int currentlocy = originaly;

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}

@Override
public void keyPressed(KeyEvent e) {

if(e.getKeyCode()==KeyEvent.VK_RIGHT){
malario.setBounds(currentlocx+10,currentlocy , 50, 50);
currentlocx = currentlocx+10;
}

if(e.getKeyCode()==KeyEvent.VK_LEFT){
malario.setBounds(currentlocx-10,currentlocy , 50, 50);
currentlocx = currentlocx-10;
}
int jumpy=0;
if(e.getKeyCode()==KeyEvent.VK_UP){
jumpy= currentlocy-100;
while(jumpy!=currentlocy){

malario.setBounds(currentlocx,currentlocy-10 , 50, 50);
try {
Thread.sleep(1);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
currentlocy = currentlocy-10;
}
}
}
});

}
public static int Time(){
return (int)System.currentTimeMillis();
}
}

最佳答案

您不能使用 Thread.sleep()。

所有监听器代码都在事件调度线程 (EDT) 上执行,该线程负责处理事件和绘制 GUI。因此,当您告诉线程 sleep 时,GUI 无法重新绘制自身,直到循环中的所有代码执行完毕为止,因此您只能看到位于最后位置的组件。

相反,您需要使用 Swing Timer 来安排动画。阅读Swing Tutorial 。有以下部分:

  1. Swing 中的并发 - 解释有关 EDT 的更多信息
  2. 如何使用 Swing 计时器 - 有关使用计时器的示例

了解更多信息。

另外,不要使用 KeyListener。相反,最好使用按键绑定(bind)。本教程还有一个关于如何使用按键绑定(bind)的部分。

编辑:

请参阅:Motion Using the Keyboard 中的 KeyboardAnimation 示例一个显示两者的工作示例:

  1. 如何使用按键绑定(bind)
  2. 如何制作动画。

关于java - 为什么跳跃动画不显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44347550/

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