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