我正在创建一个蛇游戏,我想从最基本的开始,在屏幕上移动一个三角形。但我在如何在屏幕上移动矩形方面遇到麻烦
这是我到目前为止的代码:
Screen.java
0
BodyPart.java
>> k = 2;
>> isAssigned = ~isempty(whos(char(f(k))))
isAssigned =
0
>> k = 3;
>> isAssigned = ~isempty(whos(char(f(k))))
isAssigned =
1
Frame.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) {}
}
因此,当我运行代码时,矩形仅显示在我设置的中心,并且它不会移动。无论如何要解决它吗?此外,状态栏也不会移动。 (有一些奇怪的东西,当我把所有东西放在一个文件中时,它确实有效)
另外,我打算使用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);
}
}
,是否可以将此程序与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>
?
谢谢
答案 0 :(得分:2)
我对Java不太熟悉,但似乎你从未调用BodyPart.draw()
方法更新BodyPart
。每当您想要更新BodyPart b
的位置时,请致电b.draw(g)
并传递Graphics g
对象。
对于状态栏,我认为它会帮助您了解main(String[] args)
方法仅在main /起始类中运行。它旨在为您的计划提供一个起点。因此,您应该在Frame
类中重命名该方法并调用它,或者您可以将代码移动到Frame
类的构造函数,它将在Frame
初始化时运行
我不知道你为什么不能使用LinkedList<>
。
答案 1 :(得分:2)
您的问题如下:
您创建的BodyPart对象x = 400且y = 400,此时您只更改了Screen类中变量x和y的值,这是错误的,因为Screen.x与BodyPart.x不同,所以当您执行类似Screen.x + = 10的操作时,您还需要从BodyPart更新x变量。
您的问题的快速解决方案可能是这样的:
向draw方法添加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);
}