gpt4 book ai didi

java - 在面板上移动一个矩形

转载 作者:行者123 更新时间:2023-11-29 03:07:19 24 4
gpt4 key购买 nike

我正在创建一个贪吃蛇游戏,我想从最基本的开始,即在屏幕上移动一个三角形。但是我在如何使矩形在屏幕上移动时遇到了麻烦

这是我目前的代码:

屏幕.java

public class Screen extends JPanel implements ActionListener, KeyListener {
public static final JLabel statusbar = new JLabel("Default");
public static final int WIDTH = 800, HEIGHT = 800;
Timer t = new Timer(50, this);
int x = 400;
int y = 400;
int velx = 0;
int vely = 0;

private BodyPart b;

public Screen(){

b = new BodyPart(x, y);
t.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}

public static void main(String[] args) {

}

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(new Color(10, 50, 0));
g.fillRect(0, 0, WIDTH, HEIGHT);

g.setColor(Color.BLACK);
for(int i = 0; i < WIDTH / 10; i++) {
g.drawLine(i * 10, 0, i * 10, HEIGHT);
}

for(int i = 0; i < HEIGHT / 10; i++) {
g.drawLine(0, i * 10, WIDTH, i * 10);
}

b.draw(g);
}

public void up(){
vely = -10;
velx = 0;
}
public void down(){
vely = 10;
velx = 0;
}
public void left(){
vely = 0;
velx = -10;
}
public void right(){
vely = 0;
velx = 10;
}


@Override
public void actionPerformed(ActionEvent e) {
repaint();
x += velx;
y += vely;
}

@Override
public void keyTyped(KeyEvent e) {}

@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_DOWN: down();
System.out.println("Down");
break;
case KeyEvent.VK_UP: up();
System.out.println("up");
break;
case KeyEvent.VK_LEFT: left();
System.out.println("left");
break;
case KeyEvent.VK_RIGHT: right();
System.out.println("right");
break;
}
}

@Override
public void keyReleased(KeyEvent e) {}
}

BodyPart.java

public class BodyPart {

int x;
int y;

public BodyPart(int x, int y) {
this.x = x;
this.y = y;
}

public void draw(Graphics g) {
g.setColor(Color.red);
g.fillRect(x, y, 10, 10);
g.setColor(Color.white);
g.drawRect(x, y, 10, 10);
}
}

框架.java

public class Frame extends JPanel {
private static JLabel statusbar = new JLabel("Default");

public Frame(){
statusbar = Screen.statusbar;
}

public static void main(String[] args) {
JFrame f = new JFrame();
Screen s = new Screen();
BodyPart b = new BodyPart(400,400);
f.add(s);
f.add(statusbar, BorderLayout.SOUTH);
f.setSize(800, 800);
f.setVisible(true);
f.setLocationRelativeTo(null);
f.setResizable(false);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

因此,当我运行代码时,矩形仅显示在我设置的中心位置,并且不会移动。无论如何要解决它?此外,状态栏也没有移动。 (有些奇怪,当我将所有内容放在一个文件中时,它确实有效)

此外,我打算使用 linkedlist<Point> , 是否可以将此程序与 linkedlist<> 混合使用?或者我必须更改我的代码才能使用 linkedlist<>

谢谢

最佳答案

您的问题如下:

从那一刻起,您创建了 x = 400 和 y = 400 的 BodyPart 对象,您只更改了 Screen 类中变量 x 和 y 的值,这是错误的,因为 Screen.x 与 BodyPart.x 不同,所以当您执行类似 Screen.x += 10 的操作时,您还需要从 BodyPart 更新 x 变量。

您的问题的快速解决方案可能是这样的:

向您的绘制方法添加 2 个参数并传递图形对象、x 和 y 更新值。

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(new Color(10, 50, 0));
g.fillRect(0, 0, WIDTH, HEIGHT);

g.setColor(Color.BLACK);
for(int i = 0; i < WIDTH / 10; i++) {
g.drawLine(i * 10, 0, i * 10, HEIGHT);
}

for(int i = 0; i < HEIGHT / 10; i++) {
g.drawLine(0, i * 10, WIDTH, i * 10);
}

b.draw(g, x, y);
}

接收 x 和 y 更新值并更新 BodyPart x 和 y 变量。

  public void draw(Graphics g, int x, int y) {
this.x = x;
this.y = y;

g.setColor(Color.red);
g.fillRect(x, y, 10, 10);
g.setColor(Color.white);
g.drawRect(x, y, 10, 10);
}

关于java - 在面板上移动一个矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31497895/

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