ケータイFlashゲーム制作レクチャー

第12回マップ冒険ゲームレクチャー(2) PCの移動とマップスクロールを作る!

PC移動とマップスクロールの基本を作成

前回から始まったマップ冒険ゲーム。今回は、PCを操作してマップを移動するまで作ります!皆さんも自分のマップを作って歩かせてね!

前回(第11回)に続き、今回は…

それでは、前回の基本レクチャーⅠ マップ移動の基本を作る!の続きをレクチャーしていこう。

前回は使用するマップを作ったので、今回は、そのマップのスクロールやマップ上を移動するPCを作成し、さらには障害物との判定も行っていく。

今回、使用するflaは、前回の「MapAdv_1」からマップスクロールやPCの移動処理を入れた「MapAdv_2」となり、そのflaを用いて進めていく。

Ⅰ-② マップ移動データを作る!

今回のまず手始めは「マップ移動データ」を作成する。このデータは、マップスクロールやPCの移動に必要となるもので、PCが一歩先へ移動可能かどうか、障害物があるなら回避移動するかどうかの判定に用いる[1]⁠。

(1)初期設定にマップ移動データを記述する

初期設定は前回でも解説したが、新たに追加した「マップ移動データ」関連と「PCの移動ウエイトフラグ」以外は前回と同じなので、ここでは、ポイントである「マップ移動データ」関連と「PCの移動ウエイトフラグ」のみ取り上げて解説する。

初期設定に追加したフラグとデータ
//PCの移動ウエイトフラグ
ido_wait = 0; ―①

//マップ移動データ
md = "111111111111111111111"
   add"100000000000000000001"
   add"100000000000021300001"
   add"100000000000031200001"
   add"100000000000000000001"
   add"100000000000000000001"
   add"100000000000000000001"
   add"100000000000000000001"
   add"100000000000000000001"
   add"100000000000000000001"
   add"100000000000213000001"
   add"102130000000312000001"
   add"103120000000002130001"
   add"100000000002133120001"
   add"100000000003120000001"
   add"100000000000000000001"
   add"100000000000000000001"
   add"100000000000000000001"
   add"100000000000000000001"
   add"111111111111111111111";┛②

//マップデータ1行数
md_xmax = 21; ―③
//PCのマップデータ上の位置
pc_md = 156; ―④

 PCが移動中は値を1にする。詳しい説明はPC移動の解説時に行う
 ⁠md」という変数を用意し、値をデータとして使用。各数値の意味は…
0はそのマスへ移動可
1は進入不可
2は進入不可+回避移動を行う
3は進入不可+2と別方向へ回避移動を行う
 マップ移動データの1行の数=マップの横幅分。このデータの用い方は、PC移動の解説を参照
 マップ移動データ上、ゲーム開始時のPCの位置。このデータの用い方は、PC移動の解説を参照

マップ移動データについて、上記した数値の羅列だけではイメージ難しいと思うので、実際に使用するマップ絵にこれらのデータを並べてみた。次のFla画面1をご覧になれば、これら数値の意味がわかると思う。

Fla画面1 データをマップに載せたイメージ
Fla画面1 データをマップに載せたイメージ
このマップ上、マップ移動データはX方向に21列あり、障害物がなければ19歩分移動できる。

それでは、このマップ移動データを用いつつ、マップスクロールやPC移動を作成、レクチャーを進めていく。

Ⅰ-③ PC移動+マップスクロールを作る!

今回のゲームでは、PCの移動処理内でマップのスクロールも行っている。従って、PCの作成と移動処理の解説を進めながらマップスクロールの解説も行っていく。

PCの移動については、次のフローのように、プレイヤーからのキー入力を受け、ボタン→PCクリップへ処理展開する。

(1)キー入力によるPCとマップ移動処理の流れ

プレイヤーから移動キー(2、8、4、6)の入力があると、次の手順でPC移動とマップをスクロールさせている。ここでは、8キー(正面向き、↓方向へ移動)を例に紹介する。

画像

…以上、ざっとこの流れでPC移動とマップのスクロールが実行される[2]⁠。

では、全体の流れが掴めたところで、ボタンとPCクリップ内の解説へ移っていく。

(2)ボタンに記述したボタンアクションの解説

前のフローに記したように、プレイヤーから移動キーが入力されると、まずはボタンに記述した次のスクリプトが処理される。

//8キー(↓へ移動)が入力された場合
on (keyPress "8") {
 if (ido_wait == 1) {
 } else {
  tellTarget ("pc") {
   gotoAndPlay ("F");
  }
 }
}                     ┛①
//2キー(↑へ移動)が入力された場合
on (keyPress "2") {  
 if (ido_wait == 1) {
 } else {
  tellTarget ("pc") {
   gotoAndPlay ("B");
  }
 }
}                      ┛②
    ・
    ・
    ・
4キーと6キーの処理は省略

 8キーが入力されると、⁠ido_wait」フラグをチェックし、PCが移動中かどうか確認する。これは重ねて移動処理をしないためである。その結果、PCが移動中でなければ「PCクリップ」内の「F(↓向き)」をgotoAndPlayする。
⁠ido_wait」フラグの値は、PCクリップ内でON/OFFしている。

 2キーが入力された場合も同様に処理している。もちろん、4キーも6キーも同様に処理している。

(3)PCクリップ内解説

次に、キー入力されボタンアクションによってPCクリップ内にgotoAndPlayされてくると、入力されたキーによって、PCの各向き「正面(フレーム名 F⁠⁠後ろ(フレーム名 B⁠⁠左(フレーム名 L⁠⁠右(フレーム名 R⁠⁠」のフレームが再生され、各処理が実行される。

Fla画面2 PCクリップ内
Fla画面2 PCクリップ内

(4)タイムライン解説・正面向き「F」の場合

PCの各向きでの処理は、移動方向や飛び先のフレームなどの違いはあれど、行っていることは同じなので、ここでは8キーが入力された場合に実行される正面向きを解説する。

Fla画面3 タイムライン正面向き「F」のアップ
Fla画面3 タイムライン正面向き「F」のアップ

【スクリプト①】の解説

8キーが入力されて「F」フレームへ飛んできたら、一歩先へ移動可能かどうか「マップ移動データ」をチェックし処理分岐させる。次の4つのパターンがある。

そしてこれが実際のスクリプト。

//PCの移動ウエイトを1(移動中)にする
../:ido_wait = 1;

//PCの現在位置から移動先の値をチェック
ido_next = substring (../:md, ../:pc_md + ../:md_xmax, 1);

//チェック結果による分岐
if (ido_next == 0) {
 ../:pc_posi = 1;
 ../:pc_md += ../:md_xmax;
 gotoAndPlay ("Fido");    ┛解説①A参照
} else if (ido_next == 1) {
 ../:pc_posi = 1;
 gotoAndStop ("Fstp");       ┛解説①B参照
} else if (ido_next == 2) {
 if (../:pc_posi == 1) {
  gotoAndPlay ("L");
 } else {
  ../:pc_posi = 1;
  gotoAndStop ("Fstp");
 }                           ┛解説①C参照
} else if (ido_next == 3) {
 if (../:pc_posi == 1) {
  gotoAndPlay ("R");
 } else {
  ../:pc_posi = 1;
  gotoAndStop ("Fstp");
 }
}                            ┛解説①D参照
〔解説①A〕

値が「0」の場合。

PCの向きフラグの値を1(↓向き)にし、マップ移動データ上のPC位置を一歩下へ移動した位置(移動前の位置+マップ移動データ1行数)に変更する(ex参照⁠⁠。そして、実際に一歩下へ移動させるため「Fido」フレームへgotoする。

(ex)移動前のマップ移動データ上のPC位置を100とした場合、一歩下へ移動すると、100+21=121となり、マップ移動データ上のPC位置は121に書き換わる。

〔解説①B〕

値が「1」の場合。

移動先に障害物があり進入できないので、PCの向きフラグの値を1にするのみ。終了処理を行うため「Fstp」フレームへgotoする。

〔解説①C〕

値が「2」の場合。この場合は、移動先に障害物があり進入できない+左方向へ回避移動なので、ここではその処理を行っている。

まず初めに、PCがすでに正面(↓方向)を向いているかPCの向きフラグの値をチェックし、その値が1なら、左方向への回避移動を行うため「L」フレームへgotoする。しかし1以外なら、PCが正面以外を向いている時に8キーを入力されているので、PCが正面を向くのみで終了する。PCの向きフラグの値を1にする。そして終了処理を行うため「Fstp」フレームへgotoする。

〔解説①D〕

値が「3」の場合。

基本的な処理内容は〔解説①C〕と同様で、右方向への回避移動となり、goto先は「R」になる。

【スクリプト②】の解説

ここでは、実際にPCを下方向へ移動させている。PCを下方向へ16pixel移動させると共にマップを上方向へ16pixelスクロールさせると、PCを画面の真ん中に保持したまま一歩下方向へ進むことになる。

【スクリプト③】の解説

移動終了となり、移動ウエイトを0に戻しておく。これにより、移動キーの入力が再び有効となる。

(5)そしてPCは移動し、マップの端でSTOP!

移動キーが入力され、前項(4)の処理によってPCは移動し、やがてマップの端に着く。この時、それ以上進めないようにしないと、PCはマップの端を通り過ぎて存在しないダークゾーンへ突入してしまう。しかし、この処理は簡単で、というか、マップ移動データの外周は全て1にしてあるので、前項(4)の処理によって、PCは必然的にマップの端で止まることになる。


…ということで、今回は終了!

次回まで、皆さんもオリジナルマップを作ってPCを移動させてみてはどうでしょう?

マップ移動データで進入可不可の設定(0、1、2、3)をするだけで、すぐに歩き回れるマップになるので、街とかダンジョンとか作って動き回ってみるのも面白いかも!?

それでは、また!

お疲れさま!!今回は以上です!さて次回は、イベントの作成をしちゃいます!イベントが入ると、マップ冒険ゲームだ~!って感じになるわよ。お楽しみに!!

おすすめ記事

記事・ニュース一覧