今回はプログラムの話。
私はいままで力技でゲームを作ってきました。シングルトン使いまくりで、設計とか考えずに、とりあえず動けばいい。そういうやり方を続けてきたわけですが、そろそろもう少し見通しのいいコードにしたい。そこでクラスを細分化し、どのクラスがどのクラスを知っていればいいのかを考えてみました。
しかし、どうしても流れからはみ出たいクラスがいます。エラーメッセージ表示クラスとかデバッグクラスは、どう考えてもどこか特定の部署に属するようなものじゃないのでシングルトンでいいとしましょう。問題はイベントとセーブ&ロードクラスです。こいつらはあらゆる箇所から呼び出されるようなクラスではないものの、あらゆるデータに干渉する可能性があります。
いままでは、データの方をシングルトンクラスとして開放してました。これはこれで楽です。どうせ一人でプログラムしてるわけですから、自分の中で約束事を守ってさえいれば問題ありません。が、やっぱりお行儀が悪い。あらゆるデータがどこからでも干渉されるというのは、やっぱりちょっと流れを追うのに手間取ります。
そこで考えたのがこの形。
class Data{
private:
std::vector< Character* > characterlist;
};
class DataHolder{
protected:
static Data* p_data;
public:
static void SetData(Data*);
};
class Event : public DataHolder{
};
Dataクラスみたいなものはたくさんあります。これはキャラクターのリストを保管してますが、マップを保管してるだとか、日付や所持金などを保管してるクラスもあるでしょう。そういったデータクラスをDataHolderクラスに登録しておきます。
ただしDataHolderクラスにはpublicのSet関数はありますがGet関数はありません。よって、どこからでもSetはできるけどGetはできないわけです。これにより、Setされた各Dataクラスのポインタを利用できるのは、DataHolderクラスか、その継承クラスに限定されます。DataHolderクラスはインスタンスを作りませんので、実際は継承クラスしかDataクラスを利用しないわけです。
イベントやセーブ&ロードなど、どうしてもゲーム中に存在するあらゆるデータへのアクセス権限がほしい、しかしデータの方を一般開放するのはまずい、という問題は解決できたはず。イベントは無数に作りますが、DataHolderクラスの変数はみんなstaticだからいくら作ってもメモリ使わないしね。
で、私はDataHolderクラスはモノステートかと思ってたんですが、違うんですね。モノステートはインスタンスの生成を封じてあります。すると、このクラスはなんと呼ぶんでしょうか。特に名前がないのかもしれませんが。
これがOOP的視点から見てどうなのかは知りません。少なくとも、いままでよりはましだと思います。だからとりあえず、ちゃんと動いてくれてる間はこれでよしとします。
もしこれが当たり前の、どこにでもある一般的なやり方だったらすみません。あと、大きな問題を持っているとか、もっといいやり方があったら教えていただけると助かります。すぐにはやり方を変えられませんが、次の改良時期に助かると思います。
DXライブラリでのゲームプログラミングを始めるに際し、一番最初に躓くのはオブジェクトの選択判定じゃないかなと思います。たとえばタイトル画面のニューゲームボタンをクリックしたら新しくゲームが開始するという単純な仕組みすら、どうやればいいのか悩むはず。少なくとも、私は悩みました。
これがC#とかだったらクリックしたときのイベントに処理を書いてあげればすむ話ですが、C++だとそうはいきません。なので、初心者さんがゲームを作るときの助けになるかもしれませんので、私が使っている選択判定の仕組みを解説しておこうかと思います。
今回は、ただのcsvファイルからのデータロード方法を説明します。これは、別に他のサイトでもいくらでも見かけると思いますが、まぁ、初心者さん的にはこういう実例はいくらあっても困らないでしょう。
さて、今回はシーン遷移の実例です。これはかなり複雑な問題なので、あくまでも実例です。やり方が無数にあり、人によって扱いやすい方法が違うはずなので、各自自分なりのやり方を工夫するのがよいとは思います。
HEXタイプのSLGを作ろうとすれば、当然ある二つのHEXが何HEX離れているのかを知りたくなる事があります。ところが、これについてはっきりと解説してあるサイトが見当たらなかったのです。仕方がないのでうんうん唸りながらどうにかこうにか、計算式を発見しました。
ただし、いまのところエラーは出ていないものの、この計算式が正しい証明はありません。経験上うまくいっているだけというのをご了承ください。
Author:ウィア
とても地味でマニアックな同人ゲームを作っています