FLASHのアクションスクリプトを使ってゲームを作ってみよう!

FLASHでゲーム作成編


FLASH GAME TUTORIAL 01-1

タチコマでシューティングゲームに挑戦

前ページのタチコマムービークリップに記述した、キーボード操作+加速アクションスクリプトを解説していきます。

* キーボード操作+加速 アクションスクリプト解説


onClipEvent()のおさらい。

onClipEvent (load)
→ ムービークリップがムービー内に配置されたときに1回だけ実行される

onClipEvent (enterFrame)
→ ムービークリップがムービー上にある間中実行される

です。なので、
onClipEvent (load) で、1回だけ実行されればよいこと:
 −タチコマを動かすために必要な変数とメソッドの定義

onClipEvent (enterFrame) で、タチコマがムービー上にある間何度も実行してほしいこと:  −タチコマを操作するために、どのキーボードのキーが押されているかの確認

を行います。

1.onClipEvent (load) のパートのスクリプト。

//変数、メソッドの定義
onClipEvent (load) {

	//変数の初期化//
	//左右のスピード設定(ac_Hは加速度、 0 のときは加速しない)
	speed_H = 5;
	ac_H = 5;
	
	//上下のスピード設定(ac_Vは加速度、 0 のときは加速しない)
	speed_V = 20;
	ac_V = 0;
	reset();


左右上下のスピード、加速度設定です。

左右は加速して、上下は加速しないようにしたかったので、左右のスピード用の変数(speed_H)、上下のスピード用の変数(speed_V)をつくりました。

それに合わせて、左右の加速度を設定する変数(ac_V)と、もし上下も加速度をつけたくなったときのために上下の加速度を設定する変数(ac_H)をつくりました。

reset()は加速度をつけるための仮の時間 変数t をリセットする(t=1)ためのメソッドです。
初期化ということで一応入れておきました。

	//押しているキーを知るための変数
	currentKey = LEFT_KEY_CODE;
	
	//操作キー設定
	LEFT_KEY_CODE = 65;
	RIGHT_KEY_CODE = 68;
	UP_KEY_CODE = 87;
	DOWN_KEY_CODE = 83;


キーボード関連の変数設定です。

変数 currentKey は現在押されているキー知るための変数です。
はじめは左を向いているので、currentKey = LEFT_KEY_CODE; と左向きのキーが入る予定の変数を代入しています。

LEFT_KEY_CODE=65、RIGHT_KEY_CODE=68、UP_KEY_CODE=87、DOWN_KEY_CODE=83

とわざわざ上下左右に動かすためのキーのキーコードを入れる変数を作っておき、この変数を使ってメソッドをつくっておくことで、左に進むためのキーをやっぱり右矢印キーでしたいなーと思ったときにLEFT_KEY_CODE = 65の65を変更するだけで他のメソッドやらなにやらまで変更せずに一瞬で変更できます。

	
	//メソッド//
	//加速をつけるための時間を初期化
	function reset() {
		t = 1;
	}


加速のための計算式

スピード + 加速度 x 時間

に必要な仮の時間を変数tとして、tをt++で1ずつ増やすことで加速させているのですが、その時間を元に戻すためのメソッドです。ここでは時間の初期値を1にしています。


ここからは上下左右に進むためのそれぞれのメソッド設定です。

■上に進むためのメソッド moveUp()
	
	//キー操作メソッド定義
	//上に進む
	function moveUp() {
		if(currentKey != UP_KEY_CODE){
		  reset();
		  currentKey = UP_KEY_CODE;
		}
		this._y -= (speed_V+ac_V*t);
		t++;
	}


ファンクションmoveUP()は、

上へ進むためのキーが押されたときに実行されるファンクションで、

押されているキーが上へ進む用のキー(このファイルの設定では'w'です)の場合、
上方向に加速する、
そうでないとき(例えば、右に進んでいて、上に進み変えた時)は、
仮の時間をリセットして、押されたキーを入れておくための変数に上へ進む用のキーをセット。

という処理をするためのメソッドです。


■上方向に加速する式 this._y -= (speed_V+ac_V*t) について。

上に進むのでy軸方向で、

進んだ後のタチコマの位置(this._y)
 = 現在のタチコマの位置(this._y) - 移動距離(speed_V + ac_V * t)

となります。

今回のポイントの加速の部分ですが、移動距離のところをちょっといじってやればOKです。
例えば同じ速度で一回に付き20pxづつ進むとすれば、

this._y = this._y + 20;

とですね。

加速の場合は、20 の部分がちょっとづつ増えていけばよいので、20 に加速が付いた部分だけを足してやります。一回スクリプトが実行されるごとに付き加速が 5px ずつつくとすると、

1回目の実行 this._y = this._y + (20+5); 25px進む
2回目の実行 this._y = this._y + (20+5+5); 30px進む
3回目の実行 this._y = this._y + (20+5+5+5); 45px進む

というわけで、上の図を見るとわかるように加速してますよね。

(20+5+5+5)の部分をスクリプトに直してやると、

速度がspeed_V で、加速度が ac_V仮の時間が t、としていたので

speed_V + ac_V * t

になります。


現在押されているキーが 上へ進む用のキーじゃない場合

if(currentKey != UP_kEY_CODE)

は、今まで上以外の方向に進んでいたということなので、
加速をつけるための時間をリセットして、(リセットしないといきなり速く進みます)
上へ進むキーが押されているのでcurrentKeyにUP_KEY_CODEを代入。



	
	//下に進む
	function moveDown() {
		if(currentKey != DOWN_KEY_CODE){
			  reset();
			  currentKey = DOWN_KEY_CODE;
		}
		this._y += (speed_V+ac_V*t);
		t++;
	}
	
	//右に進む
	function moveRight() {
		if(currentKey != RIGHT_KEY_CODE){
		  reset();
		  currentKey = RIGHT_KEY_CODE;
		}
		this._x += (speed_H+ac_H*t);
		t++;
	}
	
	//左に進む
	function moveLeft() {
		if(currentKey != LEFT_KEY_CODE){
		  reset();
		  currentKey = LEFT_KEY_CODE;
		}
		this._x -= (speed_H+ac_H*t);
		t++;
	}


ファンクション moveDown() moveLeft() moveRight() 
もmoveUP()と同様に作ってやります。
進む方向に気をつけてください。

//キーボード操作
	function move() {
		if (Key.isDown(LEFT_KEY_CODE)) {
			moveLeft();
		} else if (Key.isDown(RIGHT_KEY_CODE)) {
			moveRight();
		} else if (Key.isDown(UP_KEY_CODE)) {
			moveUp();
		} else if (Key.isDown(DOWN_KEY_CODE)) {
			moveDown();
		} else {
			reset();
		}
	}


ファンクション move() は、

上で作った moveUp() moveDown() moveLeft() moveRight() をまとめるためのファンクションで、上下左右に進む用のどれかのキーが押された場合、それぞれの方向によって、上で作った4つのファンクションを実行します。
どのキーも押されてない場合はreset()で、仮の時間をもとに戻しておきます。


}

//実行
onClipEvent (enterFrame) {
	move();
}


最後にonClipEvent(enterFrame)で、 ファンクション move()を実行。 で完成です!

解説がわからない、間違ってるよーというところがあれば、
掲示板メールで質問、指摘してください。よろしくお願いします。

* 戻る

攻殻機動隊 S.A.C

PS2ゲーム発売記念特製
タチコマ
スクリーンセーバー

(windows専用みたいです)

ちなみにこのゲーム、少佐の動きがアニメに忠実で非常にかっこよいです!