こんばんは。
前回に引き続いて、イベントの処理を実装してみましょう。
基本的な考え方としては、メインループの中で
条件を満たしているイベントを探す→そのイベントの処理をスクリプト上で探す→実行する
ということになります。
複数のEventの扱いについて、イベント自体は前回実装したEventクラスのオブジェクトを作ればいいでしょう。通常1マップごとにイベントの集合は中身が入れ替わると思いますが、最大でいくつあるか分からないため、配列をつくるのは適していません。代替案として、
a)Vectorクラスを使う
b)双方向リストを使う
等があります。
a)については、実装は非常に楽です。もしかしたらb)の方が効率がいいかもしれませんが、気にするほどでもないレベルだとは思います。
念のため双方向リストの基本をおさらいしますと、前回のEventクラスにEvent変数nextとprevを用意して、それぞれで自分の前後のイベントを参照するようにします。図にすると、prev←Event→nextとして
null←start⇔イベント1⇔イベント2⇔…⇔イベントn⇔end→null
という感じになります。双方向リストは、単方向リストに比べ、自分の直前の要素がすぐに分かるので要素の削除が容易という利点があります。
あとは、上記の機能をそれぞれ実装するだけです。イベントの処理をスクリプト上で探すために、スクリプトを処理するクラスに「特定の文字列をサーチする関数」を実装しておく他、イベントの種類によってはkeysuspend等をいじる必要があったりもして、中々厄介です。キーによって発生する話しかけイベントなどもあることを考慮すれば、
まず、現在の状況によって発生しているイベントがあれば処理→キー操作を止める必要があれば止める→止める必要がなければ、キー処理→キー操作によって発生するイベントがあれば、処理
と、1ループで複数回のイベント発生の判断を行う必要があるかもしれません。さらに、複数のイベントが同時に発生しないか、イベントの発生が1フレーム遅れないか、など悩みのタネはつきません…
あまりに具体的なところまで突っ込みますと、話が膨れ上がってしまうので、このあたりに留めておきます。イベントはRPGの花形のひとつですので、万全をもって実装したいものですね!