第三天:侵略者来袭
出自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的头。有些诡异,我们的飞机在巡航并与其对峙,太空大战一触即发。
好吧,在下一课,我们就——开火!
