p2k8 blog mini

イラストを中心にその他色々紹介**天体写真はこちらに移転しました→https://p2k8-net.fc2.net/

【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です。

【1】 メッセージシステムの立ち上げ

前編で紹介した、hit.Testで会話する物体(宝箱、村人など)に触れ、
その状態のままEnterキーを押すことでメッセージシステムが発動する。

_root.sento = 1;
//▲キャラ操作停止。戦闘判定を利用してキャラを動かせなくしておく。
_root.mes_mc.gotoAndPlay("mes_multi";);
//▲メッセージシステム発動。
this.stop();


【2】 変数入力

会話インスタンスに外側から記述しています。
入力する変数は now と pg_su の2つだけです。

onClipEvent (load) {
//メッセージ欄のインスタンスで使用する初期ページ番号「now」を指定。
_root.fight.now = 4;
//ページ4番の変数。
_root.fight.pg_su = 4;
//ページ表示数は4。
}


ページ番号4番から、4ページを表示。
つまり、4~7ページを表示する、ということ。


【3】 カウンタの初期化


_root.fight.cnt = _root.fight.now;
this.play();

変数 now で、予め始まりの数字が指定されていますので、
変数 cnt の初期値は now と同じにします。
4を入力していますので、cnt と now には4が入ります。


【4】 メッセージの表示


onClipEvent (load) {
this.gotoAndStop(_root.fight.cnt);
//▲ここではメッセージ表示用にcntを使用している。
//メッセージ番号へ飛んで該当メッセージ(複数行)を表示する。
}

ムービーシンボルの単一フレーム表示を利用して目的のフレームを静止表示させます。



【5】 メッセージのスクロール


ここでは、プレイヤーがEnterキーを押すことで、メッセージが次のページへ移り変わる部分です。
以下のように、▼印のボタンを設けて、プレイヤー側からの入力を待ちます。

イメージ 2

ボタンのon();内には、Enterキーを押しても、直接マウスで▼をクリックしても良いようにしています。
いずれかが入力されたら this.play(); ですので、このフレームのASレイヤーにはStop();をかけています。



【6】【7】 判定と加算


表示させるページ数に達したかどうかの判定。もし達した(true)ならば、
メッセージ表示を終了させます。達していない場合は、elseの中で cnt を加算処理します。

if (_root.fight.now+_root.fight.pg_su-1<=_root.fight.cnt) {
//▲現在のページ番号(cnt)が表示し終わるページ番号(now+pg_su-1)を超えたならば。
this.gotoAndPlay("mes_close";);
} else {
_root.fight.cnt++;
//ページ番号を加算。
}


【8】 メッセージスクロール

先ほどのif文でelseとなった場合にこの処理が行われます。
そのため、先ほどelseのカッコ内でページ番号が1つ加算されたので、メッセージ表示インスタンス
一つ先のページに切り替わってしまったはずです。それでもそれは一つ前のフレームなので、時間軸は
なく、このフレームで対応すればよいのです。ここでは、表示しているメッセージをcnt-1番目のページに
切り替えます。先ほどまで表示していたメッセージ表示インスタンスに外側から記述する文です。


onClipEvent (load) {
this.gotoAndStop(_root.fight.cnt-1);
}


このインスタンスをモーショントゥイーンで上へスクロールさせます。
青枠の外側にはみ出してしまうので、青枠に収まるように四角いマスクを利用します。
そして、同じスピード(動き量)で、下から同じインスタンス(onClipEventを記述)が上がってくるようにします。
そのインスタンスが次のページを担うので、こう記述します。


onClipEvent (load) {
this.gotoAndStop(_root.fight.cnt);
}


お判りの通り、gotoAndStopをcnt-1ではなく、cntにして、1つ先のページの読み込ませています。
このスクロールが完了したフレームに記述したScriptから、そのまま判定へ戻らせます。

this.gotoAndStop("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);

メッセージボックスのクローズは、バトンタッチ先のspeak_mc側から行うようにしています。
これで、2つの変数(表示開始番号と表示ページ数)を読み込むだけで任意のメッセージ表示が
行えるシステムが完成しました。もちろん、別途メッセージをフレームごとに記述した「メッセージ表示インスタンス」が必要です。
---

開始日: 2005/2/9(水)