我最近一直在用 java 开发一个快速的小型太空入侵者游戏,我遇到了一个小问题,因为“外星人”没有正确移动。我通过快速的谷歌搜索发现我只需要添加一个构造函数并覆盖它,但是当我这样做时遇到了一个有趣的错误消息:
错误:找不到符号:super.cpuMove(m);
^(this points directly to the "." in the original error message)
我最终找到了一种通过更改代码来完全避免此错误的方法,但是该更改增加了大约 50 到 60 行不必要的行,我非常想将它们转换回几行快速的行。这是发生此错误的代码部分:
@Override
protected void cpuMove(ShapesMove m){
super.cpuMove(m);
cpu_x(m);
cpu_y(m);
}
为什么无论我对其余代码进行什么更改,每次都会出现此错误消息?此外,为什么它指向“。” 而不是“超级”或“cpuMove(m)”?我希望能够适应这个,但似乎 Java 不会让我这样做。
编辑:
这是我的其余代码。我想也许是别的东西,我不必发布这个,所以我为此道歉:
import javax.swing.*;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
public class ShapesMove extends JPanel{
public static int x = 40;
public static int y = 40;
public static int h = 240;
public static int k = 240;
public static void main(String[] args){
final JFrame frame = new JFrame("Movement of 2d Shapes");
final ShapesMove m = new ShapesMove();
frame.setSize(400,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(m);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
Action actionRight = new AbstractAction(){
public void actionPerformed(ActionEvent actionRightEvent){
x += 10;
m.repaint();
}
};
Action actionLeft = new AbstractAction(){
public void actionPerformed(ActionEvent actionLeftEvent){
x -= 10;
m.repaint();
}
};
Action actionUp = new AbstractAction(){
public void actionPerformed(ActionEvent actionUpEvent){
y -= 10;
m.repaint();
}
};
Action actionDown = new AbstractAction(){
public void actionPerformed(ActionEvent actionDownEvent){
y += 10;
m.repaint();
}
};
KeyStroke right = KeyStroke.getKeyStroke("RIGHT");
KeyStroke left = KeyStroke.getKeyStroke("LEFT");
KeyStroke up = KeyStroke.getKeyStroke("UP");
KeyStroke down = KeyStroke.getKeyStroke("DOWN");
InputMap inputMap = m.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(right, "RIGHT");
inputMap.put(left, "LEFT");
inputMap.put(up, "UP");
inputMap.put(down, "DOWN");
m.getActionMap().put("RIGHT", actionRight);
m.getActionMap().put("LEFT", actionLeft);
m.getActionMap().put("UP", actionUp);
m.getActionMap().put("DOWN", actionDown);
}
@Override
protected void cpuMove(ShapesMove m){
super.cpuMove(ShapesMove m);
cpu_x(m);
cpu_y(m);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
draw(g);
}
public void cpu_x(ShapesMove m){
if(h > x){
h -= 10;
m.repaint();
}else if(h < x){
h += 10;
m.repaint();
}else{
m.repaint();
}
}
public void cpu_y(ShapesMove m){
if(k > y){
k -= 10;
m.repaint();
}else if(k < y){
k += 10;
m.repaint();
}else{
m.repaint();
}
}
public void draw(Graphics g){
g.drawOval(x, y, 40, 40);
g.drawRect(h, k, 40, 40);
}
}
关于代码的一些简短说明:首先,我知道我说过这是一个太空入侵者游戏,而现在这真的只是几乎没有相似之处,它是一个 WIP。我在 Photoshop 中制作自己的图像和动画背景,这就是为什么我绘制了一个矩形和圆形而不是调用图像。这样做的真正目的是模拟游戏中的敌人在调用方法时如何“跟随”玩家,因为我希望这个游戏也有一些“Galaga”方面。