【捕鱼达人】游戏实战开发之实体类的实现
大家好,我是Lampard!!!
今天迎来捕鱼达人系列的第三篇博客更新,希望大家多多支持。
今天要实现的是实体类(鱼,大炮)
(一)鱼类的实现
首先我们需要确定这些鱼要做些什么,首先肯定是需要它们会游泳,而游泳又分为两个部分:(1)是精灵本身位置方面需要移动(2)需要鱼本身播放自己游动的动作。这样才能看起来有一个动起来的效果。而后在游戏的时候,当我们的子弹射中鱼,被射中的鱼则要停止所有的动作,然后播放一个被捕捉的动画,然后回收这个精灵。
所以说我们要定义三个函数:分别是播放游泳动画,移动锚点位置,以及播放被捕捉的动画
(1)播放游泳动画
由于我们在之前已经建立好了动画创建器并把鱼类的plist文件加载进了帧缓存中。所以我们只需要调用我们的动画创建器找到相应的精灵帧就可以了。
CCRepeat* Fish::Swimming() {
String* theName = String::createWithFormat("fish0%d_",num); // 第几条鱼
Animate* action = ActionTool::animationWithFrameName(theName->getCString(), -1, 0.15);
CCRepeat* swimming = CCRepeat::create(action, 5); // 重复游泳的动作
return swimming;
}
因为播放完一个“游泳”的动画只用0.15秒,而鱼要游完整个界面需要大概0.8秒,所以我们就使用Repeat*重复鱼的动作5次。
(2)移动鱼的位置
移动精灵的位置我们只需要简单的使用MoveTo* 方法就可以了。值得一提的是,为了增加游动的随机性,所以我们的终点的Y坐标是可以随机的设置,因为我们y轴的高度是720,所以我们就可以直接rand()%720,但是为了不着挡住下层的大炮,所以就提高100像素,rand()%620+100.
MoveTo * Fish::Going() {
Vec2 point = Vec2(0, rand() % 620 + 100); // 设置目标位置
MoveTo * move = MoveTo::create(10, point); // 移动到目标位置
return move;
}
(3)播放被捕捉的动画
这个跟游泳的动画播放一样,只不过需要在播放被捕捉的动画之前,首先要停止自身的所有动作。
(不然被射中你还一直跑就不太好了对吧HHH)
CCRepeat* Fish::BeCatched() {
String* theName = String::createWithFormat("fish0%d_catch_",num);
Animate* action = ActionTool::animationWithFrameName(theName->getCString(), -1, 0.15);
CCRepeat* catching = CCRepeat::create(action, 1);
return catching;
}
OK,我们的鱼类的实现就到此为止了。
至于如何初始化init这条鱼,大家可以参详一下我提供的代码,比较简单就不复述了。
(2)大炮类的实现
同样的,我们需要想一想需要坦克实现什么功能。emmm想来想去好像都只是需要它播放“发射”动作而已,因为我们的子弹是独立创造的,并不关大炮的事情,所以我们的大炮就可怜的仅可以播放发射动作了。
CCRepeat* Shell::Shooting() {
String* theName = String::createWithFormat("net_%d", num);
Animate* action = ActionTool::animationWithFrameName(theName->getCString(), -1, 0.15);
CCRepeat* shooting = CCRepeat::create(action, 1);
return shooting;
}
最后说一下我是如何在游戏层安放大炮的,因为我们这款游戏的x轴大小是1280像素,所以我就把它六等份安放5门大炮,每一门大炮负责自己的区域,就只有最中间的大炮需要负责自己左右两边的区域。
所以最后大致就是长这样的:
OK,今天的博客就到这里,谢谢大家!!!