fc2ブログ

ウディタ中級者になるためのその2~疑似並列実行イベント~

今回はローグライクとかアクションとか、キー入力を頻繁に受け付けるゲーム製作者さん向けの記事になります。
常時複数のキー入力を監視しているようなゲームをつくるとき、みなさんどうしてますかって話ですね。
自分は以前、(バグだらけの)ローグライクゲームを作って非常に痛い目に遭っているので分かるんですが、並列実行コモンはとにかく使いづらいです。
1フレームに一度判定しにきてくれるので、メニュー起動とかには便利だし不可欠な場合もあるんですが、ローグライクとかの場合だと事情が(かなり)変わってきます。

↓実例
・某ローグライクゲームで、ワナ探知と移動受付を別々の並列コモンで組んだせいで、1ターン中に方向キーとワナ探知キーを同時押しすれば、ごり押しで2回行動できるバグ。
・某ローグライクゲームで、ダッシュの高速処理中に、NPCの移動(のピクチャ更新)が終わらないうちに次のターン判定がやってきてしまい、敵の表示位置がおかしくなるバグ。

他にもこの手のバグは掃いて捨てるほどあるんですが、全部が全部、キー入力系統を並列実行で組んだことが原因です。
ようするに並列実行だと、その並列実行を一時的に停止させたいタイミングでうまく停止してくれるかどうかが不確実なんですね(正確に言えば、ウェイト1フレームを適切な場所にはさめばいいのだけど、あちこちで並列を組んでいると必ず見落としがある。しかも発見はかなり困難)。

ということで某ローグライクでひどい目に遭ったので、なんとか別の手段をとらねばと思い、そして思いつきました。
C+とかでプログラミングをやったことがある人には当たり前の感覚なんだろうけど、こんな感じです。

■ループ開始
|■キー入力:このコモンEvセルフ変数0 / 決定(10)
|■条件分岐(変数): 【1】CSelf0 が 10と同じ
|-◇分岐: 【1】 [ CSelf0 が 10と同じ ]の場合↓
| |■ループ中断
| |■
|◇分岐終了◇
|■ウェイト:1 フレーム
|■
◇ループここまで◇◇

簡単なサンプルですが、こんな感じのコマンドを起動条件「呼び出しのみ」のイベントで組んでみます。
で、このイベントを呼び出してやると、決定キーが押されるまでは延々とループしつづけ、決定キーが押されたらループ中断してくれます。
これを応用して、方向キーとかキャンセルキーとかの取得をこのループの中に組み込めば、「方向キーが押されたら移動」、「キャンセルキーが押されたらメニュー」みたいな処理を作れそうです。
この常時ループイベントが並列イベントと違って使いやすいところは、なんといっても「必要なタイミングにしか処理が行われない」ことでしょう。呼び出しイベントなので、こっちが呼び出してやるまではキー入力判定が行われないわけです。

これをさらに発展させて、ローグライクの図式にするとこんな感じ。

・1ターンの処理を実行するイベント
 ■ループ開始
|■イベントの挿入[名]: ["主人公操作"] <コモンEv 3>
|■イベントの挿入[名]: ["NPC移動処理"] <コモンEv 17>
|■ウェイト:1 フレーム
|■
◇ループここまで◇◇

・↑のイベントの中の「主人公操作」イベント
■ループ開始
|■キー入力:このコモンEvセルフ変数0 / 8方向 決定(10) キャンセル(11)
|■条件分岐(変数): 【1】CSelf0 が 1以上
|-◇分岐: 【1】 [ CSelf0 が 1以上 ]の場合↓
| |■条件分岐(変数): 【1】CSelf0 が 10と同じ 【2】CSelf0 が 11と同じ
| |-◇分岐: 【1】 [ CSelf0 が 10と同じ ]の場合↓
| | |■イベントの挿入[名]: ["攻撃処理"] <コモンEv 10>
| | |■
| |-◇分岐: 【2】 [ CSelf0 が 11と同じ ]の場合↓
| | |■イベントの挿入[名]: ["メニュー起動"] <コモンEv 11>
| |-◇上記以外
| | |■イベントの挿入[名]: ["主人公移動"] <コモンEv 12>
| |◇分岐終了◇
| |■
|◇分岐終了◇
|■ウェイト:1 フレーム
|■
◇ループここまで◇◇

めちゃくちゃ簡略化したサンプルですが、ローグライクゲームの根幹はこんな感じです。
ループの中にループを入れ子にしていく感じですね。
というか、ローグライクに限らず普通のゲームってこういう構造をしてるんですよね。ウディタから始めたからゲームの根本のところが分かってないんだけど、1から自作しようとすると、こういう感覚が普通なのかも。

ローグライクゲームを作りたい方は、参考までに。
とりあえず今日の教訓は、常時キー入力受付系コモンは複数の並列イベントでつくっちゃだめってことと、システム自作する人はループを使ったイベントも使ってみてねってことです。
関連記事
スポンサーサイト



コメントの投稿

非公開コメント

Twitter
カテゴリ
最新コメント
月別アーカイブ
カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR