欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2d-x游戏开发(二)开始菜单续

发布时间:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 cocos2d-x游戏开发(二)开始菜单续 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

欢迎转载:http://blog.csdn.net/fylz1125/article/details/8492497


上一篇文章已经实现了MoonWarriors开始菜单的大部分元素,还差一个运动的飞船和一个点击newGame的特效和音效。

1.飞船

[cpp] view plaincopyprint?
  • // ships  
  •     CCTexture2D *textCache = CCTextureCache::sharedTextureCache()->addImage(s_ship01);  
  •     m_ship = CCSprite::createWithTexture(textCache, CCRectMake(0, 45, 60, 38));  
  •     this->addChild(m_ship, 0, 4);  
  •     CCPoint position = ccp(CCRANDOM_0_1() * winSize.width, 0);  
  •     m_ship->setPosition(position);  
  •     m_ship->runAction(CCMoveBy::create(2, ccp(CCRANDOM_0_1() * winSize.width, position.y + winSize.height + 100)));  
  • 这里的飞船就是一个sprite,后面我会建一个飞船的类,但这个只是一个Sprite。

    缓存飞船图片,create一个飞船,添加,设置位置,执行动作。

    在设置飞船位置的时候注意,每次飞船出来位置都是随机的。引擎封装了一个随机函数CCRANDON_0_1(),这个是随机一个0到1之间的float数。用一个MoveBy来实现飞船移动,同样移动的目标点也有一定的随机性。

    你以为这样就完了吗,那你就错了。所有的这些元素都在init()函数完成的,即使runAction了,也就只是执行一次。

    为了看到不断有飞船在屏幕上飞,需要加点料。这里用schedule()函数来不断更新。这个函数就是任务调度,每隔dt调用一次回调函数,这里就是每0.1秒执行update函数

    [cpp] view plaincopyprint?
  • this->schedule(schedule_selector(StartMenu::update), 0.1);  
  • 然后看update的实现 [cpp] view plaincopyprint?
  • if (m_ship->getPosition().y > 480) {  
  •         CCPoint pos = ccp(CCRANDOM_0_1() * winSize.width, 10);  
  •         m_ship->setPosition(pos);  
  •         m_ship->runAction(CCMoveBy::create(floor(5 * CCRANDOM_0_1()), ccp(CCRANDOM_0_1() * winSize.width, pos.y + 480)));  
  •           
  •     }  
  • 飞船飞出屏幕后就重新设置其位置再执行动作。

    2.音效

    这个很简单,直接用了声音引擎

    [cpp] view plaincopyprint?
  • SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.7);  
  • SimpleAudioEngine::sharedEngine()->playBackgroundMusic(s_mainMainMusic, true);  
  • 3.点击特效

    html5版的这个效果直接一个匿名函数搞定了,我不知道2dx怎么用一个回调搞定,就做了个特效类,专门来搞这个,嘿嘿。

    记得前面有个flareEffec函数,就是在这里处理的。

    [cpp] view plaincopyprint?
  • void StartMenu::flareEffect(CCNode *node)  
  • {  
  •     onButtonEffect();  
  •     Effect* flareEffect = Effect::create();  
  •     CCCallFunc *callback =  CCCallFunc::create(this, callfunc_selector(StartMenu::newGame));  
  •     flareEffect->flareEffect(this, callback);  
  • }  
  • onButtonEffect是声音特效,Effect就是用来做动画特效的,关键就是其flareEffect函数。

    [cpp] view plaincopyprint?
  • void Effect::flareEffect(CCNode *parent, CCCallFunc *callback)  
  • {  
  •     // 特效图片  
  •     CCSprite *flare = CCSprite::create(s_flare);  
  •       
  •     // 设置混合模式  
  •     ccBlendFunc cbl = {GL_SRC_ALPHA, GL_ONE};  
  •     flare->setBlendFunc(cbl);  
  •       
  •     // 添加到父节点  
  •     parent->addChild(flare, 10);  
  •       
  •     // 设置初始透明度  
  •     flare->setOpacity(0);  
  •       
  •     // 设置初始位置  
  •     flare->setPosition(ccp(-30, 297));  
  •       
  •     // 设置初始角度  
  •     flare->setRotation(-120);  
  •       
  •     // 设置初始放大系数  
  •     flare->setScale(0.2);  
  •       
  •     // 透明度渐变  
  •     CCActionInterval *opacityAnim = CCFadeTo::create(0.5, 255);  
  •     CCActionInterval *opacDim = CCFadeTo::create(1, 0);  
  •       
  •     // 大小渐变  
  •     CCActionInterval *bigAnim = CCScaleBy::create(0.7, 1.2, 1.2);  
  •       
  •     // 渐变速率,正玄变化,由快到慢  
  •     CCEaseSineOut *biggerEase = CCEaseSineOut::create(bigAnim);  
  •     CCActionInterval *moveAnim = CCMoveBy::create(0.5, ccp(328, 0));  
  •     CCEaseSineOut *moveEase = CCEaseSineOut::create(moveAnim);  
  •       
  •     // 角度旋转  
  •     CCActionInterval *roteAnim = CCRotateBy::create(2.5, 90);  
  •       
  •     // 角度旋转速度,指数变化  
  •     CCEaseExponentialOut * rotateEase = CCEaseExponentialOut::create(roteAnim);  
  •       
  •     // 放大到原大小  
  •     CCScaleTo *bigger = CCScaleTo::create(0.5, 1);  
  •       
  •     // 动画完成后回调函数  
  •     CCCallFuncN *onComplete =  CCCallFuncN::create(flare, callfuncN_selector(Effect::killFlare));  
  •       
  •     // 执行动画和回调函数  
  •     flare->runAction(CCSequence::create(opacityAnim, biggerEase, opacDim, onComplete, callback,  NULL));  
  •     flare->runAction(moveEase);  
  •     flare->runAction(rotateEase);  
  •     flare->runAction(bigger);  
  •   
  • }  

  • 这个还是按照js的逻辑写的。传了一个parent的node和一个回调函数进来,然后一系列动作,最后执行动作和回调。

    回调函数里有个killFlare函数,其实就是用来干掉这个特效精灵的,因为如果不干掉,会一直添加。
    到这里,这个菜单的基本功能就做完了,还差一些回调,状态控制等没有加,后续再来弄。

    总结

    以上是生活随笔为你收集整理的cocos2d-x游戏开发(二)开始菜单续的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。