【雷電】源代碼分析(一)-- 進入遊戲開始界面
阿新 • • 發佈:2017-07-30
模式 show 源代碼下載 popu 按鍵事件 file fcm md5 顯示
設置界面效果:
轉載請註明出處:http://blog.csdn.net/oyangyufu/article/details/24941949
源代碼下載:http://download.csdn.net/detail/oyangyufu/7289283
進入遊戲開始界面效果圖:
源代碼分析:
StartMenu場景--進入遊戲開始界面 初始化場景,包含初始Android按鍵,加入背景圖片。加入logo圖片。創建遊戲菜單開始/設置/關於並加入其響應事件。 初始化飛船漂移動畫,背景音樂 程序分析: bool StartMenu::init() { if ( !CCLayer::init() ) { return false; } // 加入Android的按鍵處理,這裏加了全局代理 this->setKeypadEnabled(true); CostomeKeyPadDelegae *keyDelegate = new CostomeKeyPadDelegae(); keyDelegate->autorelease(); CCDirector::sharedDirector()->getKeypadDispatcher()->addDelegate(keyDelegate); winSize = CCDirector::sharedDirector()->getWinSize(); //加入背景圖片 CCSprite* sl = CCSprite::create(s_loading); sl->setAnchorPoint(ccp(0, 0)); this->addChild(sl,0,1); //加入logo圖片 CCSprite* logo = CCSprite::create(s_logo); logo->setAnchorPoint(ccp(0.5, 1)); logo->setPosition(ccp(winSize.width/2, winSize.height-50)); this->addChild(logo, 10, 1); //創建遊戲菜單開始/設置/關於並加入其響應事件 CCSprite* newGameNormal = CCSprite::create(s_menu, CCRectMake(0, 0, 126, 33)); CCSprite* newGameSelected = CCSprite::create(s_menu, CCRectMake(0, 33, 126, 33)); CCSprite* newGameDisabled = CCSprite::create(s_menu, CCRectMake(0, 33*2, 126, 33)); CCSprite* gameSettingNormal = CCSprite::create(s_menu, CCRectMake(126, 0, 126, 33)); CCSprite* gameSettingNSelected = CCSprite::create(s_menu, CCRectMake(126, 33, 126, 33)); CCSprite* gameSettingDesabled = CCSprite::create(s_menu, CCRectMake(126, 33*2, 126, 33)); 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* newGame = CCMenuItemSprite::create(newGameNormal, newGameSelected, newGameDisabled, this, menu_selector(StartMenu::flareEffect)); CCMenuItemSprite* gameSetting = CCMenuItemSprite::create(gameSettingNormal, gameSettingNSelected, gameSettingDesabled, this, menu_selector(StartMenu::menuCallback)); gameSetting->setTag(20); CCMenuItemSprite* about = CCMenuItemSprite::create(aboutNormal, aboutSelected, aboutDesabled, this, menu_selector(StartMenu::menuCallback)); about->setTag(21); // 最後一個參數要是NULL CCMenu* menu = CCMenu::create(newGame, gameSetting, about, NULL); menu->alignItemsVerticallyWithPadding(20);//垂直間隔排列 this->addChild(menu, 1, 2); menu->setPosition(ccp(winSize.width / 2, winSize.height / 2 - 80)); this->schedule(schedule_selector(StartMenu::update), 0.1);//加入定時器,0.1‘一次 // 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))); //背景音樂 if (Config::sharedConfig()->getAudioState()) { SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.7); SimpleAudioEngine::sharedEngine()->playBackgroundMusic(s_mainMainMusic, true); } return true; } 遊戲菜單開始鍵響應事件,先顯示光暈效果然後切換GameLayer遊戲場景 //光暈效果 void StartMenu::flareEffect(CCObject *pObject) { onButtonEffect(); Effect* flareEffect = Effect::create(); CCCallFunc *callback = CCCallFunc::create(this, callfunc_selector(StartMenu::newGame)); flareEffect->flareEffect(this, callback); } //切換GameLayer場景 void StartMenu::newGame() { CCScene *scene = CCScene::create(); scene->addChild(GameLayer::create()); CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.2, scene)); } 遊戲菜單設置、關於鍵響應事件,依據獲取tag值,切換對應場景 void StartMenu::menuCallback(CCObject* pSender) { onButtonEffect(); int tag = dynamic_cast<CCNode*>(pSender)->getTag();//獲取tag if (tag == 20) {//設置事件 CCScene *scene = Options::scene(); CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.2, scene)); } else if(tag == 21) //聲音事件 { CCScene *scene = About::scene(); CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.2, scene)); } } 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))); } }
設置界面效果:
源代碼分析:
Options設置場景初始化背景圖片、背景音樂、設置菜單 bool Options::init() { if (!CCLayer::init()) { return false; } CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCSprite *sp = CCSprite::create(s_loading);//背景圖片 sp->setAnchorPoint(CCPointZero); addChild(sp, 0, 1); //依據紋理創建OPTION CCTexture2D *imageCache = CCTextureCache::sharedTextureCache()->addImage(s_menuTitle); CCSprite *title = CCSprite::createWithTexture(imageCache, CCRectMake(0, 0, 134, 34)); title->setPosition(ccp(winSize.width/2, winSize.height - 60)); addChild(title); //創建設置開關、上一步菜單button,並註冊響應事件 CCMenuItemFont *menuTitle = CCMenuItemFont::create("Sound"); menuTitle->setFontName("Arial"); menuTitle->setFontSize(18); menuTitle->setEnabled(false); CCMenuItemFont::setFontName("Arial"); CCMenuItemFont::setFontSize(26); CCMenuItemToggle *toggle = CCMenuItemToggle::createWithTarget(this, menu_selector(Options::setOptions), CCMenuItemFont::create("On"),CCMenuItemFont::create("Off"), NULL);//創建點擊之後on/off狀態切換 //設置音頻狀態,默覺得On int selectId = Config::sharedConfig()->getAudioState()? 0 : 1; toggle->setSelectedIndex(selectId); //創建Go Back按鍵並註冊事件 CCLabelBMFont *backLb = CCLabelBMFont::create("Go Back", s_font);//渲染字體 CCMenuItemLabel *goBack = CCMenuItemLabel::create(backLb, this, menu_selector(Options::goBack));//按鍵事件 goBack->setScale(0.6); //字體動畫。弱隱弱現 CCActionInterval *fadeIn = CCFadeTo::create(1, 80); CCActionInterval *fadeOut = CCFadeTo::create(1, 255); CCEaseSineInOut *ease1 = CCEaseSineInOut::create(fadeIn); CCEaseSineInOut *ease2 = CCEaseSineInOut::create(fadeOut); CCFiniteTimeAction *seq = CCSequence::create(ease1, ease2, NULL); goBack->runAction(CCRepeatForever::create((CCActionInterval*)seq)); CCMenu *menu = CCMenu::create( menuTitle, toggle, goBack, NULL); menu->alignItemsInColumns(2,1);//菜單布局 addChild(menu); CCPoint pos = goBack->getPosition(); pos.y -= 50; goBack->setPosition(pos); return true; } 音頻設置開/關 void Options::setOptions(CCObject *pObject) { bool tmpSound = Config::sharedConfig()->getAudioState(); Config::sharedConfig()->updateAudioState(!tmpSound); if (Config::sharedConfig()->getAudioState()) { SimpleAudioEngine::sharedEngine()->resumeAllEffects(); SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); }else{ SimpleAudioEngine::sharedEngine()->pauseAllEffects(); SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); } } 上一步 void Options::goBack(cocos2d::CCObject *pSender) { CCScene *scene = StartMenu::scene(); CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.2, scene)); }
關於界面效果:
程序分析:
About場景創建背景圖片、關於文本、上一步button bool About::init() { if (!CCLayer::init()) { return false; } CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCSprite *sp = CCSprite::create(s_loading);//創建背景圖片 sp->setAnchorPoint(ccp(0, 0)); addChild(sp, 0, 1); //依據紋理創建About CCTexture2D *imageCache = CCTextureCache::sharedTextureCache()->addImage(s_menuTitle); CCSprite *title = CCSprite::createWithTexture(imageCache, CCRectMake(0, 36, 100, 34)); title->setPosition(ccp(winSize.width/2, winSize.height - 60)); addChild(title); //創建關於文本。向左對齊 CCLabelTTF *about = CCLabelTTF::create(" I recode this game according to the logic of MoonWarriors-html5,almost all of the code keep unanimous with the original. \n This showcase utilizes many features from Cocos2d-x engine, including: Parallax background, tilemap, actions, ease, frame animation, schedule, Labels, keyboard Dispatcher, Scene Transition", "Arial", 18, CCSizeMake(winSize.width * 0.85, 320), kCCTextAlignmentLeft); about->setPosition(ccp(winSize.width / 2, winSize.height / 2 - 20)); about->setAnchorPoint(ccp(0.5, 0.5)); addChild(about); //創建Go Back按鍵並註冊事件 CCLabelBMFont *backLb = CCLabelBMFont::create("Go Back", s_font); CCMenuItemLabel *goBack = CCMenuItemLabel::create(backLb, this, menu_selector(About::goBack)); goBack->setScale(0.6); //字體動畫,弱隱弱現 CCActionInterval *fadeIn = CCFadeTo::create(1, 80); CCActionInterval *fadeOut = CCFadeTo::create(1, 255); CCEaseSineInOut *ease1 = CCEaseSineInOut::create(fadeIn); CCEaseSineInOut *ease2 = CCEaseSineInOut::create(fadeOut); CCFiniteTimeAction *seq = CCSequence::create(ease1, ease2, NULL); goBack->runAction(CCRepeatForever::create((CCActionInterval*)seq)); CCMenu *menu = CCMenu::create(goBack, NULL); menu->setPosition(winSize.width / 2, 50); addChild(menu); return true; } 上一步 void About::goBack(CCObject *pObject) { CCScene *scene = StartMenu::scene(); CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.2, scene)); }
光暈效果圖:
程序分析:
創建光暈動畫 void Effect::flareEffect(CCNode *parent, CCCallFunc *callback) { 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)); // 運行動畫和回調函數切換GameLayer場景 flare->runAction(CCSequence::create(opacityAnim, biggerEase, opacDim, removeFunc, callback, NULL)); flare->runAction(moveEase); flare->runAction(rotateEase); flare->runAction(bigger); } void Effect::killSprite(CCNode *pSender) { pSender->removeFromParent(); }
【雷電】源代碼分析(一)-- 進入遊戲開始界面