新しいマップを使えるようにする
前回までの「家 "House.qm"」のマップに加え、「町 "Town.qm"」のマップへ行けるようにしてみましょう。新しいマップを使えるようにするためには、そのマップのための新しいマップ関数も定義しないといけません。前回までのスクリプトを以下のように書き換えてください。「(中略)」の部分は前回と同じですので、適宜補完してください。
別のマップに移動する
localsave int g_Init = 0; // 主人公作成フラグ localsave int g_BoxOpen = 0; // 箱を開けたフラグ /* * 家のマップ関数 */ mapfunc House(){ // (中略) while(1){ // 無限ループ PeekAllMessage(); // 必ず必要 // ドアの場所に来たら外へ出る if(CheckPos2(3, 12)){ SetMap("Town.qm"); // 移動先マップを設定 SetTransit(11, 13, 0, 3); // 移動先座標を設定 return; // マップ関数終了 } // (中略) NormalProcess(1); // RPG 処理 } } /* * 町のマップ関数 */ mapfunc Town(){ // 毎回のロード処理 PutPlayer(); // 主人公を置く PlayMusic("Field.mid", 1); // BGM 再生 TransitMap(-1, 10); // 画面切り替え // メインループ while(1){ // 無限ループ PeekAllMessage(); // 必ず必要 // 家のドアに話しかけると中に入る if(Investigate(11, 12, 0, 1)){ PlaySound("Command.wav", 0); // サウンド再生 // ドアのチップを「開いたドア」に置き換える ReplaceObject(11, 12, 22, 23); RenderMap(0); // マップ描画 SetMap("House.qm"); // 移動先マップを設定 SetTransit(3, 11, 0, 1); // 移動先座標を設定 return; // マップ関数終了 } NormalProcess(1); // RPG 処理 } }
キャラクターの座標を調べる
家のマップには、壁が 1 箇所切れている所があります。キャラクターがここへ来たら外へ出るようにします。プレイヤーが操作しているキャラクターの座標を調べるには CheckPos2 関数を使います。マップを移動するための処理は、移動先マップの設定→移動先座標の設定→マップ関数を終了、という手順になります。マップ関数を終了するためにここでは return ステートメントを使用していますが、マップ関数から呼び出された別の関数内から一気にマップ関数を終了するためには ExitMapFunc 関数を使うと便利です。
新しいマップ関数を作る
町へ出るために、町マップのマップ関数を追加してあります。町マップは初期マップではないので、初期化処理がないため簡単ですね。やっていることは大体同じです。ドアに向かって話しかけると、箱を開けるのと同じ要領で「開いたドア」のチップに置き換えて、マップを描画してからマップ関数を終了します。ドアを開けた状態でマップを描画してからマップ関数を終了する、というのがミソです。なぜなら、マップ切り替えアニメーションを表示するための TransitMap 関数は、呼び出し時のバックバッファの画像から新しいマップへの画面切り替えを行うからです。
実行してみる
どうでしょうか。町と家の間を出入りできましたか?マップの移動も、RPG を作っていく上で非常に重要な手法ですので、必ずマスターしておいてください。次は、プレイヤー以外のキャラクターを町に配置してみます。