2016年10月14日

【鼈口飴】見取り図裏側 2/2


こんにちは、しげまろです。
最近じゃが芋にはまっています。うまい。

さて、早速前回の記事「 【鼈口飴】見取り図裏側 1/2」の続きを書いていきます。

前回は以下の機能について説明しました。
・矢印キーによるマップの移動
・鍵を開ける前と後のアイコンの変更
・鬼灯を食べる前と後のアイコンの変更
・薬を使った前と後のアイコン変更

今回説明するのは以下の3点です。
・主人公のアイコン点滅
・エンターによるマップ切り替わり
・Xキーによる元画面への遷移

■主人公アイコンの点滅

エディタ上では以下のように、イベントは3つありました。

前回までの制御は①のイベントにて行っていました。
主人公アイコンの点滅は、画像移動とは別のイベント(イベント③)で制御しています。

以下が、イベント③の中身です。

このイベントも、操作中に画像を更新するのでトリガーを「並列処理」に設定します。
出現条件は「セルフスイッチAがON」に設定します。これは、好きなタイミングで主人公アイコンを表示・点滅させるためです。主人公アイコンは初めからマップ上に表示されているので、イベント①での画像表示(初期化)時にセルフスイッチAをONにしておいてください(マップ切り替え時にOFFにします)。

始めに条件分岐が入っていますが、これはページ切り替えに関する処理なので無視してその中身を見ていきましょう。
n="1900_現在地"
x = $mx + 245
y = $my + 310
screen.pictures[4].show(n,0,x,y,100,100,$m_op,0)
まず、他の画像と同じように、画像を表示するスクリプトを設置しています。
ここで他と違うのは、不透明度に変数($m_op)を入れているところです。この値の初期値は、前回の画像表示するとき(イベント①)にあらかじめ設定しておきます。

この「不透明度」を時間経過で変化させることによって、主人公の点滅を実現しています。
次の処理が不透明度を変化させる処理です。
if $m_count >= 120
 $m_count = 0
elsif $m_count >= 96 && $m_op > 15
 $m_op -= 10
elsif $m_op < 255
 $m_op += 10
end
$m_count += 1
$m_count が 96 以上かつ、不透明度の値が 15 より大きいとき $m_op(不透明度)を +10、
不透明度が 255 未満のときに $m_op を -10 しています。
カウント($m_count)の値や $m_op の変化量は好きな点滅速度になるよう調整してください。

これで主人公アイコンの画像は時間経過で点滅し、移動にも対応します。
ただし、上記の状態ですとウェイト 1フレーム毎に画像が描画されるので、無駄に処理をさせたくない場合は、不透明度が更新されたときや座標が変わったときのみ画像の再描画処理をするといいでしょう。

■マップ切り替え

マップ切り替えは3つ目のイベントで制御しています。①の中に処理を入れても問題ないと思いますが、見づらいので分けています。


イベント②の中身は以下の通り(これまた分かりづらい)。

とりあえず、切り替え処理もいつでも受け付ける処理なので、トリガーは「並列処理」に設定します。

①入力キーの受け付け

「マップの切り替え」と「主人公が居た元画面への遷移」の二つの処理は、このイベントで一緒に制御しています。なので、方向キーと同じように条件分岐の処理を入れます。

ボタン B(メニュー画面開くキー)で元画面へ遷移、ボタン C(決定キー)で切り替えるように作っていきます。

②マップの切り替え

先に、切り替えの処理を見ていきましょう。
見づらいので上の画像では一旦間の処理を抜いています。
まず、決定キーを押した後の動作の確認です。
 1. 画面のフェードアウト
 2. 現在表示しているから次マップの判定
 3. 前回の画像を消去
 4. 次のマップ上のアイコンを表示
 5. 次のマップを表示
 6. 画面のフェードイン

こんな感じで実現できそうですね。


画面のフェードアウトとフェードインの処理は共通の処理ですので、始めと終わりに設定します。
間に、2.~5.の処理を「★ここに入れる★」の箇所に入れていきます(画像では切り替え時のSEを流す処理が入っていますが、これはお好みで)。

2章のマップは、「中央、太陽、星、月」の4つの部屋があるので、表示するマップも4つになりますね。マップの表示というと、以下のスクリプトで画像表示ができると前回説明しましたね。
n="2500_MAP_" + $map_page
screen.pictures[3].show(n,0,$mx,$my,100,100,255,0)
前回は $map_page に "entrance"という文字列を入れることで、「2500_MAP_entrance」という名前の画像を表示していました。他の部屋のマップもこの画像名と同じ法則(※1)で付けていますので、$map_page に入れる文字列を変更するだけで、画像を表示することができます。
※1 画像名の頭を共通の「2500_MAP_」にして、それ以降は各部屋(entrance, sun, star, moon)の名前を付けています(例えば、太陽の間の場合は"2500_MAP_sun"となる)。

ということで、各部屋のマップ表示処理(条件分岐した後)にて $map_page の値を変更するので、マップ表示のスクリプトは共通の処理として、条件分岐後に入れておきましょう。


さて、$map_page に各部屋名である"entrance", "sun", "star", "moon"の文字列が格納されます。
ということは、 $map_page に格納されている文字列から現在表示されているマップが判別できます。
このように、現在表示されているマップを判定して、分岐後の中身にそれぞれ対応した処理を入れていきます。
例えば、表示されているマップが中央の部屋のとき $map_page には "entrance" の文字列が入っています。なので、$map_page に "entrance" が格納されているときは、次に表示されるマップである「太陽の間」のマップやアイコンを描画する処理を入れます。また、ここで忘れずに、$map_pageに次のページの文字列を入れてください。例の場合は $map_page = "sun" となります。

【補足】
 ・ マップの初期位置について
今回の実装では、マップ切り替え時に新しいマップが表示されるとき、その前のマップの位置が保持された状態になっています。マップ切り替え時に任意の位置を表示したい場合は、マップごとに $mx, $my の値を設定してください。

ここで、不思議に思った方が居るかもしれませんが、上記の条件分岐の条件で一番初めに $map_page == "moon" (星の部屋の時)の判定が入っています。
これは、主人公アイコンの表示に関連しています。
現在表示されている「星の間」の時、次に表示されるのは「中央の間」です。主人公アイコンが表示されるのは、「中央の間」のときだけですね。つまり、この時だけ、主人公アイコンを表示する処理(イベント③のセルフスイッチAをONにする)が入り、後は非表示にする処理(イベント③のセルフスイッチAをOFFにする+ピクチャの消去)になります。

この処理の為に一番初めに「星の間」かどうかの判定を入れています。

これで「マップ切り替え」時のマップ、アイコンの表示は出来るようになりました。
しかし、このままだとアイコンを表示したままの処理になっているため、切り替え時に前のマップのゴミが残ってしまいます。
一番最初に共通処理として、アイコンに使ったピクチャ消去の処理を入れておきましょう(連番でアイコン用のピクチャを使うとスクリプトで簡単に消せます)。


③他のイベントへの対応

マップ切り替えによって、他のイベントへ対応する必要が出てきました。
主人公アイコンの制御のイベント③には既に「中央の間」のとき、という条件分岐が入っていましたね。
他に、イベント①の処理も手を加えなくてはいけません。前回の記事で方向キーに対応したのは、「中央の間」のマップとアイコンだけです。ここまでの処理では、決定キー押下によるマップの切り替えには対応していますが、方向キーを入力すると画像が「中央の間」のマップに戻ってしまいます。
ということで、イベント①の方向キー入力の画像表示処理に条件分岐を入れましょう。

これで「マップ切り替え」の機能が実装できました。

【補足】
 ・ 同じ処理について
お気づきとは思いますが、イベント①(マップ移動の制御)とイベント②(マップ切り替え)のときのアイコン表示処理が同じですね。同じことなのに、ご丁寧にこれだけの処理を複数個所に書くのは手間だし、修正するときもとても大変です(「中央の間」の場合は初期化時点も含めると3か所も同じ処理を書く必要がある)。まさにバグのモト。そんなときは、以下のスクリプトがおススメです。
マップイベント呼び出し - 半生@Page(仮)
別のイベントに入れておいて、call_event(n, m) で呼び出すだけで使えます。とても便利です。

④元の画面への遷移

さて、マップの機能も大体出来てきました。
最後に主人公を元のマップに戻してあげましょう。

上記では、ボタンB(メニュー画面開くボタン)を押下時にイベント②のセルフスイッチAをONにしています。セルフスイッチAがONになると、イベント②の次のページのイベントが実行されるように設定します。

以上のように、出現条件は「セルフスイッチAがON」、トリガーは「自動実行」に設定しました。

イベントの内容は、マップ表示の後始末をしています。
ここで主な後始末は以下の3点です。
・ 使用したピクチャの消去
・ イベントのセルフスイッチをOFFに設定
・ 主人公の元画面への移動

ピクチャの消去は言わずもがななのですが、この画面にはまた戻ってくる可能性があるので、必ず各イベントのセルフスイッチはすべてOFFにしましょう(ピクチャを表示するイベントもあるので、OFFにしてからピクチャは消去しましょう)。これらの処理は、マップ切り替えと同様にフェードアウト、フェードインで挟んで隠します。
また、ここで主人公の透明状態やメニュー画面の使用許可など、元画面に戻ったときの初期化(ここには書いてありませんが、腹ペコゲージの初期化など)も行っています。


ということで、かなり長くなってしまいましたが、こんな感じでマップを作っていました。
正直、まだまだ見直す部分があると思いますので鵜呑みにせずに良いと思う方法を試してみてください。


ここまで読んでいただき、ありがとうございました。


(しげまろ)