【AS】RPGメッセージシステム後編
【AS】RPGメッセージシステム後編
RPGで複数にわたるメッセージを連続表示するAction Scriptの処理流れです。興味のない方は無視して下さい。文中の変な顔文字はWiki文法の仕業ですので括弧閉じとセミコロンに置き換えて読んで下さい。
高校時代に習ったフローチャートを思い出して書きましたが、いかんせん8年ぶり。作図の自信はありませんがとりあえずザッと書いてみました。2つの変数を読み込んでメッセージのページ送りする処理の流れをご覧下さい。
変数一覧
/*【戦闘シーンの変数代用】_root.fight.now・・・・・・・初期のメッセージ番号 (ここでは 'now' とする)
_root.fight.pg_su・・・・・・・メッセージを表示するページ数 ('pg_su' 〃)
_root.fight.cnt・・・・・・・(変動型)現在のメッセージ番号 ('cnt' 〃)
*/
ここからは、フローチャート各部ごとの詳細な説明とScriptです。
_root.sento = 1;
//▲キャラ操作停止。戦闘判定を利用してキャラを動かせなくしておく。
_root.mes_mc.gotoAndPlay("mes_multi"
//▲メッセージシステム発動。
this.stop();
//▲キャラ操作停止。戦闘判定を利用してキャラを動かせなくしておく。
_root.mes_mc.gotoAndPlay("mes_multi"
//▲メッセージシステム発動。
this.stop();
onClipEvent (load) {
//メッセージ欄のインスタンスで使用する初期ページ番号「now」を指定。
_root.fight.now = 4;
//ページ4番の変数。
_root.fight.pg_su = 4;
//ページ表示数は4。
}_root.fight.now = 4;
//ページ4番の変数。
_root.fight.pg_su = 4;
//ページ表示数は4。
ページ番号4番から、4ページを表示。
つまり、4~7ページを表示する、ということ。
つまり、4~7ページを表示する、ということ。
_root.fight.cnt = _root.fight.now;
this.play();
this.play();
変数 now で、予め始まりの数字が指定されていますので、
変数 cnt の初期値は now と同じにします。
4を入力していますので、cnt と now には4が入ります。
変数 cnt の初期値は now と同じにします。
4を入力していますので、cnt と now には4が入ります。
onClipEvent (load) {
this.gotoAndStop(_root.fight.cnt);
//▲ここではメッセージ表示用にcntを使用している。
//メッセージ番号へ飛んで該当メッセージ(複数行)を表示する。
}//▲ここではメッセージ表示用にcntを使用している。
//メッセージ番号へ飛んで該当メッセージ(複数行)を表示する。
ムービーシンボルの単一フレーム表示を利用して目的のフレームを静止表示させます。
ここでは、プレイヤーがEnterキーを押すことで、メッセージが次のページへ移り変わる部分です。
以下のように、▼印のボタンを設けて、プレイヤー側からの入力を待ちます。
以下のように、▼印のボタンを設けて、プレイヤー側からの入力を待ちます。
ボタンのon();内には、Enterキーを押しても、直接マウスで▼をクリックしても良いようにしています。
いずれかが入力されたら this.play(); ですので、このフレームのASレイヤーにはStop();をかけています。
いずれかが入力されたら this.play(); ですので、このフレームのASレイヤーにはStop();をかけています。
表示させるページ数に達したかどうかの判定。もし達した(true)ならば、
メッセージ表示を終了させます。達していない場合は、elseの中で cnt を加算処理します。
メッセージ表示を終了させます。達していない場合は、elseの中で cnt を加算処理します。
if (_root.fight.now+_root.fight.pg_su-1<=_root.fight.cnt) {
//▲現在のページ番号(cnt)が表示し終わるページ番号(now+pg_su-1)を超えたならば。
this.gotoAndPlay("mes_close"
} else {this.gotoAndPlay("mes_close"
_root.fight.cnt++;
//ページ番号を加算。
}//ページ番号を加算。
【8】 メッセージスクロール
先ほどのif文でelseとなった場合にこの処理が行われます。そのため、先ほどelseのカッコ内でページ番号が1つ加算されたので、メッセージ表示インスタンスは
一つ先のページに切り替わってしまったはずです。それでもそれは一つ前のフレームなので、時間軸は
なく、このフレームで対応すればよいのです。ここでは、表示しているメッセージをcnt-1番目のページに
切り替えます。先ほどまで表示していたメッセージ表示インスタンスに外側から記述する文です。
onClipEvent (load) {
this.gotoAndStop(_root.fight.cnt-1);
}このインスタンスをモーショントゥイーンで上へスクロールさせます。
青枠の外側にはみ出してしまうので、青枠に収まるように四角いマスクを利用します。
そして、同じスピード(動き量)で、下から同じインスタンス(onClipEventを記述)が上がってくるようにします。
そのインスタンスが次のページを担うので、こう記述します。
青枠の外側にはみ出してしまうので、青枠に収まるように四角いマスクを利用します。
そして、同じスピード(動き量)で、下から同じインスタンス(onClipEventを記述)が上がってくるようにします。
そのインスタンスが次のページを担うので、こう記述します。
onClipEvent (load) {
this.gotoAndStop(_root.fight.cnt);
}お判りの通り、gotoAndStopをcnt-1ではなく、cntにして、1つ先のページの読み込ませています。
このスクロールが完了したフレームに記述したScriptから、そのまま判定へ戻らせます。
このスクロールが完了したフレームに記述したScriptから、そのまま判定へ戻らせます。
this.gotoAndStop("mes_stop"
//mes_stopは判定部分のフレーム名。ループ先で停止。
//mes_stopは判定部分のフレーム名。ループ先で停止。
【9】 初期化
メッセージ表示システムで使用した変数を最後に初期化しておきます。これらの変数は戦闘シーンでも使用するし、変数が残ったままだとバグとなる恐れがあるので、
念の為に初期化します。無難な0で。
_root.fight.cnt = 0;
_root.fight.pg_su = 0;
_root.fight.now = 0;
//▲【初期化】使い捨てではありません。使った後は元あった状態に戻しましょう。
_root.sento = 0;
//▲キャラ操作可能に復帰。
_root.field.speak_mc.gotoAndStop("after"
//▲このタイムラインを発動させた元(speak_mc)に、時間軸を受け渡す。
this.gotoAndStop(1);
_root.fight.pg_su = 0;
_root.fight.now = 0;
//▲【初期化】使い捨てではありません。使った後は元あった状態に戻しましょう。
_root.sento = 0;
//▲キャラ操作可能に復帰。
_root.field.speak_mc.gotoAndStop("after"
//▲このタイムラインを発動させた元(speak_mc)に、時間軸を受け渡す。
this.gotoAndStop(1);
メッセージボックスのクローズは、バトンタッチ先のspeak_mc側から行うようにしています。
これで、2つの変数(表示開始番号と表示ページ数)を読み込むだけで任意のメッセージ表示が
行えるシステムが完成しました。もちろん、別途メッセージをフレームごとに記述した「メッセージ表示インスタンス」が必要です。
---
これで、2つの変数(表示開始番号と表示ページ数)を読み込むだけで任意のメッセージ表示が
行えるシステムが完成しました。もちろん、別途メッセージをフレームごとに記述した「メッセージ表示インスタンス」が必要です。
---