ゲーム開発に使える?@マークタグの紹介
目次
ゲーム開発
最近はC++でゲーム開発をしている。
独自のゲームスクリプトを作ってそれでゲームロジックを書いている。
なので最近は他のことには時間を使っていない。
ゲームは将来的には販売できればと思っている。
ゲーム開発で得られたノウハウはブログなどでアウトプットしようか検討している。
しかしゲームはシナリオが大変である。
私はシナリオライターではないので、キャラクターの台詞とかを考えるのが大変だ。
シナリオを書ける人はすごいと思う。
記事のネタになりそうな技術的な話
ネタになりそうなのはEvent
かな。
ゲームはイベントドリブンで開発しているんだけど、そのイベントの種類を表現するクラスがEvent
.
typedef enum { EV_NULL, EV_EXIT, } EventType; class Event { public: static Event Null; EventType mType; Event(EventType type); }; Event Event::Null = Event(EV_NULL);
上記のような構造になる。
EventType
がイベントの型を表す定数。なぜ定数ではなくクラスを使うのかと言うと、クラスにしておくとパラメーターなどをクラスに持たせることが出来る。そうするとイベントが発生した時点での変数をこのクラスに保存することができる。イベントをハンドリングする処理でその変数を取り出して処理を行うことができるので、何かと便利なのである。
Event Game::run(long tim) { Event ev = Event::Null; return ev; }
AtMarkタグ
あとゲームを開発していて発明をしてしまったかもしれない。
タグなのだが、HTMLに比べるとかなり書きやすく汎用性もあり、開発でとても役に立っている。
どういうタグかと言うと「@」で始まるタグで、識別子とキーワード引数、それからテキストコンテンツか子タグを配置できるというものである。
@script name="myscript" trigger="action" { @print: Hello, World! Hello, World! @print: Good Bye! Good Bye! }
上記のように「@」の後にタグ名があり、半角スペースで区切られてキーワード引数が並ぶ。キーワード引数は「キー=バリュー」とい書式で並んでいる。末尾のブレースで囲まれたものはそのタグの子タグになり、階層構造を表現できる。また、末尾にコロンがある場合はそれ以降のテキストはタグのテキストコンテンツになる。
このタグを使ってスクリプト言語を実装しているので、たとえばif文などは以下のようになる。
@if expr="var == 1" { @print: Hello, World! } @elif expr="var == 2" { @print: Good Bye! } @else { @print: Greetings! }
このアットマークタグの良いところはパースが楽だというところだ。アットマークで始まっているため、アットマークを検出すればパースに移ることができる。
実はこのアットマークタグは今回のゲーム開発以外でも使っていて私の個人開発の中では歴史のあるタグなのである。何回も使っているとやはり便利だと思えてくる。