对于基本的捕鱼游戏设计思路(五)——鱼
2016-09-28 19:17
971 查看
今天讲捕鱼游戏里鱼的部分,也是比较关键的一部分。
一步一步来,先分析游戏,首先鱼是从屏幕外生成,然后它有个移动的动作,而且分为不同的类型。
然后就可以进入代码部分,首先设置一个计时器,控制时间生成鱼,而鱼分种类,所以就用到随机函数,随机输出一个值,传入switch语句,从而生成不同的鱼。
<span style="font-size:18px;">void GameScene::xiaoyuupdate(float dt){
Size visibleSize = Director::getInstance()->getVisibleSize();
int s = rand() % 7; //随机的s用于传入switch语句
auto move = MoveTo::create(8, Vec2(visibleSize.width + 650, rand() % 768)); //下面做两个移动的动作move1和move
auto move1 = MoveTo::create(15, Vec2(-650, rand() % 768));
switch (s){
case 0:
xiaoyu = Sprite::createWithSpriteFrameName("wugui1.png");
xiaoyu->setPosition(Vec2(-xiaoyu->getContentSize().width / 2, rand() % 768));
playanim(0);
xiaoyu->runAction(move);
p = 2;
break;
case 1:
xiaoyu = Sprite::createWithSpriteFrameName("huangyu1.png");
xiaoyu->setPosition(Vec2(-xiaoyu->getContentSize().width / 2, rand() % 768));
playanim(1);
xiaoyu->runAction(move);
p = 1;
break;
case 2:
xiaoyu = Sprite::createWithSpriteFrameName("dly01.png");
xiaoyu->setPosition(Vec2(visibleSize.width + xiaoyu->getContentSize().width / 2, rand() % 768));
playanim(2);
xiaoyu->runAction(move1);
p = 2;
break;
case 3:
xiaoyu = Sprite::createWithSpriteFrameName("dm01.png");
xiaoyu->setPosition(Vec2(visibleSize.width + xiaoyu->getContentSize().width / 2, rand() % 768));
playanim(3);
p = 2;
xiaoyu->runAction(move1);
break;
default:
break;
}
addChild(xiaoyu);
}</span>
四只不同的鱼类就可以添加到场景了,然后就是鱼的动作,上面只是有个移动,如果没有动画的鱼就会看起来很尴尬,所以上面看不懂的playanim就是定义的一个动画函数,传入一个int型常量,就是鱼的动画播放动画,看过前一章的就知道也是利用序列帧动画完成的鱼的动作。
<span style="font-size:18px;">void GameScene::playanim(int x){
Size visibleSize = Director::getInstance()->getVisibleSize();
if (x == 0){
Animation* animation1 = Animation::create();
animation1->setDelayPerUnit(0.4f);
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui1.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui3.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui1.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui3.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui1.png"));
Animate* animate1 = Animate::create(animation1);
xiaoyu->runAction(RepeatForever::create(animate1));
}
else if (x == 1){
Animation* animation2 = Animation::create();
animation2->setDelayPerUnit(0.1f);
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu1.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu3.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu1.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu3.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu1.png"));
Animate* animate2 = Animate::create(animation2);
xiaoyu->runAction(RepeatForever::create(animate2));
}
else if (x == 2){
Animation* animation3 = Animation::create();
animation3->setDelayPerUnit(0.1f);
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly01.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly02.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly03.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly04.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly05.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly06.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly07.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly08.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly09.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly10.png"));
Animate* animate3 = Animate::create(animation3);
xiaoyu->runAction(RepeatForever::create(animate3));
}
else if (x == 3){
Animation* animation5 = Animation::create();
animation5->setDelayPerUnit(0.1f);
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm01.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm02.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm03.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm04.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm05.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm06.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm07.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm08.png"));
Animate* animate5 = Animate::create(animation5);
xiaoyu->runAction(RepeatForever::create(animate5));
}
fishVec.pushBack(xiaoyu); //将鱼放进数组
}</span>那我就不讲序列帧动画了,可以去看前面的博客,最后放进数组也是用于优化游戏。
其实这里也做的不是很好,只是一个简单的demo,可以给鱼添加一些动作,让它活灵活现的在游戏里,也可以根据自己的爱好或者需要添加东西,嗯,今天就这样吧。后面还会继续更新。
一步一步来,先分析游戏,首先鱼是从屏幕外生成,然后它有个移动的动作,而且分为不同的类型。
然后就可以进入代码部分,首先设置一个计时器,控制时间生成鱼,而鱼分种类,所以就用到随机函数,随机输出一个值,传入switch语句,从而生成不同的鱼。
<span style="font-size:18px;">void GameScene::xiaoyuupdate(float dt){
Size visibleSize = Director::getInstance()->getVisibleSize();
int s = rand() % 7; //随机的s用于传入switch语句
auto move = MoveTo::create(8, Vec2(visibleSize.width + 650, rand() % 768)); //下面做两个移动的动作move1和move
auto move1 = MoveTo::create(15, Vec2(-650, rand() % 768));
switch (s){
case 0:
xiaoyu = Sprite::createWithSpriteFrameName("wugui1.png");
xiaoyu->setPosition(Vec2(-xiaoyu->getContentSize().width / 2, rand() % 768));
playanim(0);
xiaoyu->runAction(move);
p = 2;
break;
case 1:
xiaoyu = Sprite::createWithSpriteFrameName("huangyu1.png");
xiaoyu->setPosition(Vec2(-xiaoyu->getContentSize().width / 2, rand() % 768));
playanim(1);
xiaoyu->runAction(move);
p = 1;
break;
case 2:
xiaoyu = Sprite::createWithSpriteFrameName("dly01.png");
xiaoyu->setPosition(Vec2(visibleSize.width + xiaoyu->getContentSize().width / 2, rand() % 768));
playanim(2);
xiaoyu->runAction(move1);
p = 2;
break;
case 3:
xiaoyu = Sprite::createWithSpriteFrameName("dm01.png");
xiaoyu->setPosition(Vec2(visibleSize.width + xiaoyu->getContentSize().width / 2, rand() % 768));
playanim(3);
p = 2;
xiaoyu->runAction(move1);
break;
default:
break;
}
addChild(xiaoyu);
}</span>
四只不同的鱼类就可以添加到场景了,然后就是鱼的动作,上面只是有个移动,如果没有动画的鱼就会看起来很尴尬,所以上面看不懂的playanim就是定义的一个动画函数,传入一个int型常量,就是鱼的动画播放动画,看过前一章的就知道也是利用序列帧动画完成的鱼的动作。
<span style="font-size:18px;">void GameScene::playanim(int x){
Size visibleSize = Director::getInstance()->getVisibleSize();
if (x == 0){
Animation* animation1 = Animation::create();
animation1->setDelayPerUnit(0.4f);
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui1.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui3.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui1.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui3.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui2.png"));
animation1->addSpriteFrame(frameCache->getSpriteFrameByName("wugui1.png"));
Animate* animate1 = Animate::create(animation1);
xiaoyu->runAction(RepeatForever::create(animate1));
}
else if (x == 1){
Animation* animation2 = Animation::create();
animation2->setDelayPerUnit(0.1f);
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu1.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu3.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu1.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu3.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu2.png"));
animation2->addSpriteFrame(frameCache->getSpriteFrameByName("huangyu1.png"));
Animate* animate2 = Animate::create(animation2);
xiaoyu->runAction(RepeatForever::create(animate2));
}
else if (x == 2){
Animation* animation3 = Animation::create();
animation3->setDelayPerUnit(0.1f);
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly01.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly02.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly03.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly04.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly05.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly06.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly07.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly08.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly09.png"));
animation3->addSpriteFrame(frameCache1->getSpriteFrameByName("dly10.png"));
Animate* animate3 = Animate::create(animation3);
xiaoyu->runAction(RepeatForever::create(animate3));
}
else if (x == 3){
Animation* animation5 = Animation::create();
animation5->setDelayPerUnit(0.1f);
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm01.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm02.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm03.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm04.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm05.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm06.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm07.png"));
animation5->addSpriteFrame(frameCache1->getSpriteFrameByName("dm08.png"));
Animate* animate5 = Animate::create(animation5);
xiaoyu->runAction(RepeatForever::create(animate5));
}
fishVec.pushBack(xiaoyu); //将鱼放进数组
}</span>那我就不讲序列帧动画了,可以去看前面的博客,最后放进数组也是用于优化游戏。
其实这里也做的不是很好,只是一个简单的demo,可以给鱼添加一些动作,让它活灵活现的在游戏里,也可以根据自己的爱好或者需要添加东西,嗯,今天就这样吧。后面还会继续更新。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解