フリーゲーム・フリーソフトの開発過程を記録していく、TDtechnic公式ブログです。製品はカテゴリの「ダウンロード場」からダウンロードして頂けます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

こんにちは。AI作り始めたんですが、もうこのタスクシステムも厳しいと判断しました。キャラの視野判定を追加しようとしたときに思いました。やっぱり「兄弟タスク同士の連携」がやりにく過ぎます。

今回の設計理念は、「親は子を参照できないが、子は親を参照できる」というものです。このシステムでは親子間で連携する処理を子タスクにさせることでなんでもできました。ところがゲームのオブジェクトたちは同種のものなので兄弟関係であり、互いに参照のしようがありません。強引にやるなら、先日述べた「メッセージ」としてポインタを渡せないこともありませんが…。

また、もっと前から抱えていた問題もあります。コンストラクタが使えないのです。親子関係を前提としている以上、初期化処理の多くには親のポインタが必要です。しかし親ポインタは、タスク追加メソッドの引数としてnewした後にそのメソッド内で代入していたので、コンストラクタの段階では参照できないのです。このため本当の初期化は後から別の手段で行う必要がありましたが、どうもスマートになりません。

こんなに言語仕様と相性が悪いというのはやっぱり何かが違うんです。というわけでタスクシステムを見直しました(こんなんで夏休み中に完成するのかな…笑)。

まず、兄弟の問題。あるタスクに用があるということは、そいつの型は分かってるはずですよね。よってtypeidを使って目的の型の兄弟タスクを返すメソッドを追加しました。さらに、このように直に参照が得られればメソッド呼び出しができますので、もはやメッセージシステムすら要りません。ただし1フレームごとに溜めてから読み取るメッセージとは違い、同じフレームで同じ処理が複数回行われる可能性がありますので、その対策は必要ですが。

そしてコンストラクタ問題も解決しました。C++らしく、new演算子をオーバーロードして引数で親タスクへのポインタを受け取るようにしました。そしてmallocした直後にキャストして代入してしまうのです。こうすればコンストラクタ内で親ポインタが得られますので、初期化は全てコンストラクタで行えるようになりました。ついでにタスク追加処理もnewでやってしまいましたので、タスク追加メソッドも要らなくなりました!

というように仕様を策定するのも苦労するのですが、それを今までのコードに反映するというのもまた時間がかかります。そうしてこんなに遅れてしまいました。ようやく新システムに移植が完了しそうなので、今度こそ!AIを作りたいと思います。
関連記事

[2014/09/19 11:35] | 不死女 -Immortal girl-
|
コメント:
この記事へのコメント:
コメント:を投稿
URL:

パスワード:
非公開コメント: 管理者にだけ表示を許可
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。