RTS製作日記。その4

アバター
MNS
記事: 35
登録日時: 15年前

RTS製作日記。その4

投稿記事 by MNS » 14年前

一週1~2回のペースでやっていこうと思います。

*ユニットの選択を実装する
まず、プレイヤーの行動をクラスとして独立させます。
Worldクラスの肥大化を防ぐ役目もありますが、
将来、敵のプレイヤーを実装する上でも有用だと考えられるからです。

CODE:

class	Player
{

public:

	Player(){}
	virtual ~Player(){}

	virtual	void	Update() = 0;

};
シンプルですね。

自分となるプレイヤーを実装する前に、ユニットマネージャを改変します。
今の構造ではWorldクラスがその実体へのポインタをもつので、
Worldクラスを経由するか、ポインタを譲りうけないかしないと、
ユニットの実体へアクセスすることができませんが、
ゲームオブジェクトは様々な所から参照されることが多いので、
シングルトンパターンを適用することで、グローバルなクラスにします。

CODE:

class	Unit;

class	UnitManager
{
	//IDで管理する
	std::map	m_Units;

private:
	//シングルトン
	UnitManager(){}

public:
	~UnitManager(){}


	static UnitManager& Instance()
	{
		static UnitManager UM;
		return UM;
	}

	//コンストラクタとデストラクタの代わり
	void	Init();
	void	Del();


	void	Update();

	void	Render();

	
	
	//指定IDのユニットのアドレスを返す
	Unit*	GetUnit(int id);

	//ユニットリストを返す
	std::map*	GetUnitList(){ return &m_Units; }
};
これで、自由にユニットへアクセスできるようになりました。

次に、プレイヤーを実装します。

CODE:

class	Unit;

class	MyPlayer :public Player
{

	//マウスのポジション
	Vec2D	m_MousePos;

	//ドラッグ開始時の座標を記録
	Vec2D	m_FirstMousePos;

	//マウスの状態
	bool	m_bLeftClick;	//左クリック
	bool	m_bLeftDrag;	//左ドラッグ
	bool	m_bRightClick;	//右クリック
	

	//選択しているユニットのリスト
	std::list	m_SelectedUnitList;

public:

	MyPlayer();
	~MyPlayer(){}

	void	Update();
	void	Render();

};
定義のコードは長いので、スポイラーからご覧ください。
► スポイラーを表示
ドラッグ開始位置→ドラッグ終了位置で四角形を描き、
その範囲にいるユニットを選択ユニットのリストに追加します。


時間的な関係で、今回はここで終了です。
次回は、選択したユニットを動かす、ということをしたいと思いますが、
その実装にあたって、一種のメッセージング機能を追加したいと思っています。

現時点では、ユニットはマウスが押されているか判断をして、
それで自分のステートを変えていますが、
これはユニットの挙動として明らかに自律し過ぎています。
ユニットは自ら動く条件を探索するのではなく、
「動け」という命令が来たときに動くのが理想です。

ですから、この「動け」という命令を、
メッセージというオブジェクトに値として付与します。
ユニットのひとつひとつにはIDが振り分けられているので、
それで送信者・受信者を判別すれば管理しやすいはずです。

これを次回は実装できたらいいな、と思います。では。

コメントはまだありません。