Я хотел бы перекрасить свой экран.На данный момент все, что он делает, это показывает первый экран с точкой, где должна быть голова.Это нормально, однако я написал в своем коде, что хочу опускать голову на 10 пикселей каждую секунду.Я печатаю, в какой точке должна находиться голова, и в командной строке она показывает, что значение y действительно увеличивается.Однако на моем экране голова не двигается.
Я пытался использовать метод revalidate, пытаясь расширить класс canvas вместо jframe, я пытался использовать другие классы только для метода paint, я пытался заменитьметод рисования с методом paintComponent.И, как вы, вероятно, можете сказать, у меня плохое понимание всего, что связано с рисованием в Java.Я пытался читать в эти суперклассы, но они слишком сложны для меня, чтобы понять.Я также пытался бежать без объявления сна.Это не имело значения.
Основной класс: этот класс содержит метод main для запуска игры со змеями.
import java.util.concurrent.TimeUnit;
public class Main{
public static void main(String[] args) throws InterruptedException {
Main programma = new Main();
programma.rungame();
}
void rungame() throws InterruptedException {
AllGUIElements gui = new AllGUIElements();
gui.gui();
while (true) {
TimeUnit.SECONDS.sleep(1);
gui.setGameScreen();
}
}
}
Класс AllGUIElements: этот класс создает новый фрейм, содержащий новыйпанель.Эта панель окрашивается с помощью paintComponent.setGameScreen обновляет положение головы и, как предполагается, перерисовывает экран.
import javax.swing.*;
import java.awt.*;
public class AllGUIElements extends JPanel {
private JFrame frame;
private JPanel panel;
private int screen;
Snake hoofd = new Head(new Point(30,30),3,null);
void gui() throws InterruptedException {
frame = new JFrame("Snake Game");
panel = new AllGUIElements();
panel.setBackground(Color.GRAY);
panel.setSize(1000,500);
frame.setSize(1000,500);
frame.add(panel);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void setGameScreen() {
repaint();
if (hoofd.getDirection() == 1) {
hoofd.setPosition(new Point(hoofd.getPosition().x, hoofd.getPosition().y-10));
}
if (hoofd.getDirection() == 2) {
hoofd.setPosition(new Point(hoofd.getPosition().x+10, hoofd.getPosition().y));
}
if (hoofd.getDirection() == 3) {
hoofd.setPosition(new Point(hoofd.getPosition().x, hoofd.getPosition().y+10));
}
if (hoofd.getDirection() == 4) {
hoofd.setPosition(new Point(hoofd.getPosition().x-10, hoofd.getPosition().y));
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.DARK_GRAY);
g.fillRect(0, 0, 1000, 10);
g.fillRect(0, 0, 10, 500);
g.fillRect(990, 0, 10, 500);
g.fillRect(0, 490, 1000, 10);
g.setColor(Color.GREEN);
g.fillRect(hoofd.getPosition().x, hoofd.getPosition().y, 10, 10);
}
}
Класс экранобъекта: Родительский класс Snake and Food (который не опубликован, поскольку в нем нет необходимости), который возвращает положение головы, часть тела и еда.
import java.awt.*;
public class Screenobject{
Point pos;
Screenobject(Point pos){
this.pos = pos;
}
void setPosition(Point pos){
this.pos = pos;
}
Point getPosition() {
return pos;
}
}
Змея-класс: Дитя экрана и объект Головы и Тела.Этот класс устанавливает направление объектов.
import java.awt.*;
public class Snake extends Screenobject{
int direction;
//directions:
//1 = up
//2 = right
//3 = down
//4 = left
Snake nextpart;
Snake(Point pos, int direction, Snake nextpart){
super(pos);
this.direction = direction;
this.nextpart = nextpart;
}
int getDirection() {
return direction;
}
}
Класс головы: дочерний класс змеи, и предполагается, что он является первым объектом связанного списка для змеи.
import java.awt.*;
public class Head extends Snake{
Head(Point pos, int direction, Snake nextpart){
super(pos, direction, nextpart);
}
}
Класс тела: Детский класс Змеи и растет с каждой едой.
import java.awt.*;
public class Body extends Snake{
Body(Point pos, int direction, Snake nextpart){
super(pos, direction, nextpart);
}
}