こんばんは。


前回に引き続いて、イベントの処理を実装してみましょう。


基本的な考え方としては、メインループの中で


条件を満たしているイベントを探す→そのイベントの処理をスクリプト上で探す→実行する


ということになります。


複数の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の花形のひとつですので、万全をもって実装したいものですね!





こんばんは。

さて、今日はRPGに必須な「イベント」を実装しましょう。イベントと言ってもキーイベント等のシステム上のイベントではなく、キャラが会話したり移動したりするあのイベントです。

実装方法は色々あるでしょうし、まだこれからも自分で拡張していくとは思うので、今日は触りと簡単な思考実験だけに留めておきます。

さて、イベントの定義ファイルは当然外から読み込むものとして、インタプリタ型の実行エンジンを実装します。具体的には

「マップデータの読み込み時、イベント名、イベント開始条件等必要なデータを保持する一方、イベントの内容自体は読み込まない。イベントが開始条件を満たしたとき、実行ファイルの当該部分をシークして、実行を開始する。」

という感じになります。さすがにデータをバラバラに扱うのは面倒なので、Eventクラスを定義してしまいましょう。

class Event{

  String key;

  String activate;

  int x,y;

  public Event(String key, String activate,int x,int y){

    this.key = key;

    this.activate = activate;

    this.x = x;

    this.y = y;

  }

}

keyは「イベント名」、activateは「イベントの発生条件」、x、yは「イベントの場所」を表すことを見込んでいます。将来的にはintでいい気もしますが、直感的に扱いたかったのでStringにしました。後で最適化する可能性が高いです。

activateには、たとえばマップ開始時強制的に始まる「initial」やどこかに移動したとき始まる「onplace」、話しかけたときに始まる「tospeak」等が挙げられるでしょう。initialにはイベントの場所はありません。

なお、始めは繰り返し残るイベントや一回のみのイベントを区別するべくtypeという変数を実装していましたが、スクリプトの命令に「自分自身(イベント)を取り除く」という命令を追加するにあたり削除しました。

これ以上に複雑なイベントの発生条件(フラグ等)はイベントの定義でなく実行命令の方で判断しています。


将来的にはモブキャラクターにイベントを内包したりと、夢が広がりますね!




※前に言った携帯のメモリ量について、157MBとかいう世迷言を言ったバカがいた気がしますが、どうも単位を間違えていたようで、恐らくは1.57MBではないかと思います…

ほんとに申し訳ありませんでした。



こんばんは。


最近は「J2ME TIPS」というより「RPG TIPS」の様相を呈してきましたが…


とりあえず、HPの残量をバーで視覚化してみましょう。


単純に言ってしまえば、バーの表示部が透過されているゲージの「枠」の画像を用意して、


ゲージ全体分の赤→残り体力%分の幅の青→ゲージ枠、の順に上から被せて描画すればいいです。何も難しいことはないですね。


intの特性上、青を後から被せて描画した方が幅が上手くいくと思います。加えて描画の際は通常左上のドットを指定すると思うので、右から描くバーを後から描画する場合は開始頂点についても計算が必要になってしまいますしね。





これだけでは寂しいので、装備アイテムの適正について。


ここでいう適正というのは、「ID~番のキャラクターはこのアイテムを装備できる」というものです。


さて、一人一人に対してbooleanで変数を持っているのは様々な弊害があります。他のアイテムデータと統合が取れなくなるし、何よりそもそもキャラクターが何人いるか分からない限り変数をいくつもっていいかすら分かりません。


ここまで弊害が大きくなるような場合は、Stringで列挙してしまった方が単純で楽です。たとえば、


equip.tekisei = "-0-2-3-";


等として、「IDが0,2,3のキャラクターは装備できる」という約束にしておけば、IDがN番のキャラクターがそのアイテムを装備できるかは


if(equip.tekisei .indexOf("-N-") > 0) で簡単に判別できます(indexOfは文字列を含まない場合-1を返すため)。


これならスクリプトでも見た目通りに記述できますし、使用時のメッセージの代わりにこれを格納しておけば、使用アイテム等とも共通のクラスで装備アイテムが表現できるかもしれません。


なお、両側に区切り文字をつけておかないと、1や0が10にも引っかかるという間抜けな自体が起こってしまいますので、しっかり両側で区切りましょう。「-」でなく「|」や「,」でもいいかもしれません。