Flashとおやつの会

おやつを食べながらFlashとかを勉強しよう

配列について

without comments

配列とは

AS3を含む多くのプログラムでは、同じような値をまとめて管理するための仕組みが用意されています。プログラミングの上級者は初級者よりもずっとプログラムを効率よく、柔軟に作ることができます。でも、上級者はミスを全くしないから、効率が良いのではありません。
彼・彼女達はまとめて管理する仕組みを上手く使うことにより、ミスをしにくいプログラムを書いているのです。
ここでは最も基本的な「まとめて管理する仕組み」の、配列の説明をします。

極基本の説明

実例をみながらおさらい。

参考
http://oshige.com/flash/as3note/chapter3/

例えば、次のようなスクリプトを作ったとします。

丸がランダムな位置に移動する – wonderfl build flash online
/*
ステージ上をクリックすると、丸がランダムな位置に移動します。
*/
package{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	public class Main extends Sprite{
		private var _maru:Sprite = new Sprite();
		private var _onPositionX:Number = 0;
		private var _onPositionY:Number = 0;
		public function Main(){

			_maru.graphics.beginFill(0xFF0000);
			_maru.graphics.drawCircle(0,0,50);
			_maru.graphics.endFill();
			this.addChild(_maru);

			this.addEventListener(Event.ENTER_FRAME,onEnter);
			stage.addEventListener(MouseEvent.CLICK,onClick);
		}
		private function onClick(event:MouseEvent):void{
			_onPositionX = Math.random()*stage.stageWidth;
			_onPositionY = Math.random()*stage.stageHeight;
		}

		private function onEnter(event:Event):void{
			var dx:Number = _onPositionX - _maru.x;
			var dy:Number = _onPositionY - _maru.y;
			_maru.x += dx*0.1;
			_maru.y += dy*0.1;
		}
	}
}

このスクリプトを元に、丸の数を5つにします。

5つの丸がランダムな位置に移動する – wonderfl build flash online
/*
ステージ上をクリックすると、丸がランダムな位置に移動します。
*/
package{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	public class Main extends Sprite{
		private var _maru:Sprite = new Sprite();
		private var _maru2:Sprite = new Sprite();
		private var _maru3:Sprite = new Sprite();
		private var _maru4:Sprite = new Sprite();
		private var _maru5:Sprite = new Sprite();
		private var _onPositionX:Number = 0;
		private var _onPositionY:Number = 0;
		private var _onPositionX2:Number = 0;
		private var _onPositionY2:Number = 0;
		private var _onPositionX3:Number = 0;
		private var _onPositionY3:Number = 0;
		private var _onPositionX4:Number = 0;
		private var _onPositionY4:Number = 0;
		private var _onPositionX5:Number = 0;
		private var _onPositionY5:Number = 0;
		public function Main(){

			_maru.graphics.beginFill(0xFF0000);
			_maru.graphics.drawCircle(0,0,50);
			_maru.graphics.endFill();
			this.addChild(_maru);

			_maru2.graphics.beginFill(0xFF0000);
			_maru2.graphics.drawCircle(0,0,50);
			_maru2.graphics.endFill();
			this.addChild(_maru2);

			_maru3.graphics.beginFill(0xFF0000);
			_maru3.graphics.drawCircle(0,0,50);
			_maru3.graphics.endFill();
			this.addChild(_maru3);

			_maru4.graphics.beginFill(0xFF0000);
			_maru4.graphics.drawCircle(0,0,50);
			_maru4.graphics.endFill();
			this.addChild(_maru4);

			_maru5.graphics.beginFill(0xFF0000);
			_maru5.graphics.drawCircle(0,0,50);
			_maru5.graphics.endFill();
			this.addChild(_maru5);

			this.addEventListener(Event.ENTER_FRAME,onEnter);
			stage.addEventListener(MouseEvent.CLICK,onClick);
		}
		private function onClick(event:MouseEvent):void{
			_onPositionX = Math.random()*stage.stageWidth;
			_onPositionY = Math.random()*stage.stageHeight;
			_onPositionX2 = Math.random()*stage.stageWidth;
			_onPositionY2 = Math.random()*stage.stageHeight;
			_onPositionX3 = Math.random()*stage.stageWidth;
			_onPositionY3 = Math.random()*stage.stageHeight;
			_onPositionX4 = Math.random()*stage.stageWidth;
			_onPositionY4 = Math.random()*stage.stageHeight;
			_onPositionX5 = Math.random()*stage.stageWidth;
			_onPositionY5 = Math.random()*stage.stageHeight;
		}

		private function onEnter(event:Event):void{
			var dx:Number = _onPositionX - _maru.x;
			var dy:Number = _onPositionY - _maru.y;
			_maru.x += dx*0.1;
			_maru.y += dy*0.1;

			var dx2:Number = _onPositionX2 - _maru2.x;
			var dy2:Number = _onPositionY2 - _maru2.y;
			_maru2.x += dx2*0.1;
			_maru2.y += dy2*0.1;

			var dx3:Number = _onPositionX3 - _maru3.x;
			var dy3:Number = _onPositionY3 - _maru3.y;
			_maru3.x += dx3*0.1;
			_maru3.y += dy3*0.1;

			var dx4:Number = _onPositionX4 - _maru4.x;
			var dy4:Number = _onPositionY4 - _maru4.y;
			_maru4.x += dx4*0.1;
			_maru4.y += dy4*0.1;

			var dx5:Number = _onPositionX5 - _maru5.x;
			var dy5:Number = _onPositionY5 - _maru5.y;
			_maru5.x += dx5*0.1;
			_maru5.y += dy5*0.1;
		}
	}
}

なんか似たような記述が5個もならんでいることに気づくでしょう。
これらは配列を使うと、一括して管理できます。
まずは_onPositionXのところを配列で管理してみましょう。

5つの丸がランダムな位置に移動する2 – wonderfl build flash online
/*
ステージ上をクリックすると、丸がランダムな位置に移動します。
*/
package{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	public class Main extends Sprite{
		private var _maru:Sprite = new Sprite();
		private var _maru2:Sprite = new Sprite();
		private var _maru3:Sprite = new Sprite();
		private var _maru4:Sprite = new Sprite();
		private var _maru5:Sprite = new Sprite();
		private var _onPositionXs:Array = new Array();
		private var _onPositionYs:Array = new Array();
		public function Main(){

			_onPositionXs[0] = 0;
			_onPositionXs[1] = 0;
			_onPositionXs[2] = 0;
			_onPositionXs[3] = 0;
			_onPositionXs[4] = 0;

			_onPositionYs[0] = 0;
			_onPositionYs[1] = 0;
			_onPositionYs[2] = 0;
			_onPositionYs[3] = 0;
			_onPositionYs[4] = 0;

			_maru.graphics.beginFill(0xFF0000);
			_maru.graphics.drawCircle(0,0,50);
			_maru.graphics.endFill();
			this.addChild(_maru);

			_maru2.graphics.beginFill(0xFF0000);
			_maru2.graphics.drawCircle(0,0,50);
			_maru2.graphics.endFill();
			this.addChild(_maru2);

			_maru3.graphics.beginFill(0xFF0000);
			_maru3.graphics.drawCircle(0,0,50);
			_maru3.graphics.endFill();
			this.addChild(_maru3);

			_maru4.graphics.beginFill(0xFF0000);
			_maru4.graphics.drawCircle(0,0,50);
			_maru4.graphics.endFill();
			this.addChild(_maru4);

			_maru5.graphics.beginFill(0xFF0000);
			_maru5.graphics.drawCircle(0,0,50);
			_maru5.graphics.endFill();
			this.addChild(_maru5);

			this.addEventListener(Event.ENTER_FRAME,onEnter);
			stage.addEventListener(MouseEvent.CLICK,onClick);
		}
		private function onClick(event:MouseEvent):void{
			_onPositionXs[0] = Math.random()*stage.stageWidth;
			_onPositionYs[0] = Math.random()*stage.stageHeight;
			_onPositionXs[1] = Math.random()*stage.stageWidth;
			_onPositionYs[1] = Math.random()*stage.stageHeight;
			_onPositionXs[2] = Math.random()*stage.stageWidth;
			_onPositionYs[2] = Math.random()*stage.stageHeight;
			_onPositionXs[3] = Math.random()*stage.stageWidth;
			_onPositionYs[3] = Math.random()*stage.stageHeight;
			_onPositionXs[4] = Math.random()*stage.stageWidth;
			_onPositionYs[4] = Math.random()*stage.stageHeight;
			_onPositionXs[5] = Math.random()*stage.stageWidth;
			_onPositionYs[5] = Math.random()*stage.stageHeight;
		}

		private function onEnter(event:Event):void{
			var dx:Number = _onPositionXs[0] - _maru.x;
			var dy:Number = _onPositionYs[0] - _maru.y;
			_maru.x += dx*0.1;
			_maru.y += dy*0.1;

			var dx2:Number = _onPositionXs[1] - _maru2.x;
			var dy2:Number = _onPositionYs[1] - _maru2.y;
			_maru2.x += dx2*0.1;
			_maru2.y += dy2*0.1;

			var dx3:Number = _onPositionXs[2] - _maru3.x;
			var dy3:Number = _onPositionYs[2] - _maru3.y;
			_maru3.x += dx3*0.1;
			_maru3.y += dy3*0.1;

			var dx4:Number = _onPositionXs[3] - _maru4.x;
			var dy4:Number = _onPositionYs[3] - _maru4.y;
			_maru4.x += dx4*0.1;
			_maru4.y += dy4*0.1;

			var dx5:Number = _onPositionXs[4] - _maru5.x;
			var dy5:Number = _onPositionYs[4] - _maru5.y;
			_maru5.x += dx5*0.1;
			_maru5.y += dy5*0.1;
		}
	}
}

先ほどまで次のような記述が

private var _onPositionX:Number = 0;
private var _onPositionY:Number = 0;
private var _onPositionX2:Number = 0;
private var _onPositionY2:Number = 0;
private var _onPositionX3:Number = 0;
private var _onPositionY3:Number = 0;
private var _onPositionX4:Number = 0;
private var _onPositionY4:Number = 0;
private var _onPositionX5:Number = 0;
private var _onPositionY5:Number = 0;

次のように一括でまとまりました。

private var _onPositionXs:Array = new Array();
private var _onPositionYs:Array = new Array();

でも、Main()の中に次のような記述が増えました。

_onPositionXs[0] = 0;
_onPositionXs[1] = 0;
_onPositionXs[2] = 0;
_onPositionXs[3] = 0;
_onPositionXs[4] = 0;

_onPositionYs[0] = 0;
_onPositionYs[1] = 0;
_onPositionYs[2] = 0;
_onPositionYs[3] = 0;
_onPositionYs[4] = 0;

これでは、一括管理と言われてもなんだか腑に落ちないはずです。
でも、これは次のように、まとめることができます。
_onPositionXs = [0,0,0,0,0];
_onPositionYs = [0,0,0,0,0];
同様に、onClickの中身は
_onPositionXs = [Math.random()*stage.stageWidth,Math.random()*stage.stageWidth,Math.random()*stage.stageWidth,Math.random()*stage.stageWidth,Math.random()*stage.stageWidth]
_onPositionYs = [Math.random()*stage.stageHeight,Math.random()*stage.stageHeight,Math.random()*stage.stageHeight,Math.random()*stage.stageHeight,Math.random()*stage.stageHeight];
と、まとめることができます。

http://wonderfl.net/c/2Wqf/

やっと、一括管理という言葉が似合うようになってきました。でも、まだまだです。

http://wonderfl.net/c/vW5A
http://wonderfl.net/c/jvGz
http://wonderfl.net/c/oNlh

Written by 梅原

2011/5/25 at 7:22 pm

Posted in Tools&Tips

Leave a Reply