半船半人 2022/07/27 23:20

ワープとマップと条件文

 皆様、ご無沙汰しております。人船です。

 ゲーム作り、辞めたわけではありません。ちゃんと作っています。ご安心ください。

 今回は『ワープ』のシステムを作っている部分をお見せします。
 さらに、並行して『チャプターセレクト』のシステムも実装予定です。分岐やBADを大量に用意する場合は必須だと思いますが、実装している同人ゲームはあまりない気がします。回想シーン全開放の方が作るのも見るのも楽だからでしょうか?



 ワープとは


 既に行ったことのあるマップに一瞬で移動できる機能です。
ファストトラベルとかお洒落な表現もありますが、素直に短く「ワープ」としています。

 普通に実装するならば一度マップに入るとフラグが立ち、フラグが立ったマップにワープできるようにすればそれだけで完成です。
 今回何で苦労しているのかと言いますと……。

  • チャプターセレクトと併設したい(『一度行った場所』が条件だとチャプターセレクトで過去に飛んだ時に本来行けないマップへワープできてしまう)。
  • ワープ先選択画面で上下左右キーの入力を全て可能にしたい。

 という二つの要素を同時に実装しようとしているためです。



 上下左右キー問題については、選択画面をお見せすれば分かりやすいでしょう。


 暫定的に作られたワールドマップです。この中で、ワープ先の候補が9か所用意されています。

 テンキーや電卓のような並びになっています。これは意図的なもので、マップ内のワープ候補が無作為な位置にあると分かりにくいためです(例えば、今の場所から「ちょっと右上にあるダンジョン」と「ちょっと右下にある村」があると右キーを押したときどちらにカーソルが動くか分かりにくいですよね)。

 さらに、左右移動したい時は±1、上下移動したい時は±3にすることで数値上の処理もやりやすくなります。



 ここまでは簡単なのですが、問題は順次解放されていくマップ。

 最初に城からスタートし、森、荒野、南の村の順で入れるようになります。
 すると数値の開放が5→6→7→8。意図したわけではありませんが、一応連番になります。
 しかし、この後に開放したいのが3。そこから2→1→4と進みます(9は余ったので入れただけで予定は入ってないです)。
 番号が連番ならば最低値と最高値の定義だけで終わりますが、飛び飛びで解放されると途端に面倒くさくなります。この問題で悩んでおります。






 いや……?




 まてよ……?


 じゃあ南の村の次に4の村に行くシナリオにすればよいのでは……?



 問題解決!!
シナリオ練り直しの問題はありますが。





 続いて、チャプターセレクトとの併設問題です。

 チャプターセレクトは「イベント進行度変数のセット」と「一番居て欲しいマップへのワープ」を同時に行うことで実装予定です。
 イベント進行度変数はメインシナリオが進むたびに増えていき、次のイベントフラグを立てていく役目を負っています。例えば森に入るフラグを立てた後の進行度は「5」ですので、後から進行度を「5」、現在地を森に変更することで全てのフラグを巻き戻してチャプターセレクトを再現できるということになります。
 こうすることで魔王城へ進んだデータでも、チャプターセレクトで「5」の過去に戻って初期パーティでサブイベントや分岐を探すことが可能になります。

 しかしうっかりワープ先候補の変更を実装し忘れていたら大惨事です。「」と「」にしか移動できない初期パーティで「魔王城」へワープできてしまいますからね。例えるならポケモンでバッジ0個でも「そらをとぶ」でチャンピョンロードへ飛べちゃうようなものです。

 これらを解決する最もスマートな手段がワープ先候補とイベント進行度変数の連動です。イベント進行度が「0」以上で城、「5」以上で森、「16」以上で荒野……という風に開放していくようにすれば全て自動的に解決します。



 ここでややこしくなるのがワープ先の開放順。さっき5→6→7→8→4→3→2→1になるように変更したので助かりましたが、5→6→7→8→3→2→1→4だったら地獄でした。
 何しろ変数が変化する度にイベント進行度に応じた条件を満たしているかをチェックする必要があるのです。


 簡単に書くと、以下のような条件文をワープ画面でカーソルが動く度に行います。

進行度がn(1)以上の場合、ワープ先が0以下になっていないか?
 yes→ワープ先を「9」にして次へ
 no →進行度がn(2)以上の場合、ワープ先が1以下になっていないか?
    yes→ワープ先を「9」にして次へ
    no →進行度がn(3)以上の場合、ワープ先が2以下になっていないか?
        yes→ワープ先を「9」にして次へ
        no →進行度がn(4)以上の場合、ワープ先が3以下になっていないか?
           yes→ワープ先を「9」にして次へ
           no →進行度がn(5)以上の場合、ワープ先が4以下になっていないか?
              yes→ワープ先を「9」にして次へ
              no →次へ


 ※n(X)はX番のマップを開放している際の進行度の値


大体は一番下まで素通りしますが、指定できない数値にカーソルが動いた時のみ最大値9へリセットし、次に最大値より超過していないかをチェックさせます(最大値のチェックも似たような文なので省略)。

 これは綺麗に連番になっているので順番にチェックするだけで済んでいますが、「4」が独立しているとさらに「4」未開放の時に「4」になっていないか? という条件文も追加されます。ややこしさが増えれば増えるほどバグの発生確率が高くなります

 もう少しスマートな方法がないかなと悩んでいますが、正直これ以上の改善方法も思いつきませんし、悩んでいてもゲームは完成しないのでこのまま実装するかと思います。
 テスト版を実装出来たらワープ機能のテスト版としてまたサンプルを出してみたいと思います。

フォロワー以上限定無料

余談

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

記事を検索