キーボード操作でムービークリップを動かすテスト

2009/08/11

『詳細!ActionScript3.0入門ノート』を参考に、ムービークリップを動かすクラスchrmovを作ります。
この書籍の通りにやると、例えば「矢印キーを2つ同時に押して斜めに移動」といったことができないので、
それを解消するためにちょっと工夫を凝らしました。

方針としては、
『キーを押したときにフラグを立て、キーを離したときにフラグを潰す。
 フラグが立っている間だけEnterFrameを使って毎フレームムービークリップを動かす』
というもの。
フラグの立て方、潰し方はHakuhin's HomePageさんの論理演算についてというコンテンツを参考にしています。

まず、ムービークリップを矢印キーで動かすクラスchrmovが以下のソース。
package {
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	import flash.display.MovieClip;
	import flash.display.Stage;
	import flash.events.Event;
	public class chrmove {
		//フラグの設定
		var keyflg:int = 0;
		const KY_U:int = 0x01;
		const KY_D:int = 0x02;
		const KY_R:int = 0x04;
		const KY_L:int = 0x08;
		var chara:MovieClip;
		//移動速度の設定
		var d:uint = 5;
		var dx:int = 0;
		var dy:int = 0;
		//ステージの縦横最大値を格納して移動可能領域を設定したい。まだ試験中
		var w:uint=0;
		var h:uint=0;
		//コンストラクタ
		public function chrmove(mc:MovieClip) {
			chara = mc;
			//ステージの最大値を設定。試験中
			w=chara.stage.stageWidth;
			h=chara.stage.stageHeight;
			
			mc.stage.addEventListener(KeyboardEvent.KEY_DOWN,kdwn);
			mc.stage.addEventListener(KeyboardEvent.KEY_UP,kup);
			mc.stage.addEventListener(Event.ENTER_FRAME,mv);
		}
		//キーを押したときにフラグを立てる
		function kdwn(event:KeyboardEvent):void {
			if (event.keyCode == Keyboard.UP) {
				keyflg |= KY_U;
			}
			if (event.keyCode == Keyboard.DOWN) {
				keyflg |= KY_D;
			}
			if (event.keyCode == Keyboard.RIGHT) {
				keyflg |= KY_R;
			}
			if (event.keyCode == Keyboard.LEFT) {
				keyflg |= KY_L;
			}
		}
		//キーを離したときにフラグを潰す
		function kup(event:KeyboardEvent):void {
			if (event.keyCode == Keyboard.UP) {
				keyflg &= ~KY_U;
			}
			if (event.keyCode == Keyboard.DOWN) {
				keyflg &= ~KY_D;
			}
			if (event.keyCode == Keyboard.RIGHT) {
				keyflg &= ~KY_R;
			}
			if (event.keyCode == Keyboard.LEFT) {
				keyflg &= ~KY_L;
			}
		}
		//移動させる
		function mv(event:Event):void {
			//上下
			if (keyflg & KY_U) {
				dy =-d;
			} else if (keyflg & KY_D) {
				dy =d;
			} else {
				dy=0;
			}
			//左右
			if (keyflg & KY_R) {
				dx =d;
			} else if (keyflg & KY_L) {
				dx =-d;
			} else {
				dx=0;
			}
			chara.x+=dx;
			chara.y+=dy;
			//移動可能な範囲の設定。まだ試験中。
			if (chara.x <0) {
				chara.x=0;
			} else if (chara.x > w) {
				chara.x =w;
			}
			if (chara.y <0) {
				chara.y=0;
			} else if (chara.y > h) {
				chara.y =h;
			}
		}
	}
}

次はflaファイルの設定。
メインのタイムラインに次の一文を書きます。
//chrmoveクラスを使う
var tst:chrmove = new chrmove(ply);

最後にステージ上に適当なムービークリップを置き、plyという名前を付けて準備完了。
パブリッシュすればちゃんと動くはず。

戻る。