![]() | 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(チンクチェント)。『カリオストロの城』でルパン三
世が乗っていたやつですね。
*/