ページ 11

クラス管理について

Posted: 2009年3月07日(土) 20:12
by nayo
現在C++でDirectXを用いた見た目3Dの2D格闘ゲームを作っています
やっとDirectXの処理が出来たのでいざプレイヤーを作ろうと思ったところで少し困りました
簡単に書くと

Objクラス ← Playerクラス ← キャラクターA・キャラクターB・キャラクターC・……

とPlayerクラスを派生させて各キャラクターを作ろうと思ったのですが、
これらのキャラクターのクラスを管理するにはどうすればよいのでしょうか

例えばプレイヤーの選択に応じて
必要なキャラクターのクラスをインスタンス化し、ゲーム内で対戦に使う、ということです
同じ型のクラスなら宣言一つで終わりますが
複数のキャラクタークラスがある場合、全部のクラスのポインタを宣言しておかないといけないのでしょうか

何か上手い実装方法があったらご教授お願いします

Re:クラス管理について

Posted: 2009年3月07日(土) 20:49
by Justy

>複数のキャラクタークラスがある場合、全部のクラスのポインタを宣言しておかないといけないのでしょうか

 その方法だと 100種類いたら、100個の異なるポインタを宣言しなくてはならなく
なるので、まずNGでしょう。

 プレイヤークラスが十分に抽象化されているのであれば、
オーソドックスな1対1の場合、対戦するキャラクタークラス2つのインスタンスを
プレイヤークラス2つのポインタとして、保存しておけば事足りると思います。

Re:クラス管理について

Posted: 2009年3月07日(土) 22:16
by nayo
早速の回答ありがとうございます

しかし自分の力が付いていかず…
プレイヤークラスが十分に抽象化されていた場合、
キャラクタークラスのインスタンスをプレイヤークラスのポインタとして保存できるのでしょうか

それともプレイヤークラスから派生せず、プレイヤークラス内で処理を分けて同じ型として管理しておくのでしょうか

せっかくお答えしていただいたのに申し訳ないです

Re:クラス管理について

Posted: 2009年3月07日(土) 22:44
by Justy

>キャラクタークラスのインスタンスをプレイヤークラスのポインタとして保存できるのでしょうか

 出来ます。
[color=#d0d0ff" face="monospace]

class Object
{
public:
virtual ~Object() {}
};

class Player : public Object {};

class CharacterA : public Player {};
class CharacterB : public Player {};


Player *playerA = new CharacterA;
Player *playerB = new CharacterB;
Object *objA = playerA;
Object *objB = new CharacterB;

[/color]

 派生したクラスのインスタンスは基底クラスのポインタや参照で受けることができますよ。
 試してみてください。

6章:継承
http://www5c.biglobe.ne.jp/~ecb/cpp/06_07.html

Re:クラス管理について

Posted: 2009年3月07日(土) 23:02
by nayo
うをw まさかこんなテクニックがあったとは…
自分のやりたかったことがこれで実現できます

C++便利ですね
毎回素晴らしい回答ありがとうございます