如何在Java中使用双缓冲AWT动画

时间:2012-04-28 22:55:32

标签: java animation double buffer awt

我最近开始使用Java进行双缓冲。我已经阅读了教程,向我展示了如何显示图像并使用鼠标和键盘事件移动它们。然而,这是我感到困惑的地方。我的程序很简单,窗口底部有一个矩形,可以通过LEFT和RIGHT键事件移动。然而,我无法弄清楚我的生活如何通过一个事件在屏幕上绘制另一个形状并继续缓冲它。

我希望能够在我已经绘制的矩形的X和Y位置按一个键来绘制一个“导弹”(在我的情况下是一个小椭圆形),然后向上射击。就像任何经典太空射击游戏一样。

然而,这并不是我的一个具体的具体问题,而是一个我不明白的概念。我学会了如何在Lua中做很多类似的事情,但是在初始化后绘制新图像或在关键事件上绘制图像时,我感到难过。

我的问题是:按照Java的init(),stop(),destroy(),start(),run(),paint()和update()循环的顺序,我用来缓冲一个新的形状/从关键事件到屏幕上的图像?

我用示例代码搜索了许多教程,但没有用。我已经学习了近8个月的Java,但无论我尝试理解什么基础或简单,就好像即使是最原始的教程也需要先验知识。

我的代码如下。

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;
    }
}

0 个答案:

没有答案