背景画像のスクロール

ゲームの背景画像をスクロールします。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして Shoot_02.java の名前で保存して下さい。
    //★ 背景画像のスクロール    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    class Shoot_02 extends JFrame
    {   Image       img;
        Dimension   size;
        Image       back;
        Graphics    buffer;
        int         pos= -1;
    
        // Main
        public static void main(String args[])
        {   new Shoot_02();
        }
    
        // Constructor
        public Shoot_02()
        {   super("Image View");
            img = getToolkit().getImage("c:\\data\\test\\Utyu.jpg");
            ThreadClass threadcls = new ThreadClass();
            Thread thread = new Thread(threadcls);
            thread.start();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(640, 480);
            setVisible(true);
            size = getSize();
            back= createImage(size.width, size.height);
            if (back==null) System.out.println("createImage Error");
        }
    
        //  Runnable Class
        class ThreadClass implements Runnable
        {
            public void run()
            {   long    nowTime,drawTime;
    
                nowTime= System.currentTimeMillis();
                drawTime= nowTime+500;
                while(true)
                {   nowTime= System.currentTimeMillis();
                    if (drawTime<nowTime)
                    {   drawTime= nowTime+30;
                        Update();
                        repaint();
                    }
                }
            }
        }
    
        // Paint Method
        public void paint(Graphics g)
        {   if (back==null || pos<0)    return;
            buffer= back.getGraphics();
            if (buffer==null)   return;
            size = getSize();
            buffer.drawImage(img,0,0,size.width,size.height,pos,0,pos+640,size.height,this);
            g.drawImage(back,0,0,this);
        }
    
        // 更新処理
        public void Update()
        {   long wk= (System.currentTimeMillis()/30)%640;
            pos= (int)wk;
        }
    }
    
  2. 画像ファイル("c:\\data\\test\\Utyu.jpg")をパスで指定したフォルダーに格納して下さい。
    Utyu.jpg はウインドウサイズ(640*480)に合わせた画像が横に二枚並んだ 1280*480 の画像です。

プログラムの説明

  1. 前回までの説明は キーでシップを操作 を参照して下さい。
    Image img は背景画像の領域です。
    size, back, buffer は描画の「チラツキ」を抑えるための Back Buffer です。
    Back Buffer の説明は Double Buffer を使う を参照して下さい。
    pos は背景をスクロールするためのオフセットです。
        Image       img;
        Dimension   size;
        Image       back;
        Graphics    buffer;
        int         pos= -1;
        
  2. スレッドで起動する ThreadClass です。
    30 _秒ごとに Update() メソッドを呼んで、repaint() で背景をスクロールします。
    能力の低いマシンではこの値を大きく(FPS を小さく)設定して下さい。
    FPS の説明は Thread で FPS を制御 または Runnable で FPS を制御 を参照して下さい。
        //  Runnable Class
        class ThreadClass implements Runnable
        {
            public void run()
            {   long    nowTime,drawTime;
    
                nowTime= System.currentTimeMillis();
                drawTime= nowTime+500;
                while(true)
                {   nowTime= System.currentTimeMillis();
                    if (drawTime<nowTime)
                    {   drawTime= nowTime+30;
                        Update();
                        repaint();
                    }
                }
            }
        }
        
  3. 背景のスクロールを設定する Update() メソッドです。
    高精度タイマーを取得して、pos に画像のオフセットを設定します。
    pos の値は「0〜639」を繰り返します。
    639 から 0 に戻る時に背景が連続するように画像を作成して下さい。
        // 更新処理
        public void Update()
        {   long wk= (System.currentTimeMillis()/30)%640;
            pos= (int)wk;
        }
        
  4. paint() メソッドでは BackBuffer にイメージを作成してから一挙に FrontBuffer に転送します。
    BackBuffer の準備が整っていることを確認します。
    drawImage() で pos の位置から pos+640 までの画像を描画します。
        // Paint Method
        public void paint(Graphics g)
        {   if (back==null || pos<0)    return;
            buffer= back.getGraphics();
            if (buffer==null)   return;
            size = getSize();
            buffer.drawImage(img,0,0,size.width,size.height,pos,0,pos+640,size.height,this);
            g.drawImage(back,0,0,this);
        }
        

【課題】

同様の手法で、背景を下方向にスクロールして下さい。
ウインドウと同じサイズの画像を用いて、左右(上下)に二分割して描画する方法もあります。
一工夫必要ですが、挑戦してみて下さい。

超初心者のプログラム入門(Java2)