Java游戏在战斗中冻结

Java游戏在战斗中冻结,java,swing,paint,freeze,paintcomponent,Java,Swing,Paint,Freeze,Paintcomponent,我正在编写一个java游戏,我想做的是当我按下空格键时,角色进入战斗模式5秒,然后释放它。我已经这样做了,我按下一次,战斗模式被启用,当我按下另一次,它被释放,但当我像这样尝试时(底部代码),游戏只是冻结了5秒,但什么都没有发生,我甚至没有得到一个错误代码 import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import javax.swing.JPanel; public class Zeichn

我正在编写一个java游戏,我想做的是当我按下空格键时,角色进入战斗模式5秒,然后释放它。我已经这样做了,我按下一次,战斗模式被启用,当我按下另一次,它被释放,但当我像这样尝试时(底部代码),游戏只是冻结了5秒,但什么都没有发生,我甚至没有得到一个错误代码

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

public class Zeichnen extends JPanel {

    int x = 10;
    int y = 335;
    int width = 100;
    int height = 106;
    int speed = 10;
    boolean left = false;
    boolean fight = false;
    String file = "res/character.png";
    Image character;

    public void paint(Graphics g) {
        super.paintComponent(g);
        character = Toolkit.getDefaultToolkit().getImage(file);
        g.drawImage(character, x, y, width, height, this);
    }

    public void moveLeft() {
        if (left == false) {
            left = true;
            if (fight == true) {
                x = x + 129;
                width = -129;
            } else if (fight == false) {
                x = x + 100;
                width = -100;
            }
        }
        x = x - speed;
        rand();
        repaint();
    }

    public void moveRight() {
        if (left == true) {
            left = false;
            if (fight == true) {
                x = x - 129;
                width = 129;
            } else if (fight == false) {
                x = x - 100;
                width = 100;
            }
        }
        x = x + speed;
        rand();
        repaint();
    }

    public void moveUp() {
        y = y - speed;
        repaint();
    }

    public void moveDown() {
        y = y + speed;
        repaint();
    }

    public void fight() {
        long curTime = System.currentTimeMillis();
        fight = true;
        file = "res/character_fight.png";
        if (left == true) {
            width = -129;
        } else if (left == false) {
            width = 129;
        }
        repaint();
        if (System.currentTimeMillis() > curTime + 5000) {
            fight = false;
            file = "res/character.png";
            if (left == true) {
                width = -100;
            } else if (left == false) {
                width = 100;
            }
            repaint();
        }
    }

    public void rand() {
        if (x <= -130) {
            x = 770;
        } else if (x >= 770) {
            x = -130;
        }
    }
}
导入java.awt.Graphics;
导入java.awt.Image;
导入java.awt.Toolkit;
导入javax.swing.JPanel;
公共类Zeichnen扩展了JPanel{
int x=10;
int y=335;
整数宽度=100;
内部高度=106;
内速度=10;
布尔左=假;
布尔战斗=假;
String file=“res/character.png”;
图像特征;
公共空间涂料(图g){
超级组件(g);
character=Toolkit.getDefaultToolkit().getImage(文件);
g、 drawImage(字符、x、y、宽度、高度、此);
}
公共空间左移(){
如果(左==假){
左=真;
如果(战斗==真){
x=x+129;
宽度=-129;
}else if(fight==false){
x=x+100;
宽度=-100;
}
}
x=x-速度;
兰德();
重新油漆();
}
公权{
如果(左==真){
左=假;
如果(战斗==真){
x=x-129;
宽度=129;
}else if(fight==false){
x=x-100;
宽度=100;
}
}
x=x+速度;
兰德();
重新油漆();
}
公共空间向上移动(){
y=y-速度;
重新油漆();
}
公共无效向下移动(){
y=y+速度;
重新油漆();
}
公众虚空斗争(){
long curTime=System.currentTimeMillis();
战斗=真实;
file=“res/character\u fight.png”;
如果(左==真){
宽度=-129;
}else if(左==假){
宽度=129;
}
重新油漆();
if(System.currentTimeMillis()>curTime+5000){
战斗=虚假;
file=“res/character.png”;
如果(左==真){
宽度=-100;
}else if(左==假){
宽度=100;
}
重新油漆();
}
}
公共空间(){
如果(x=770){
x=-130;
}
}
}

应遵守
喷漆
链式机构,您应覆盖
喷漆组件
,而不是
喷漆
。也不要在绘制时加载图像,在初始化
JPanel
时加载它们。

我不理解您的问题,您希望在按下一个键时,角色的图像会改变5秒钟吗?在这种情况下,您应该实现一个侦听器,然后打开一个计时器来安排计时器任务

TimerTask task = new TimerTask()  {
        @Override
        public void run() {
            //reset your character to normal state
            }
        }
};
new Timer().schedule(task, 5000);

你将需要更多的工作来找出你的问题,除非你能找到更具体的错误细节,否则你不可能得到任何答案。使用调试器并逐步执行它。为了更好地帮助您尽快发布,这就是一些用户投票否决的原因…我认为getImage会缓存对该文件名的请求。但是,最好只加载一次所需的图像。-绝对重写paintComponent而不是paint(特别是因为您正确地调用了paintComponent的超类)。如果super.paintComponent调用paint,您不希望意外地陷入递归调用循环。从paint文档中可以看到:“这个方法实际上将绘制工作委托给三个受保护的方法:paintComponent、paintBorder和paintChildren。”--另外,如果您有“if(left==true)”这样的测试,您可以只做“if(left)”:)使用
javax.swing.Timer
来实现这一点。将在EDT上执行GUI更新。