グラフィックへ戻る | サンプル集目次へ戻る

実行結果
MultiScrollサンプルソース
透過GIFを動かして、背景を多重スクロールさせるぞ。青い空と、白い雲の下、黄色い車で、どこまでも走り続けよう!
Background.java
DrawPanel.java
MultiScroll.java
/**
 * 愛のJava256本ノック for Java 5.0
 * Javaサンプルソース ver0.2C "MultiScroll"
 * Background.java 「透過GIFを利用して、背景を多重スクロール」
 *
 * 2005/09/23 制作:安永ノリカズ
 *
 * 【コンパイル&実行方法】
 *     >javac *.java
 *     >java MultiScroll
 * 【キーワード】
 *     アクセサメソッド(accessor method), 
 * 【試してみよう】
 *     MultiScroll.java参照。
 */
import java.awt.Image;
import java.lang.String;
import javax.swing.ImageIcon;

public class Background {
    private Image I00;  // 画像
    private int I01;    // 幅
    private int I02;    // 表示位置
    private int I03;    // 移動速度

    public Background(String A00, int A01) {
        I00 = new ImageIcon(A00).getImage();
        I01 = I00.getWidth(null);
        I02 = 0;
        this.I03 = A01;
    }
    
    public Image M00() {
        return I00;
    }
    
    public int M01() {
        return I01;
    }

    public int M02() {
        return I02;
    }
   
    public void M03() {
        if (I00 != null) {
            I02 = (I02 + I03) % I01;
        }
    }
}

/* ■ クラスの外でちょっと一言 ■
背景画像を管理するクラスです。フィールド変数(プロパティ)をよく見てくだ
さい。これが一枚の背景に必要な情報です。

コンストラクターで行っているのが、そのフィールドの初期化。引数で渡された
情報や固定の数値を使って、フィールド変数に初期値を代入しています。

単純にフィールド変数の値を返すだけのメソッドがいくつかありますが、これら
には、get〜()という名前をつけるのが一般的。たとえば、private String name
とくれば、public String getName()てな具合ですね。今回のサンプルにはあり
ませんが、フィールドに値を設定するメソッドなら、set〜()となります。

ちなみに、ここでメソッド名を変えたら、呼び出し元のDrawPanel.javaも同じよ
うに変更してくださいね。
 */
↑ 先頭へ戻る
/**
 * 愛のJava256本ノック for Java 5.0
 * Javaサンプルソース ver0.2C "MultiScroll"
 * DrawPanel.java 「透過GIFを利用して、背景を多重スクロール」
 *
 * 2005/09/23 制作:安永ノリカズ
 *
 * 【コンパイル&実行方法】
 *     >javac *.java
 *     >java MultiScroll
 * 【キーワード】
 *     透過GIF(transparent gif), ジェネリックス(generics), 拡張forループ, 
 *     コレクションフレームワーク(Collections Framework), 
 *     
 * 【試してみよう】
 *     MultiScroll.java参照。
 */
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JPanel;

class DrawPanel extends JPanel implements ActionListener {
    List<Background> I00 = new ArrayList<Background>();

    public DrawPanel() {
        setPreferredSize(new Dimension(400, 300));

        I00.add(new Background("image/bg00.gif", 1));
        I00.add(new Background("image/bg01.gif", 2));
        I00.add(new Background("image/bg02.gif", 4));
        I00.add(new Background("image/bg03.gif", 0));
        I00.add(new Background("image/bg04.gif", 5));
    }

    public void actionPerformed(ActionEvent A00) {
        for (Background L00 : I00) {
            L00.M03();
        }

        repaint();
    }

    public void paintComponent(Graphics A00) {
        for (Background L00 : I00) {
            A00.drawImage(L00.M00(), L00.M02(), 0, this);
            A00.drawImage(L00.M00(), L00.M02() - L00.M01(), 0, this);
        }
    }
}

/* ■ クラスの外でちょっと一言 ■
このクラスは画面表示と画像の管理を担当しています。

まず注目してもらいたいのがコンストラクター。背景オブジェクトを生成して、
Listに追加してます。背景の生成時に指定するのは、画像ファイル名とスクロー
ルのスピード。遠くをゆっくり、手前を速く動かすことで、遠近感のある多重ス
クロールが実現されます。また、リストに追加する順番も重要です。この追加順
が描画順にもなるので、奥に配置するものから順番に追加していきます。

ここで使用する画像には、いくつかの仕掛けがあります。空、雲、地面、車、草
の5枚の背景が用意してあるんですが、空以外の4枚はGIFの透明色の指定を使っ
て、その下にある画像が透けて見えるようになってます。また、右の端が左の端
につながるループ構造にもなってます。画面サイズを400x300で固定してますの
で、画像はこのサイズ以上の幅が必要。今回は全て400x300でそろえています。

表示メソッドでは、まずスクロール位置に1回描画して、画像の幅ぶん左にずら
した位置にもう1回描画してます。こうすることで、背景のループを実現してい
ます。左右がループ構造になった画像を用意したのはこのため。よく観察する
と、右で消えて行く画像が、そのまま左に表示されているのに気づくでしょう。
 */
↑ 先頭へ戻る
/**
 * 愛のJava256本ノック for Java 5.0
 * Javaサンプルソース ver0.2C "MultiScroll"
 * MultiScroll.java 「透過GIFを利用して、背景を多重スクロール」
 *
 * 2005/09/23 制作:安永ノリカズ
 *
 * 【コンパイル&実行方法】
 *     >javac *.java
 *     >java MultiScroll
 * 【キーワード】
 *     フレームレート(frame rate)
 * 【試してみよう】
 *     GIF画像の透明処理を確認する。
 *     各背景のスクロールスピードを変えてみる。
 *     車を前に進めたり、小刻みに上下に動かしたりする。
 */
import java.lang.String;
import javax.swing.JFrame;
import javax.swing.Timer;

public class MultiScroll extends JFrame {

    final static int C00 = 33;    // 1秒あたりの描画回数

    public MultiScroll() {
        DrawPanel L00 = new DrawPanel();
        setContentPane(L00);

        new Timer(1000 / C00, L00).start();
    }

    public static void main(String[] A00) {
        MultiScroll L00 = new MultiScroll();
        L00.setTitle("背景の多重スクロール");
        L00.setDefaultCloseOperation(EXIT_ON_CLOSE);
        L00.setResizable(false);
        L00.pack();
        L00.setVisible(true);
    }
}

/* ■ クラスの外でちょっと一言 ■
背景を多重スクロールさせるサンプルです。MultiScroll、DrawPanel、
Backgroundの3つのクラスから構成されています。

このMultiScrollクラスはmainメソッドを持ったエントリーで、フレーム、描画
パネル、タイマーの生成を行ってます。DrawPanelクラスは描画用のパネル。タ
イマーイベントはこのパネルに通知されます。Backgroundクラスは、1枚の背景
を管理するクラス。背景の枚数分、このクラスのインスタンスが生成されます。

ちなみに、車はFiat500(チンクチェント)。『カリオストロの城』でルパン三
世が乗っていたやつですね。
 */
↑ 先頭へ戻る

安永ノリカズのゲーム制作&Javaサンプル集 / Java初心者用サンプル集『愛のJava256本ノック』