我在这里有一个类项目,我必须制作一个可以工作的小行星游戏。现在,我一直在努力让关键事件得到认可。我已经阅读和观看了教程,并让它们发挥了作用,但在这种环境中实现同样的东西并没有帮助。我希望也许有人能指引我朝着正确的方向前进。
这是用键操作方法实现KeyListener的主类,它生成了我的Ship对象并设置了一个"沙箱"。"沙盒"是显示对象的Jframe。"Sandbox"是从我在课堂上收到的一个外部jar中导入的,也是从"blobfx.jar"中导入的
package Asteroid;
import java.util.Random;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import blobfx.SandBox;
import blobfx.SandBoxMode;
public class AsteroidMain implements KeyListener{
// ^^^^^^^^^^^^ currently has error: "The type AsteroidMain must implement the inherited abstract method KeyListener.keyPressed(KeyEvent)"
private static Random random = new Random();
public static void main(String[] args) {
SandBox sb = new SandBox();
sb.setFrameRate(66);
// makes window for objects at frame rate of 15
Ship shipThing = new Ship();
sb.addBlob( shipThing );
// makes ship object then adds it to the window
SandBox.simulate(sb);
// draws the objects on screen
}
@Override
public void keyPressed(KeyEvent e, Ship shipThing) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ currently has error: "The method keyPressed(KeyEvent, Ship) of type AsteroidMain must override or implement a supertype method"
if(e.getKeyCode() == 38){
shipThing.moveForward();
System.out.println("KEY PRESSED");
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
这是我的船类,当按下UP键时,我想继续前进。
package Asteroid;
import java.lang.Math;
import blobfx.PolyBlob;
public class Ship extends PolyBlob{
private double angle = 0.0;
private final double delta = 0.15;
private final double speed = 5.0;
public Ship( ){
super(0,0,0);
int x[] = {10, -10, -5, -10};
int y[] = { 0, -7, 0, 7};
setPolygon( x, y );
// sets vertices that draws the ship polygon
setLoc( 200, 200 );
}
public void moveForward(){
System.out.println( "MOVING FORWARD");
setLoc( getLoc().x + (int) Math.round(speed * Math.cos(angle)),
getLoc().y + (int) Math.round(speed * Math.sin(angle))
);
}
public void turnLeft(){
}
public void turnRight(){
}
}
首先看一下KeyListener
的JavaDocs
您未实施keyPressed(KeyEvent)
违反了接口的合同要求
这个。。。
@Override
public void keyPressed(KeyEvent e, Ship shipThing) {
应该给你一个编译器错误,告诉你你没有重写一个方法,它应该是
@Override
public void keyPressed(KeyEvent e) {
你不能仅仅"发明"参数,接口描述了任何实现都必须满足的预期需求
话虽如此,我强烈反对使用KeyListener
来支持密钥绑定API,请参阅如何使用密钥绑定了解更多详细信息