Cocos2dx游戏开发系列笔记10:解刨《战神传说》

北城以北 提交于 2019-12-07 15:12:04

有点困了,从桌子换到床上,刚要开敲,豆瓣电台传来的传来奇怪的歌声“马的~马的~”

看看歌词,应该是“慢慢等”,好吧,继续


首先看下vs中的文件

整个项目就这些代码,这样来看逻辑结构比较清晰。

-----------------------------------------------------------------------------------------------------------

首先看下菜单界面:

-----------------------------------------------------------------------------------------------------------

这个游戏菜单界面有很多值得学习的地方

在init初始化里,先添加背景图,setScaleX方法可以让背景图根据手机屏幕来自适应。 

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.    winSize = CCDirector::sharedDirector()->getWinSize();  
  2.    //添加背景 0 ;1;  
  3.    CCSprite* sl = CCSprite::create(s_loading);  
  4. sl->setScaleX(winSize.width/sl->getContentSize().width);  
  5. sl->setScaleY(winSize.height/sl->getContentSize().height);  
  6. sl->setAnchorPoint(ccp(0, 0));  
  7.    this->addChild(sl,0,1);  
然后添加时那个菜单按钮,这里使用CCSprite来初始化的CCMenuItemSprite。
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.   CCSprite* aboutNormal = CCSprite::create(s_menu, CCRectMake(252, 0, 126, 33));  
  2.   CCSprite* aboutSelected = CCSprite::create(s_menu, CCRectMake(252, 33, 126, 33));  
  3.   CCSprite* aboutDesabled = CCSprite::create(s_menu, CCRectMake(252, 33*2, 126, 33));  
  4.   CCMenuItemSprite* about = CCMenuItemSprite::create(aboutNormal, aboutSelected, aboutDesabled,   
  5. this, menu_selector(StartMenu::menuCallback));//StartMenu::menuCallback  
  6. /“关于”按钮tag为21  
  7.   about->setTag(21);  
把item添加到menu里之后,再添加到界面上。

下面语句作用是,让menu的所有按钮竖着排列,并且设置间距为20.

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. menu->alignItemsVerticallyWithPadding(20);  

菜单里有个飞机一直在抢镜头,是这样实现的:

首先添加一个update函数,调用频率是0.1秒。

//添加update回调函数  

this->schedule(schedule_selector(StartMenu::update), 0.1);

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //飞船在初始界面移动函数  
  2. void StartMenu::update(float dt)  
  3. {  
  4.     if (m_ship->getPosition().y > winSize.height)   
  5.     {  
  6.         CCPoint pos = ccp(CCRANDOM_0_1() * winSize.width, 10);  
  7.         m_ship->setPosition(pos);  
  8.         m_ship->runAction(CCMoveBy::create(floor(5 * CCRANDOM_0_1()), ccp(CCRANDOM_0_1() * winSize.width, pos.y + winSize.height)));  
  9.           
  10.     }  
  11. }  
然后在update里,根据小飞机的y坐标,来添加动画,

先把小飞机放在最底下,x坐标的位置是随机的。

然后以随机速度往上飞行。

按钮点击时还播放一个特效,而且点击开始游戏后,会有一个太阳光的特效划过屏幕,以一个demo的角度来看,这是非常炫的!

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //选择按钮时的音乐  
  2. void StartMenu::onButtonEffect()  
  3. {  
  4.     if (Config::sharedConfig()->getAudioState()) {  
  5.          SimpleAudioEngine::sharedEngine()->playEffect(s_buttonEffect);  
  6.     }  
  7. }  
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //选择开始游戏之后的效果  
  2. void StartMenu::flareEffect(CCObject* pSender)  
  3. {  
  4.     onButtonEffect();  
  5.     int n=0;  
  6.     CCLog("begin>>>StartMenu::flareEffect",n);  
  7.     Effect* flareEffect = Effect::create();  
  8.     CCCallFunc *callback =  CCCallFunc::create(this, callfunc_selector(StartMenu::newGame));  
  9.     CCLog("begin>>>StartMenu::flareEffect>>1",n);  
  10.     flareEffect->flareEffect(this, callback);  
  11.     CCLog("begin>>>StartMenu::flareEffect>>2",n);  
  12. }  
在这个例子中,按钮事件是指定同一个回调函数,然后根据tag判断点击的是哪个menuItem的。
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void StartMenu::menuCallback(CCObject* pSender)  
  2. {  
  3.     onButtonEffect();  
  4.     int tag = dynamic_cast<CCNode*>(pSender)->getTag();  
  5.     if (tag == 20) {  
  6.         //转到"Options"  
  7.         CCScene *scene = Options::scene();  
  8.         CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.2, scene));  
  9.   
  10.     }  

-----------------------------------------------------------------------------------------------------------

紧接着,看下Effect类里这个动画效果

-----------------------------------------------------------------------------------------------------------



就是这种太阳光效果,在点击开始游戏之后,播放这个特效,并且加入回调。
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Effect* flareEffect = Effect::create();  
  2.    CCCallFunc *callback =  CCCallFunc::create(this, callfunc_selector(StartMenu::newGame));  
  3. CCLog("begin>>>StartMenu::flareEffect>>1",n);  
  4.    flareEffect->flareEffect(this, callback);  
以下是 flareEffect方法:
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //执行完这个函数跳到StartMenu::newGame()开始游戏  
  2. void Effect::flareEffect(CCNode *parent, CCCallFunc *callback)  
  3. {  
  4.     int n=0;  
  5.     CCSize winSize = CCDirector::sharedDirector()->getWinSize();  
  6.     // 特效图片  
  7.     CCSprite *flare = CCSprite::create(s_flare);  
  8.       
  9.     // 设置混合模式  
  10.     ccBlendFunc cbl = {GL_SRC_ALPHA, GL_ONE};  
  11.     flare->setBlendFunc(cbl);  
  12.       
  13.     // 添加到父节点  
  14.     parent->addChild(flare, 10);  
  15.       
  16.     // 设置初始透明度  
  17.     flare->setOpacity(0);  
  18.       
  19.     // 设置初始位置  
  20.     flare->setPosition(ccp(-30, winSize.height - 130));  
  21.       
  22.     // 设置初始角度  
  23.     flare->setRotation(-120);  
  24.       
  25.     // 设置初始放大系数  
  26.     flare->setScale(0.2);  
  27.       
  28.     // 透明度渐变  
  29.     CCActionInterval *opacityAnim = CCFadeTo::create(0.5, 255);  
  30.     CCActionInterval *opacDim = CCFadeTo::create(1, 0);  
  31.       
  32.     // 大小渐变  
  33.     CCActionInterval *bigAnim = CCScaleBy::create(0.7, 1.2, 1.2);  
  34.       
  35.     // 渐变速度  
  36.     CCEaseSineOut *biggerEase = CCEaseSineOut::create(bigAnim);  
  37.     CCActionInterval *moveAnim = CCMoveBy::create(0.5, ccp(328, 0));  
  38.     CCEaseSineOut *moveEase = CCEaseSineOut::create(moveAnim);  
  39.       
  40.     // 角度旋转  
  41.     CCActionInterval *roteAnim = CCRotateBy::create(2.5, 90);  
  42.       
  43.     // 角度旋转速度,指数变化  
  44.     CCEaseExponentialOut * rotateEase = CCEaseExponentialOut::create(roteAnim);  
  45.       
  46.     // 放大到原大小  
  47.     CCScaleTo *bigger = CCScaleTo::create(0.5, 1);  
  48.       
  49.     // 动画完成后回调函数,干掉精灵  
  50.     CCCallFuncN *removeFunc =  CCCallFuncN::create(flare, callfuncN_selector(Effect::killSprite));  
  51.       
  52.     // 执行动画和回调函数                 
  53.     flare->runAction(CCSequence::create(opacityAnim, biggerEase, opacDim, removeFunc, callback,  NULL));  
  54.     flare->runAction(moveEase);  
  55.     flare->runAction(rotateEase);  
  56.     flare->runAction(bigger);  
  57.     CCLog("end>>>Effect::flareEffect()",n);  
  58. }  

资源就这几个,其实分解起来也很简单,就是旋转、缩放、渐隐、位置等。


好了休息会,过会去爸妈家吃饭:)




------------------- 飞船起飞--------------------  

Cocos2dx游戏开发系列笔记10:解刨《战神传说》

Cocos2dx游戏开发系列笔记9:android手机上运行《战神传说》,并解决横竖屏即分辨率自适应

Cocos2dx游戏开发系列笔记8:开搞一个射击游戏《战神传说》//就个打飞机的

Cocos2dx游戏开发系列笔记7:一个简单的跑酷游戏《萝莉快跑》的消化(附下载)

Cocos2dx游戏开发系列笔记6:怎样让《萝莉快跑》的例子运行在vs和手机上

Cocos2dx游戏开发系列笔记5:继续润色《忍者飞镖射幽灵》

Cocos2dx游戏开发系列笔记4:怎样新加一个Scene类?

Cocos2dx游戏开发系列笔记3:牛刀小试->忍者飞镖射幽灵的Demo

Cocos2dx游戏开发系列笔记2:一个刚创建的cocos2dx中的demo里都有什么

Cocos2dx游戏开发系列笔记1:一个崭新的开始,cocos2dx2.2+ndkr9+Cygwin

-------------------- 飞船降落-------------------- 


最后,骨头介绍一下陪在身边的哲哲(右边就是低调的哲哲)

哲哲,小名 YIYI ,手工爱好者,文艺范,手艺人,《YiYiの妙舍》创始人,很有自己想法。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!