coconuz info processor -4ページ目

物産展にて

秋の北海道物産展で食べたもの


まずは半熟カステラ なんだかプリンのよう、カステラという感じがしないなあ

あさりジャン キムチをあえたあさりみたいな・・しめサバの菜の花あえ、数の子の惣菜、

一本1000円もするたらこをちょいちょいつまむ

じゃが豚もつるりんといただく じゃが豚の食べ方を知ってるかい?「おいしいおいしい」っていって

食べるんだよ と教わる

次は転身とねりものを売ってるお店へ メガネをかけたお兄さんが巧みに味見を気前よくさせてくれる

カニシューマイににらまんじゅう、たこざんぎ(かまぼこをあげたらしい)

たこざんぎのタコがこりっといい触感だったので、からしをつけてお買い上げ

かぼちゃのグラタン、坊ちゃんかぼちゃ使用、おいしいほくほく!

一緒に売ってたオムライスも売れ筋らしいけど、その隣に一回り高い値段のホタテクリームつき

オムライスは全然売れない、と販売員のお兄さん自身が語ってる

北海道っぽいものをつけるとどーんと高くなるんだと


次にふりかけやさんへ。去年の物産展にもきていたとても気前のいいふりかけやさんだ、

どう気前がいいかというと、ご飯付きの試食をこれでもかとふるまってくれる。

海の幸七草ふりかけは健康にも良く和食ならなんにでもあう、去年おされにおされ、ねぎって

買ったのだが、とてもよかった。ねぎったのがこうをそうしてか「なんかやせたねえ”」と顔を覚えられていた!

今回2回目の訪問で友達をつれていったらおじさんがお礼なんていって早煮昆布を2・3本くれたりして。

本当にやさしいくて気前のいいおじさんとそれを助けるおばさんである


つづいて2回目に食べる長沼町のソフトクリーム夕張メロンみーっくす!友達はミルク味を食べた、

私も前に食べたやつだ わたしはむしろさっぱりしてると思ってたけど友達にはすごく来いミルク味らしい。ほー


アイスを食べながら北海道いきたいな~なんて、スキーやスノボー話に話題をうつす。

もっと近ければいいのに北海道!


チーズケーキなんかもちょびちょび食べて、

最後のしめはぱんじゅう!ここほんとに手ごろに食べれておいしくていい。

なんでも安ければいいってもんじゃないとおもう、特にメタ簿が騒がれる昨今ボリュームよりも

すきっぱらと値段のつりあいが財布のひもをゆるめるのだ!

できたてのぱんじゅうは中のあんこがぎっしりのもちもちの・・ああ幸せ。


今日の夕飯は友達からもらった中華のお惣菜だ。

ふくさいキャベツと早煮昆布の生姜醤油あえにでもしようかな?

DORAG DROP

4.4 タイマーイベントの例

タイマーイベントは設定した時間間隔で発生するイベントです。ある時間間隔ごとに処理を繰り返し実行したい時にタイマーイベントを利用します。
以下の例は0.1秒ごとに円を描画していくプログラムです。

【TimerEventExample.as】

package {
	import flash.display.Sprite;
	import flash.events.TimerEvent;
	import flash.utils.Timer;

	public class TimerEventExample extends Sprite
	{
		private var circleX:int = 5;
		private var circleY:int = 5;
		
		public function TimerEventExample()
		{
			var timer:Timer = new Timer(100,0);
			timer.addEventListener(TimerEvent.TIMER,onTimer);
			timer.start();
		}
		
		private function onTimer( event:TimerEvent ):void
		{
			drawCircle();
			circleX += 10;
            
			if( circleX > 500 ) 
			{
				circleX = 5;
				circleY += 10;
			}
		}
		
		private function drawCircle():void
		{
			this.graphics.beginFill(0x000000,1);
			this.graphics.drawCircle(circleX,circleY,5);
			this.graphics.endFill();
		}
	}
}

タイマーイベントを扱うには、Timerクラスを使用します。

		public function TimerEventExample()
		{
			var timer:Timer = new Timer(100,0);
			timer.addEventListener(TimerEvent.TIMER,onTimer);
			timer.start();
		}

Timerクラスのコンストラクタには、2つの引数を渡しています。
			new Timer(delay,repeatCount);

delayには時間間隔をミリ秒単位で指定します。例えば、100ミリ秒は0.1秒です。
repeatCountは繰り返す回数です。これを0とすると無限に繰り返されます。

			timer.addEventListener(TimerEvent.TIMER,onTimer);

Timerクラスを生成したら、イベントリスナーを登録します。

			timer.start();

タイマーを開始するにはstart()メソッドを、反対に終了するにはstop()メソッドを実行します。


実はこのTimerEventの仕組みによってアニメーションを作成することができます。
アニメーションについては5章で詳しく扱います。

【DragAndDrop.as】

package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;

	public class DragAndDrop extends Sprite
	{
		private var spr:Sprite;
		
		public function DragAndDrop()
		{
			spr = new Sprite();
			spr.graphics.lineStyle(1,0x000000);
			spr.graphics.beginFill(0xff0000,1);
			spr.graphics.drawCircle(0,0,10);
			spr.graphics.endFill();
			spr.x = spr.y = 10;
			this.addChild(spr);
			
			//イベントリスナーへの登録
			spr.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
			spr.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
		}
		
		private function onMouseDown( event:MouseEvent ):void
		{
			spr.startDrag(); //ドラッグ開始
		}
		
		private function onMouseUp( event:MouseEvent ):void
		{
			spr.stopDrag(); //ドラッグ停止
		}
	}
}
MOUSE_DOWNとMOUSE_UPをイベントリスナーに登録します。マウスのボタンが押されたら、startDrag()メソッドを実行します。反対に、マウスのボタンが離されたらstopDrag()メソッドを実行します

4.6 手動によるイベントの送出

イベントはユーザが独自のイベントを作成して送出することができます。これまでに扱ったイベントはマウスやキーボードなど、ユーザーからの操作に対応するものをイベントとしていました。しかし、このような外部のユーザーからの操作だけでなく、「データを読み込みが完了した」、「ある処理が完了した」といったプロセスの完了もイベントと一種といえます。

以下のサンプルプログラムでは手動でイベントを送出させることで、複数のオブジェクトのイベントを結びつけています。

【CrossBlock.as】

package {
	import flash.display.Sprite;
	import flash.events.Event;
	
	public class CrossBlock extends Sprite
	{
		private var blocks:Array;
		
		public function CrossBlock()
		{
			blocks = new Array();
			
			for( var i:int = 0; i < 10; i++ )
			{
				var array:Array = new Array();
				for( var j:int = 0; j < 10; j++ )
				{
					var block:Block = new Block();
					block.x = i * Block.size;
					block.y = j * Block.size;
					block.i = i;
					block.j = j;
					this.addChild(block);
					array.push(block);
				}
				blocks.push(array);
			}
			
			stage.addEventListener("blockMouseOver",onBlockMouseOver);
			stage.addEventListener("blockMouseOut",onBlockMouseOut);
		}
		
		/* 全てのブロックを白く塗る*/
		private function clearAllBlocks():void
		{
			for( var i:int = 0; i < 10; i++ )
			{
				for( var j:int = 0; j < 10; j++ )
				{
					blocks[i][j].color = 0xffffff;
					blocks[i][j].draw();
				}
			}
		}
		
		//垂直、水平方向のブロックを赤く塗る
		private function highlightBlocks( i:int, j:int):void
		{
			for( var k:int = 0; k < 10; k++ ) 
			{
				blocks[k][j].color = 0xff0000;
				blocks[k][j].draw();
				blocks[i][k].color = 0xff0000;
				blocks[i][k].draw();
			}
		}
		
		/* イベントリスナー */
		private function onBlockMouseOver( event:Event ):void
		{
			clearAllBlocks();
			var block:Block = Block(event.target);
			highlightBlocks(block.i,block.j);
			
		}
		
		private function onBlockMouseOut( event:Event ):void
		{
			clearAllBlocks();
		}
		

	}
}

【Block.as】

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	public class Block extends Sprite
	{
		public static var size:int = 20;
		public var color:int;
		public var i,j:int;
		
		public var red:int = 0xff0000;
		public var white:int = 0xffffff;
		
		public function Block( color:int = 0xffffff )
		{
			this.color = color;
			draw();	
			
			this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
			this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
			
		}
		
		public function draw():void
		{
			this.graphics.clear();
			this.graphics.lineStyle(1,0x000000);
			this.graphics.beginFill(color,1);
			this.graphics.drawRect(0,0,size,size);
			this.graphics.endFill();
		}
		
		/* イベントリスナー */		
		private function onMouseOver( event:MouseEvent ):void
		{
			this.color = red;
			draw();
			this.dispatchEvent(new Event("blockMouseOver",true));
		}
		
		private function onMouseOut( event:MouseEvent ):void
		{
			this.color = white;
			draw();
			this.dispatchEvent(new Event("blockMouseOut",true));
		}

	}
}

このプログラムでは2つのイベントを手動で発生させています。以下がその一つの部分です。

		private function onMouseOver( event:MouseEvent ):void
		{
			this.color = red;
			draw();
			this.dispatchEvent(new Event("blockMouseOver",true)); //手動によるイベントの発生
		}

マウスカーソルが各ブロックの中に入るとBlockクラスのonMouseOver()イベントリスナーが実行されます。そして、このイベントリスナーの中でdispatchEvent()メソッドが手動でイベントを発生させている部分です。dispatchEvent()メソッドは発生させるイベントのインスタンスを引数にとります。

一方、メインクラスのCrossBlockクラスでは手動で作成したイベントをイベントリスナーに登録しています。

			stage.addEventListener("blockMouseOver",onBlockMouseOver);
			stage.addEventListener("blockMouseOut",onBlockMouseOut);

これによりCrossBlockクラスはブロックが送出する手動のイベントを受け取ることが可能になります。

イベントなど

4.1 イベントの基本

ActionScript 3.0ではキーボードやマウスによってプログラムを制御する際の、キーボードの押下やマウスのクリック、移動などを「イベント」として扱います イベントの仕組みは奥が深いですが、ここでは基本的なイベントの概念について学びます。

イベントを利用したサンプルプログラムとして以下のプログラムを実行してみて下さい。円をマウスでクリックすることで色とサイズが変わります。

【MouseEventExample.as】

package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;

	public class MouseEventExample extends Sprite
	{
		private var circle:Circle;
		
		public function MouseEventExample()
		{
			circle = new Circle();
			
			circle.x = 100;
			circle.y = 100;
			this.addChild(circle);
			
			circle.addEventListener(MouseEvent.CLICK,onMouseClick); //イベントリスナーの登録
			
		}
		
		/* イベントリスナー */
		private function onMouseClick( event:MouseEvent ):void
		{
			circle.color = Math.random() * 0xffffff;
			circle.radius += 5;
			circle.draw();
		}
	}
}
イベントが発生した時、そのイベントに対応して実行される関数やメソッドのことをイベントリスナーまたはイベントハンドラーと呼びます。イベントリスナーは通常の関数やメソッドと同じように記述しますが、イベントに対応するクラスを引数としてとります。例えば、マウスイベントにはMouseEventクラスを使用します。上記の例ではonMouseClick()メソッドがイベントリスナーに当たります。 

イベントリスナーを記述したら、次はイベントリスナーの「登録」を行います。登録するとは、発生したイベントに対応してイベントリスナーが実行されるようにすることです。イベントリスナーの登録には以下のようにaddEventListener()メソッドを使用します。

			circle.addEventListener(MouseEvent.CLICK,onMouseClick);

addEventListener()メソッドにはイベント定数と、イベントリスナーを引数として渡します。こうしてベントリスナーを登録すると、イベントが発生した際に引数として指定したイベントのクラスが生成され、イベントリスナーが実行されます。

多くのイベントは該当するクラスにて定数として定義されています。
例えば、MouseEventクラスではマウス関連のイベントが定義されており、以下のようなものがあります。

【MouseEventクラスで定義されている主なイベント定数】
定数名 説明
CLICK マウスの主ボタンのクリック
MOUSE_DOWN マウスの主ボタンの押下
MOUSE_MOVE マウスポインタの移動
MOUSE_OUT マウスポインタがオブジェクト外に移動
MOUSE_OVER マウスポインタがオブジェクト内に移動
MOUSE_UP マウスの主ボタンのリリース

実際にはこれらの定数には文字列が格納されています。例えば、CLICK定数には"click"という文字列が入っています。

それでは、続いてもう一つ簡単なマウスイベントのプログラムを作成してみましょう。 MOUSE_OVERとMOUSE_OUTのイベントを利用します。

【MouseEventExample1.as】

package {
	import flash.display.Sprite;
	
	public class MouseEventExample1 extends Sprite
	{
		public function MouseEventExample1()
		{
			for( var i:int = 0; i < 10; i++ ) 
			{
				for( var j:int = 0; j < 10; j++ )
				{
					var block:Block = new Block();
					block.x = j * Block.length;
					block.y = i * Block.length;
					this.addChild(block);	
				}
			}
			
		}
	}
}

【Block.as】

package
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	
	public class Block extends Sprite
	{
		public static var length:int = 20;
		
		public function Block()
		{
			draw(0xffffff);
			
			this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
			this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
		}
		
		private function onMouseOver( event:MouseEvent ):void
		{
			draw(0xff0000);
		}
		
		private function onMouseOut( event:MouseEvent ):void
		{
			draw(0xffffff);
		}
		
		private function draw( color:int ):void
		{
			this.graphics.clear();
			this.graphics.lineStyle(1,0x000000);
			this.graphics.beginFill(color,1);
			this.graphics.drawRect(0,0,length,length);
			this.graphics.endFill();
		}

	}
}

4.2 マウスイベントの例

マウスポインタの動きをイベントとして取得し、ペイントツールのように線を描画するプログラムを作成してみます。
考え方は非常に簡単で、マウスポインタの動きをイベントとして取得し、その軌跡をlineTo()メソッドで描いていくことで実現できます。

【Paint.as】

package{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	
	public class Paint extends Sprite
	{
		
		public function Paint()
		{
			this.graphics.lineStyle(1,0x000000);
			
			stage.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);
		}
		private function onMouseMove( event:MouseEvent ):void
		{
			this.graphics.lineTo(this.mouseX,this.mouseY);
			
		}


	}
}

このプログラムでは、イベントリスナーの登録をstageプロパティに対して行っています。stageプロパティとはActionScriptで生成されるファイルの画面全体の領域を表しているクラスです。マウスポインタの移動など、画面全体にイベントの範囲が及ぶ場合はstageプロパティにイベントリスナーを追加します。

一応線を描くことはできますが、線を描くタイミングを指定することができず、マウスポインタを移動すると常に線が描かれてしまいます。

ここでは一般的なペイントツールのように、マウスのボタンを押している間だけ線が描画されるという動作を再設計します。
ペイントツールで線を描くには、マウスのボタンを押す、マウスの移動、マウスのボタンを離すの3つがイベントとしてと考えられます。

【PaintModified.as】

package{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	
	public class PaintModified extends Sprite
	{
		
		public function PaintModified()
		{
			this.graphics.lineStyle(1,0x000000);
			this.graphics.endFill();
			stage.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);
			stage.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
		}
		
		private function onMouseMove( event:MouseEvent ):void
		{
			if( event.buttonDown )
			{
				/*マウスの主ボタンが押されている間だけ、線を描画する*/
			}
				
		}
				
		private function onMouseDown( event:MouseEvent ):void
		{
			/*現在の描画位置をマウスカーソルの位置に設定*/
		}
		
	}
}
マウスの主ボタンが押されているかどうかは、MouseEventのbuttonDownプロパティから判定することができます。

次に、もう一つマウスカーソルの座標を利用したサンプルプログラムを作成してみます。

【ArrowPointing.as】

package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;

	public class ArrowPointing extends Sprite
	{
		private var arrows:Array;
		
		public function ArrowPointing()
		{
			arrows = new Array();
			
			for( var i:int = 0; i < 30; i++ )
			{
				var arrow = new Arrow();
				arrow.x = Math.random() * stage.stageWidth;
				arrow.y = Math.random() * stage.stageHeight;
				this.addChild(arrow);
				arrows.push(arrow);
			}
			
			stage.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);
			
		}
		
		private function onMouseMove( event:MouseEvent ):void
		{
			for each( var arrow:Arrow in arrows ) pointMouseCursor(arrow);
		}
		
		/* 矢印との座標とマウスカーソルの座標から矢印の角度を決定する */
		private function pointMouseCursor( arrow:Arrow ):void
		{
			var dx:Number = this.mouseX - arrow.x; //x成分
			var dy:Number = this.mouseY - arrow.y; //y成分
			var distance:Number = Math.sqrt(dx*dx+dy*dy); // 距離
			arrow.rotation = Math.acos(dx/distance) / Math.PI * 180;
			if( dy < 0 ) arrow.rotation = - Math.acos(dx/distance) / Math.PI * 180;
		}
	}
}

	import flash.display.Shape;
	
	class Arrow extends Shape
	{
		private var size:int = 3;
		
		public function Arrow()
		{
			this.graphics.lineStyle(1,0x000000);
			this.graphics.beginFill(0xffffff,1);
			this.graphics.moveTo(0,-size);
			this.graphics.lineTo(size*3,-size);
			this.graphics.lineTo(size*3,-size*2);
			this.graphics.lineTo(size*6,0);
			this.graphics.lineTo(size*3,size*2);
			this.graphics.lineTo(size*3,size);
			this.graphics.lineTo(0,size);
			this.graphics.lineTo(0,-size);
		}
	}