RTS製作日記。その13

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

RTS製作日記。その13

投稿記事 by MNS » 14年前

*他のプレイヤーの実装

他のプレイヤーを作ります。それはユニットに区別をつけるということになりますが、
どうやってそれを管理するのかが中々悩みどころなのです。
まあ、とりあえず作らないことには始まらないので、適当に…。

まず、Unitに自分が所属するグループを識別する変数を加えます。

CODE:

class	Unit :public GameEntity, public StateMachine
{
	…略…

	//自分が属するプレイヤー
	int				m_Group;

	…略…
};
まあ、こんなものはどうでもよくて、
UnitManagerのほうも改造を行います。

CODE:

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

	//所属グループで組み分けたもの(あくまでコピーという位置づけ)
	std::map >
		m_UnitClassifiedWithGroup;
	
	…省略…
};
やはり、ユニットの実体はひとつのところで一律に管理したほうが良いでしょう。
ということで、管理する機構をもうひとつつくって、
こちらはIDではなく、m_Groupをキーにします。
そうすることによって、自分がもつユニット、敵がもつユニットの情報を、
(まあまあ?)速く、かつ簡単に得ることができます。

もちろん、プレイヤーが自分のユニットの情報を持っておくにこしたことはないので、
それもPlayerクラスに実装します。

CODE:

class	Player
{
protected:

	//自分が所有するユニット
	std::map	m_MyUnits;

	//Worldへのポインタ
	World*	m_pWorld;

	//このプレイヤーに割り当てられたID
	int		m_ID;

public:

	Player(World* world)
		: m_pWorld(world)
	{
		static	int stID = 0;
		m_ID = stID++;
	}

	virtual ~Player(){}
	
	virtual	void	Update() = 0;
	virtual	void	Render() = 0;


	void	AddMyUnit(Unit* unit);

};
プレイヤー数は決まっているとは限らないので、
プレイヤークラスにもIDをもたせます。

さて、次に敵プレイヤーとなるAIPlayerを実装します。
といっても、まだ敵AIを作る気はサラサラないので、
枠組みだけです。

CODE:

class	AIPlayer :public Player
{

public:

	AIPlayer(World* world);
	~AIPlayer(){}

	void	Update();
	void	Render();
};
つぎに、Worldクラスを若干変更します。
といっても、Playerをstd::listに組み込むだけです。

CODE:

class	World
{

	std::list		m_Players;

	…略…
};

CODE:

World::World()
{
	m_Graph = new Graph();
	m_Players.push_back(new MyPlayer(this));
	m_Players.push_back(new AIPlayer(this));

	…略…
};
これで、一応の敵を作ることができました。
次に、その敵への攻撃を作る・・といきたいところですが、
まだゲームのコンセプトがよくきまっていないので、
(つまり、攻撃方法などが決まっていないので、
 それに適した構造がつくることができない)
先に陣形などの機能を作ろうかなと思ったり・・・。

ゲーム画面(画像)
sono4.png
sono4.png (30.51 KiB) 閲覧数: 78 回

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