我最近开始在 Java 中使用双缓冲。我已阅读教程,这些教程向我展示了如何使用鼠标和键盘事件显示图像并移动它们。然而,这就是我感到困惑的地方。我的程序很简单,窗口底部有一个矩形,可以通过左右键事件移动。但是,我一生都无法弄清楚如何通过事件在屏幕上绘制另一个形状并继续缓冲它。
我希望能够在我已经绘制的矩形的 X 和 Y 位置按下一个键来绘制一个“导弹”(在我的情况下是一个小椭圆),并让它向上发射。就像任何经典的太空射击游戏一样。
然而,这并不是我的具体问题,而是我不理解的概念。我学会了如何在 Lua 中做许多类似的事情,但是当涉及到在初始化后绘制新图像或在关键事件时绘制图像时,我被难住了。
我的问题是:我使用 Java 的 init()、stop()、destroy()、start()、run()、paint() 和 update() 循环的什么顺序来将新形状/图像缓冲到关键事件的屏幕?
我用示例代码搜索了许多教程,但无济于事。我已经学习 Java 近 8 个月了,但无论我尝试理解的东西多么基础或简单,就好像即使是最原始的教程也需要必备知识。
我的代码如下。
import java.applet.*;
import java.awt.*;
public class SquareApplet extends Applet implements Runnable
{
int x_pos = 10;
int y_pos = 400;
int rectX = 50;
int rectY = 20;
int x_speed = 5;
private Image dbImage;
private Graphics dbg;
public void init( ) { }
//public void start() { }
public void stop( ) { }
public void destroy( ) { }
//public void run ( ) { }
//public void paint (Graphics g) { }
public void start()
{
// define a new thread
Thread th = new Thread (this);
// start this thread
th.start ();
}
public void run ()
{
// lower ThreadPriority
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
// run a long while (true) this means in our case "always"
while (true) //Runtime
{
if (x_pos > this.getSize().width - rectX) {x_pos = this.getSize().width - rectX;}
if (x_pos < 0) {x_pos = 0 ;}
// repaint the applet
repaint();
try
{
// Stop thread for 20 milliseconds
Thread.sleep (20);
}
catch (InterruptedException beepis)
{
// do nothing
}
// set ThreadPriority to maximum value
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}
public void paint (Graphics g)
{
// set background color
g.setColor(Color.black);
g.fillRect(0,0,this.getSize().width,this.getSize().height);
// set player color
g.setColor (Color.white);
// paint a filled colored rectangle
g.fillRect(x_pos, y_pos, rectX,rectY );
}
public void update (Graphics g)
{
// initialize buffer
if (dbImage == null)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
}
// clear screen in background
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
// draw elements in background
dbg.setColor (getForeground());
paint (dbg);
// draw image on the screen
g.drawImage (dbImage, 0, 0, this);
}
//KEY EVENTS
public boolean keyDown(Event e, int key)
{
//Up Down Left Right
if (key == Event.LEFT)
{
x_pos -= x_speed;
}
if (key == Event.RIGHT)
{
x_pos += x_speed;
}
return true;
}
}