トップ » 技術記事 » パンダゼロと覚える ActionScript3.0(3) - Flashと表示リスト

パンダゼロと覚える ActionScript3.0(3) - Flashと表示リスト はてなブックマーク数 このエントリーをブックマークに追加

本連載では、Flash/Flex/AIR で使われる「ActionScript3.0」を会話形式で気軽に学ぶことを目標にしています。謎の生物「パンダゼロ」と一緒にActionScript3.0を覚えましょう。今回は、Flashと表示リストの仕組みを学びます。

これまでのあらすじと登場人物の紹介

ある日の夕暮れ。Flashで何か作ってみたい少女「ふみか」の部屋に不思議な生物「パンダゼロ」がやってきました。そして、パンダゼロは、親切に ActionScript3.0を教えてくれるのです。

【登場人物】

http://aoikujira.com/demo/hakkaku/rc/20080616_p100.png
パンダゼロ 謎の生物。AS3.0が得意。
http://aoikujira.com/demo/hakkaku/rc/20080616_f100.png
ふみか Flashで何か作ってみたいと思ってAS3を始める。
http://aoikujira.com/demo/hakkaku/rc/usi100.png
ウッシー パンダゼロの宿敵。

ウッシー現る!

http://aoikujira.com/demo/hakkaku/rc/panda32.png
パンダゼロ「ふみかちゃん、こんにちは。今日も、まったりとActionScript3.0を学んでいきましょうね。」
http://aoikujira.com/demo/hakkaku/rc/fumika32.png
ふみか「うん。今日もよろしく。」

と、その時、天井から不思議な丸い生物がさらに落ちてきました。

http://aoikujira.com/demo/hakkaku/rc/usi100.png

ウッシー「何をまったりとやっておる!!このペースでは、1年経っても連載が終わらないぞ!もっとスパルタにしないとダメだ!!」

そう言って、この丸い物体は、パンダゼロを押しつぶしてペチャンコにしてしまった。そして言いました。

http://aoikujira.com/demo/hakkaku/rc/usi32.png
ウッシー「ふみか、今日は、ワシが徹底的に教えてやるかならな!覚悟しておけよ。」
http://aoikujira.com/demo/hakkaku/rc/fumika32.png
ふみか「なに?!今日は、講師交代ってこと?!」
http://aoikujira.com/demo/hakkaku/rc/usi32.png
ウッシー「今日は、Flashの表示リストについて教えてやるぞ!」

その前におさらい

http://aoikujira.com/demo/hakkaku/rc/usi32.png
ウッシー「先日、ハローワールドをやったそうだな。ちょっと復習してみるか。」
http://aoikujira.com/demo/hakkaku/rc/fumika32.png
ふみか「うん。」

ウッシー「以下が、ハローワールドのスクリプトだ。Hello.as という名前で保存しよう。(ちょっと違うけどほぼ同じはず。)」

file: Hello.as

package {
	import flash.display.Sprite;
	import flash.text.TextField;

	public class Hello extends Sprite
	{
		public var txt:TextField; // TextField を宣言
		public function Hello()
		{
			// TextField の作成
			txt = new TextField();
			txt.text = "Hello World!";
			// 画面に表示する
			addChild(txt);
		}
	}
}

ウッシー「これをコンパイルするには、コマンドラインから次のように入力する。(もし、Hello.as を c:\AS3 というディレクトリに作成した場合 )」

cd C:\AS3
mxmlc Hello.as

ウッシー「ちなみに、Flex Builder を使っている人なら、SDKが以下のパスに入っている。わざわざ、無料のSDKをダウンロードしなくてもコンソールから使えるぞ。」

(Windowsの場合)
C:\Program Files\Adobe\Flex Builder 3\sdks\3.0.0\bin

※これをコマンドラインから使えるようにするには、パスを通さないといけません。詳しくは、第1回を参考にどうぞ。

表示リストについて

ウッシー「さて、前回は、ActionScript3.0では、package や class という枠の中にプログラムを書くというところを見たのだな。ところで、ハローワールドのコンストラクタ(初期化処理)を見てみよう。」

ふみか「コンストラクタって、クラス名と同じ名前の関数 Hello の部分のことよね?」

ウッシー「そうじゃ。次の部分だな。ここでは、TextFieldを作成して、これを画面に表示している部分だ。addChild()というところが、今回の肝となる部分じゃ。」

// TextField の作成
txt = new TextField();
txt.text = "Hello World!";
// 画面に表示する
addChild(txt);

ふみか「画面に表示するのに、addChild(=子供を追加する)ってなんか不思議な気がするわ。」

ウッシー「そう!よく気づいたな。Flash では、画面に複数の透明なシート(のようなもの)を重ねることができるようになっているのだ。」

Flashではシート(のようなもの)をいくつも重ねることができる
Flashではシート(のようなもの)をいくつも重ねることができる

ふみか「アニメのセル画みたいなものね。」

ウッシー「そう、このセル画のようなものを【表示オブジェクト】と呼ぶが、この上に何かを重ねるとき、上のように、addChild()を使うんだ。」

ふみか「へぇ~。」

ウッシー「文字じゃ面白くないだろう。今度は、絵をいくつも重ねてみよう。以下のソースを"Kasaneru.as"という名前で保存しろ。自分で入力するのも良いが、ささっと、コピペしてしまうのが早いだろうな。」

file:Kasaneru.as

package {
	import flash.display.Graphics;
	import flash.display.Sprite;

	public class Kasaneru extends Sprite {
		// スプライトを3つ宣言
		public var sp1:Sprite;
		public var sp2:Sprite;
		public var sp3:Sprite;

		public function Kasaneru() {
			// スプライトを3つ作る
			sp1 = new Sprite();
			sp2 = new Sprite();
			sp3 = new Sprite();
			// 赤色の四角を描画
			sp1.graphics.beginFill(0xFF0000);
			sp1.graphics.drawRect(0,0,200,200);
			sp1.graphics.endFill();
			// 青色の円を描画
			sp2.graphics.beginFill(0x0000FF);
			sp2.graphics.drawCircle(150,150,100);
			sp2.graphics.endFill();
			// 黄色の四角を描画
			sp3.graphics.beginFill(0xFFFF00);
			sp3.graphics.drawRect(150,150,200,200);
			sp3.graphics.endFill();
			// 表示リストにスプライトを追加
			addChild(sp1);
			addChild(sp2);
			addChild(sp3);
		}
	}
}

ウッシー「これをコンパイルするには、コマンドラインから次のように入力しよう。」

mxmlc Kasaneru.as

ふみか「わっ!図形が出た!」

実行してみたところ
実行してみたところ

ウッシー「どうだ。これは、Sprite(スプライト)を3つ作り、そこに色とりどりの図形を描いて、addChild()で表示してみたんだ。」

ふみか「スプライトっていうのは何?」

ウッシー「"Hello World!"の時にみた TextField も、ここで使った Sprite も画面に何かしらのものを表示する点では同じだ。しかし、TextField には、文字を表示することができて、Sprite には、図形や画像を表示することができるというように、役割分担されているんだ。つまり、Sprite を使うと、画像や図形を表示できるということを覚けばいいだろう。」

ふみか「なるほど。」

http://aoikujira.com/demo/hakkaku/rc/usi32.png
ウッシー「addChild()で画面にオブジェクトを表示できるというのが、表示リストだというのが分ったか?」
http://aoikujira.com/demo/hakkaku/rc/fumika32.png
ふみか「うん。なんとなく分かったよ。」
http://aoikujira.com/demo/hakkaku/rc/usi32.png
ウッシー「それでは、次に進もう。」

画像の表示

ウッシー「ここまで、図形を描画してきたが、Flashでは画像を読み込んで表示することもできる。次に、画像を表示する方法を覚えようか。」

ふみか「やった!ようやく、それっぽくなって来た!」

ウッシー「ActionScript3.0では、Flashファイル(SWF形式のファイル)に画像を埋め込んでおいてこれを表示させる方法と、サーバーにある画像を読み込んで表示する方法の2つが可能だ。ここでは、Flashファイルに画像を埋め込む方法を紹介しよう。」

ふみか「何を表示するの?」

ウッシー「それは、もちろんワシの顔に決まっているだろう。以下の画像を右クリックしてポップアップメニューから『画像を保存』をクリックしよう。そして、usi100.gifという名前で保存しよう。」

サンプル画像
サンプル画像

ウッシー「細かいことは、おいおい解説することにして、ここでは、以下のソースを、"Gazou.as" という名前で保存しよう。」

file:Gazou.as

package {
	import flash.display.Bitmap;
	import flash.display.Sprite;

	public class Gazou extends Sprite {
		// 画像埋め込みの宣言
		[Embed(source='usi100.gif')]
		private var ImageUsi100:Class;

		public function Gazou() {
			var bmp:Bitmap = new ImageUsi100() as Bitmap;
			addChild(bmp);
		}
	}
}

ウッシー「画像ファイルとActionScript3.0のファイル"Gazou.as"は、同じディレクトリにコピーしておくのだぞ。もう、コンパイルの仕方は大丈夫かな?」

>mxmlc Gazou.as

ふみか「もう、真っ黒のコンソール画面にも慣れてきたよ。えいっ!できた。」

画像を表示するサンプルを実行したところ
画像を表示するサンプルを実行したところ

ふみか「わぁ、画像が出た!」

ウッシー「以下のようにスクリプトを書くと、Flashファイルの中に、画像を埋め込むことができるのだ。そして、ImageUsi100 という名前で画像を利用できるようになる。」

// 画像埋め込みの宣言
[Embed(source='usi100.gif')]
private var ImageUsi100:Class;

ふみか「なるほど。それで埋め込んだ画像をどうやって使うの?」

ウッシー「うむ。埋め込んだ画像は、その直後で宣言したクラスと関連づけられるのだ。そのため、ImageUsi100 という名前のクラスならば、次のようにして、作成し画面に表示できる。Sprite と同じように画面に表示するときは、addChild() を使う。」

var bmp:Bitmap = new ImageUsi100() as Bitmap;
addChild(bmp);
画像を動かしてみよう

ふみか「でも、絵が1つだけじゃ、ちょっと寂しいな。もっと賑やかにしてよ!」

ウッシー「そうだな。じゃぁ、ワシの顔をもっとたくさん作って、画面中を動き回るようにしようか。」

ふみか「ちょっと怖いけどやってみたい!!」

ウッシー「それでは、以下のソースを"Gazou2.as"という名前で保存しよう。」

file:Gazou2.as

package
{
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;

	public class Gazou2 extends Sprite
	{
		// 画像埋め込みの宣言
		[Embed(source='usi100.gif')]
		private var ImageUsi100:Class;
		// 配列変数
		private var images:Array;
		// コンストラクタ(初期化処理)
		public function Gazou2() {
			images = new Array();
			for (var i:int = 0; i < 8; i++) {
				images[i] = makeUsi();
			}
			addEventListener(Event.ENTER_FRAME, doEnterFrame);
		}
		// 画像の生成処理
		public function makeUsi():Bitmap {
			var bmp:Bitmap = new ImageUsi100 as Bitmap;
			bmp.y = Math.random() * 300;
			bmp.x = Math.random() * 300;
			addChild(bmp);
			return bmp;
		}
		// 動かす
		public function doEnterFrame(e:Event):void {
			for each (var bmp:Bitmap in images) {
				bmp.x += Math.random() * 30;
				if (bmp.x > 400) bmp.x = 0;
				bmp.y += Math.random() * 30 - 10;
				if (bmp.y > 400) bmp.y = 0;
			}
		}
	}
}

ウッシー「そして、以下のように入力してコンパイルしよう!」

>mxmlc Gazou2.as

ふみか「えいやっ!でコンパイルして、実行すると・・・わっ、すごい動いている!!」

画像を表示する
画像を表示する

ウッシー「さすがに、ちょっと先取りしたかな。先のソースでは、配列変数の中に画像オブジェクトをたくさん入れておいて、定期的に動かすという処理を入れているんだ。」

ふみか「え?!配列変数?よくわからないけど、ウッシーをたくさん動かすことができるのね。分かったわ。」

ウッシー「まぁ、配列変数はまたの機会に紹介しよう。」

表示リストのまとめ

http://aoikujira.com/demo/hakkaku/rc/usi32.png
ウッシー「今日は、表示リストについて考えてみた。ここで紹介したのはほんの一握りの機能だけだがな。」
http://aoikujira.com/demo/hakkaku/rc/fumika32.png
ふみか「ウッシーがたくさん動いて楽しかったよ。」
http://aoikujira.com/demo/hakkaku/rc/usi32.png
ウッシー「それは良かった。パンダゼロより教え方上手だったろう?」

ウッシーがそう言った時でした。それまで、ぺしゃんこになっていたパンダゼロが起き上ってきました。

http://aoikujira.com/demo/hakkaku/rc/panda32.png
パンダゼロ「ようやく回復した・・・しかし、今回はもう終わってしまったようですね。ガッカリ。皆さん、ウッシーの説明は分かりましたか?また、次回お会いしましょう。」

今回は、Flash の表示リストの仕組みを少し紹介しました。Flash では、表示オブジェクトと呼ばれる絵などのオブジェクトを addChild() メソッドで追加することにより、画面に表示できるのでした。これらは、消したり(removeChild)順番を入れ替えたり(setChildIndex)することもできます。本来、表示リストの仕組みは、ツリー状になっており、親ガメの上に、子ガメを乗せて、その上に孫ガメを乗せて…と、いくらでも入れ子状に乗せることができます。この辺りの話は、また今度することにします。

ここでは、Flash では、表示リストの仕組みがあること、Sprite などのオブジェクトを作成したら、addChild() することで画面に表示できることの二点を覚えておきましょう。

Series Navigation«いちばん簡単なプログラムハローワールドを学ぶ

このサイトについて

八角研究所
株式会社八角研究所のWEBサイトですよー。 いろんなものを創り出すことのできる環境をコツコツ構築中。 いったい、いつになったらできるのか。 この技術情報サイトもそのための活動の一環のつもり。

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :