2

私は最近、Javaでダブルバッファリングを使い始めました。マウスとキーボードのイベントを使用して画像を表示および移動する方法を示したチュートリアルを読みました。しかし、これは私が混乱するところです。私のプログラムは単純です。ウィンドウの下部に長方形があり、LEFTおよびRIGHTキーイベントによって移動できます。しかし、イベントによって画面に別の図形を描画し、それをバッファリングし続ける方法を一生理解することはできません。

キーを押して、すでに描いた長方形の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;
    }
}
4

0 に答える 0