我决定编写一个小程序,在其中需要操作一个矩形。如果按“U”键,矩形将向上移动,如果按“D”键,矩形将向下移动。它有自己的速度,当程序启动时它会自己下降,当你按下按键时速度不会归零,所以它原来是一种重力,不断地向下拉它。
另外,除了上面列出的所有属性之外,我还想编写以下条件:如果没有按下任何东西,则速度为 70(即,它有效),如果按下了某些东西(U 或 D),则速度为重置为零,重力不会阻止它上升。
我不能这样做(更准确地说,它可以工作,但是当我第一次按下它时,即使我释放按钮,速度也会完全重置为零,但我不需要)。请告诉我如何实施!
第一类:
package Gravitation;
import javax.swing.*;
public class GameWindow extends JFrame {
public static GameWindow window;
public static JTextField textField;
public static void main(String[] args) {
window = new GameWindow();
window.setSize(728,563);
GameField gameField = new GameField();
textField = new JTextField();
window.add(gameField);
Management.management();
GameField.field();
gameField.add(textField);
window.setVisible(true);
window.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
第二类:
package Gravitation;
import javax.swing.*;
import java.awt.*;
public class GameField extends JPanel {
public static float x = 509, y = 218, v = 70;
public static long last_frame_time;
public static void field(){
last_frame_time = System.nanoTime();
}
public static void onRepaint(Graphics g){
long c_time = System.nanoTime();
float delta_time = (last_frame_time-c_time) * 0.000000001f;
last_frame_time = c_time;
y = y - v * delta_time;
g.setColor(Color.BLACK);
g.fill3DRect((int)x,(int)y,75,45,true);
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
onRepaint(g);
repaint();
}
}
第三类:
package Gravitation;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class Management {
public static void management(){
GameWindow.textField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_U){
GameField.y-=4;
}
if(e.getKeyCode()==KeyEvent.VK_D){
GameField.y+=4;
}
}
});
}
}
你实现程序的方式很奇怪。这通常以不同的方式完成。让我们退一步看看如何:
MovableFigure:美好的。现在我们来写一下它的实现:
让我们在 GameField 类中创建一个字段:
setMotion()形状对象:move()每次调用一个方法一次?班级会帮助我们解决这个问题java.util.Timer。首先,让我们创建一个对象java.util.TimerTask并在方法中指定run()计时器每次需要执行的操作:GameField负责移动图形的类中删除旧代码。并且还必须repaint()从 中删除呼叫paintComponent()。否则你就会得到它StackOverflowError,因为repaint()最终它会打电话给你paintComponent()。