第三天:侵略者来袭

出自Ogre3D开放资源地带

跳转到: 导航, 搜索

目录

前言

玩游戏是一件很快乐的事情,制作游戏带给别人快乐也是一件很快的的事情。不过因为游戏开发行业的封闭性,知识的多样性;让很多人感觉制造游戏云里雾里,不得其法。Orz社区的首要目的就是建立一个开放的开发游戏平台,屏蔽游戏开发中的繁文缛节,解开游戏开发的面纱。最后发现:帮助你得到制造游戏带给大家快乐的快乐也是一件很快乐的事情。(说这么多废话,因为实在想不出什么前言了)。好了不贫嘴了。开始我们壮阔的宇宙之旅吧。

正文

不错,我们已经有了太空,也有了我们的主角战斗机,已经做好迎战“侵略者”的准备。不过,侵略者在那呢?

打开新的一课程的代码,就在这里!

EnemyPlanes.h

//2敌人,统一管理
class EnemyPlanes
{
	//2boost提供的具有良好借口的数组对象
	typedef boost::array< Ogre::SceneNode *, 12> PlanesType;
public:
	EnemyPlanes(Ogre::SceneManager * sm);
	~EnemyPlanes(void);		
	void update(void);
private:	
	//2作为整个敌人的根节点
	Ogre::SceneNode * _all;
	//2敌人节点
	PlanesType _planes;
	//2用做时间记录
	float _time;
};


和以往一样的简单,除了构造函数,析构函数以及更新的方法之外,有一行需要我们注意一下:

typedef boost::array< Ogre::SceneNode *, 12> PlanesType;

又是来自boost的array库,你可以认为它是一个更安全的C语言的原始数组类型,不过他增加了一些标准模板库里面类似的方法,比如迭代器或者size之类。你也可以认为它是一个不能改变大小的std::vector。总之这是为了兼顾效率与安全的一个实现。第一个模板参数代表储存类型,另外一个表示数组大小。

EnemyPlanes.cpp

//2构造函数
EnemyPlanes::EnemyPlanes(Ogre::SceneManager * sm):
_all(),
_planes(),
_time(0.0f)
{
	//2创建根节点
	_all = sm->getRootSceneNode()->createChildSceneNode();
	//2遍历节点并初始化
	for(uint32 i = 0; i< _planes.size(); ++i)
	{
		//2创建节点
		_planes[i] = _all->createChildSceneNode();
		//2创建实体
		//(注Ogre中实体不能有相同的名称,所以我们通过i来作为名称的id)
		Ogre::Entity *ent
			 = sm->createEntity(
				std::string("head") + boost::lexical_cast<std::string>(i), 
				"ogrehead.mesh");
		//2放置节点到正确的位置
		_planes[i]->translate((i%4)* 200.0f - 300.0f, 150.0f *(i/4), 0.0f);
		//2缩放节点
		_planes[i]->scale(2.0f, 2.0f, 2.0f);
		//2挂接实体
		_planes[i]->attachObject(ent);		
	}
}

除了对boost::array之外,又是一大堆对Ogre3D的操作,老样子,到我们的网站ogre3d.cn或者论坛orz.ogre3d.cn去学习讨论吧:)。

另外除了空白的析构之外,还有一个update更新函数,系统会每0.015秒调用一次,我们在这里更新这些怪物的位置,让他们“飘来飘去”。具体细节就留给大家自己来看吧。

其他文件修改

我们仍然要修改我们的Director(导演)类,让其可以调度敌人。和上一课我们看到的一样。

TutorialDirector.h

boost::scoped_ptr<EnemyPlanes> _enemy;

不用解释了吧,回忆一下上一课的内容。

TutorialDirector.cpp

_enemy.reset(new EnemyPlanes(sm));
_enemy.reset(static_cast<EnemyPlanes*>(NULL));
_enemy->update();	

同样,如同上一课一样,我们在初始化,关闭,更新函数的实现中加入上面三行调用。具体的位置大家自己找吧。有什么疑问就看看上一课,或者到论坛来讨论,在这里我就不废话了。


课程结语

好了,编译运行,现在你看到了,天空飞着一些奇怪的头,偶应该说是Ogre的头。有些诡异,我们的飞机在巡航并与其对峙,太空大战一触即发。

好吧,在下一课,我们就——开火

个人工具