こんばんは。
さて、今日は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ではないかと思います…
ほんとに申し訳ありませんでした。
さて、今日は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ではないかと思います…
ほんとに申し訳ありませんでした。