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

懒骨头(http://blog.csdn.net/iamlazybone  QQ124774397 青岛 )


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

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


首先看下vs中的文件


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

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

首先看下菜单界面:

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


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

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

    winSize = CCDirector::sharedDirector()->getWinSize();
    //添加背景 0 ;1;
    CCSprite* sl = CCSprite::create(s_loading);
	sl->setScaleX(winSize.width/sl->getContentSize().width);
	sl->setScaleY(winSize.height/sl->getContentSize().height);
	sl->setAnchorPoint(ccp(0, 0));
    this->addChild(sl,0,1);
然后添加时那个菜单按钮,这里使用CCSprite来初始化的CCMenuItemSprite。

    CCSprite* aboutNormal = CCSprite::create(s_menu, CCRectMake(252, 0, 126, 33));
    CCSprite* aboutSelected = CCSprite::create(s_menu, CCRectMake(252, 33, 126, 33));
    CCSprite* aboutDesabled = CCSprite::create(s_menu, CCRectMake(252, 33*2, 126, 33));
    CCMenuItemSprite* about = CCMenuItemSprite::create(aboutNormal, aboutSelected, aboutDesabled, 
		this, menu_selector(StartMenu::menuCallback));//StartMenu::menuCallback
	//“关于”按钮tag为21
    about->setTag(21);
把item添加到menu里之后,再添加到界面上。

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

menu->alignItemsVerticallyWithPadding(20);

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

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

//添加update回调函数  

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

//飞船在初始界面移动函数
void StartMenu::update(float dt)
{
    if (m_ship->getPosition().y > winSize.height) 
	{
        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 + winSize.height)));
        
    }
}
然后在update里,根据小飞机的y坐标,来添加动画,

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

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

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

//选择按钮时的音乐
void StartMenu::onButtonEffect()
{
    if (Config::sharedConfig()->getAudioState()) {
         SimpleAudioEngine::sharedEngine()->playEffect(s_buttonEffect);
    }
}
//选择开始游戏之后的效果
void StartMenu::flareEffect(CCObject* pSender)
{
    onButtonEffect();
	int n=0;
	CCLog("begin>>>StartMenu::flareEffect",n);
    Effect* flareEffect = Effect::create();
    CCCallFunc *callback =  CCCallFunc::create(this, callfunc_selector(StartMenu::newGame));
	CCLog("begin>>>StartMenu::flareEffect>>1",n);
    flareEffect->flareEffect(this, callback);
	CCLog("begin>>>StartMenu::flareEffect>>2",n);
}
在这个例子中,按钮事件是指定同一个回调函数,然后根据tag判断点击的是哪个menuItem的。

void StartMenu::menuCallback(CCObject* pSender)
{
    onButtonEffect();
    int tag = dynamic_cast<CCNode*>(pSender)->getTag();
    if (tag == 20) {
		//转到"Options"
        CCScene *scene = Options::scene();
        CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.2, scene));

    }

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

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

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



就是这种太阳光效果,在点击开始游戏之后,播放这个特效,并且加入回调。

 Effect* flareEffect = Effect::create();
    CCCallFunc *callback =  CCCallFunc::create(this, callfunc_selector(StartMenu::newGame));
	CCLog("begin>>>StartMenu::flareEffect>>1",n);
    flareEffect->flareEffect(this, callback);
以下是 flareEffect方法:

//执行完这个函数跳到StartMenu::newGame()开始游戏
void Effect::flareEffect(CCNode *parent, CCCallFunc *callback)
{
    int n=0;
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    // 特效图片
    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, winSize.height - 130));
    
    // 设置初始角度
    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 *removeFunc =  CCCallFuncN::create(flare, callfuncN_selector(Effect::killSprite));
    
    // 执行动画和回调函数               
    flare->runAction(CCSequence::create(opacityAnim, biggerEase, opacDim, removeFunc, callback,  NULL));
    flare->runAction(moveEase);
    flare->runAction(rotateEase);
    flare->runAction(bigger);
    CCLog("end>>>Effect::flareEffect()",n);
}

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


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



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

Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo-中

Cocos2dx游戏开发系列笔记12:一个横版拳击游戏Demo-上

Cocos2dx游戏开发系列笔记11:解刨《战神传说》完结篇

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+vs2012游戏开发环境搭建

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


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



//添加update回调函数 this->schedule(schedule_selector(StartMenu::update), 0.1)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值