gpt4 book ai didi

Java如何不断重绘

转载 作者:行者123 更新时间:2023-12-02 04:35:01 24 4
gpt4 key购买 nike

我正在尝试制作 Snake 游戏,尽管我目前在不断重新绘制蛇上遇到麻烦。我正在使用计时器,当我将间隔设置为 150 毫秒时,它起作用了,尽管当我将它设置为更快的时间(例如 30 毫秒)时,屏幕上没有显示任何内容。带有 repaint() 调用的计时器位于 Game 类中。谢谢!

游戏类

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;
import java.util.*;
import java.util.Timer;
import java.util.TimerTask;

public class Game extends JFrame{

JPanel mainPanel = new JPanel();

BorderLayout layout = new BorderLayout();
//Game game;
Snake snake = new Snake(this);

public Game(){

super("Snake by Alex 2017");
setSize((int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth()),(int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight()));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

mainPanel.setLayout(null);
mainPanel.setSize((int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth()),(int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight()));
mainPanel.setBackground(Color.BLACK);
add(mainPanel);
mainPanel.setVisible(true);

start();

addKeyListener(new KeyListener() {

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyReleased(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
snake.keyPressed(e);

}
});
setFocusable(true);



}

public void paint(Graphics g){
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
snake.paint(g2d);

//System.out.println("hello");

}

Timer timer = new Timer();
TimerTask task = new TimerTask() {
public void run() {
try {
move();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
};
TimerTask update = new TimerTask() {

public void run() {
repaint();

}
};
public void start(){
timer.scheduleAtFixedRate(task, 0, 250);
timer.schedule(update, 0, 30);

}

public void move() throws InterruptedException{
snake.move();

}

public static void main(String[] args) throws InterruptedException{
Game game = new Game();


}

}

蛇类

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;

import javax.swing.RepaintManager;

public class Snake {

public int x = 60;
public int y = 80;
public int xa = 0;
public int ya = 0;
public int speed = 20;
private Game game;

public Snake(Game game){
this.game = game;
}

public void move(){
x += xa;
y += ya;
}

public void keyPressed(KeyEvent e){
//RIGHT
if(e.getKeyCode() == 39){
xa = speed;
ya = 0;
}
//LEFT
if(e.getKeyCode() == 37){
xa = -speed;
ya = 0;
}
//UP
if(e.getKeyCode() == 38){
ya = -speed;
xa = 0;
}
//DOWN
if(e.getKeyCode() == 40){
ya = speed;
xa = 0;
}
//move();
//game.repaint();

}
public Rectangle getBounds(){
return new Rectangle(x, y, 20, 20);
}
public void paint(Graphics2D g2d){
g2d.setColor(new Color(48, 255, 55));
g2d.fillRect(x, y, 20, 20);

}

}

最佳答案

您需要做的是创建一个一直循环并渲染您的游戏的线程,例如:

public void run() {
while (true) {
render();
}
}

您的运行方法是正确的,但您还需要扩展 Thread 以在额外的线程中一遍又一遍地重新绘制 see this post for multithreading .

有关 BufferStrategy 的所有详细信息以及更多信息,请关注 Tutorial .我认为它的解释非常好,我自己使用了它。

关于Java如何不断重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44396204/

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