【雷电】源代码分析(一)-- 进入游戏開始界面

转载请注明出处: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();
}
时间: 2024-08-10 15:11:35

【雷电】源代码分析(一)-- 进入游戏開始界面的相关文章

cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第一步---開始界面&amp;amp;关卡选择

/* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦.他说:随便写,第一别全然照搬代码:第二能够说明是学习笔记---好人 **3.这里用cocos2d-x 3.0版本号重写,非常多地方不同.可是从重写过程中也非常好的学习了cocos2d-x */ ***每一步相应的全部代码以及用到的资源都会打包在最后给出 ***为避免代码过多.每一步的代码都做了标记--一看就晓得是第几步实现的避免出错改不回去(难不成还用

【雷电】源代码分析(二)-- 进入游戏攻击

效果图: 程序分析: 初始化GameLayer场景触摸.背景.音乐.UI及定时间器 bool GameLayer::init() { if (!CCLayer::init()) { return false; } // 开启触摸 this->setTouchEnabled(true); // 创建数组,须要retain一下 play_bullet = CCArray::create(); play_bullet->retain(); enemy_bullet = CCArray::create

cocos2d-x 旅程開始--(实现瓦片地图中的碰撞检測)

转眼隔了一天了,昨天搞了整整一下午加一晚上,楞是没搞定小坦克跟砖头的碰撞检測,带着个问题睡觉甚是难受啊!还好今天弄成功了.只是感觉程序不怎么稳定啊.并且发现自己写的东西让我重写一遍的话我肯定写不出来.还要继续学习啊! 上次的进度: 实现了坦克的移动,昨天把程序优化了一下,能整合在一起的就整合在一个函数里了.并且对碰到屏幕边缘的情况进行了检測.之前的代码都是部分代码,今天试试把代码整个贴上去. 这两天的进度: 打这么多汉字,自个都看不进去.直接上代码: /////////////////////实

【Cocos游戏实战】功夫小子第三课之过渡场景和開始菜单的实现

本节课的视频教程地址是:第三课在此 假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊成为极客学院的会员,验证手机号码和邮箱号码会赠送三天的会员时间,手机端首次也能够领取五天的会员时间哦(即使是购买年会员眼下也不过年费260),成为极客学院学习会员能够无限制的下载和观看全部的学院站点的视频,谢谢您的支持! 经过前面两节课的学习.我们已经知道我们要做的是一个什么样的游戏项目.而且对游戏的基本特点和当中的重难点有了一个主要的认识,而且完毕了项目环境的基本搭建.以及项目基础类等工作. 从这节

cocos2dx游戏开发学习笔记2-从helloworld開始

一.新建project 具体安装和新建project的方法在cocos2dx文件夹下的README.md文件里已经有具体说明,这里仅仅做简介. 1.上官网下载cocos2dx-3.0的源代码.http://www.cocos2d-x.org/ 2.安装python2.7 3.执行setup.py安装 4.运行cocos new helloworld -p helloworld -l cpp,生成新project 二.新建project中包括的东西 -Classes AppDelegate.cpp

从零開始写游戏引擎(一) - project创建以及文件夹设置还有版本号控制

一句话提要 好的開始等于成功了一半. 创建文件夹结构 project文件夹下最好分为以下几个文件夹 Docs - 开发文档,设计文档 Assets - 角色,动作,模型和音效等 Source - 代码,project文件或者makefile也放在这里,假设有引用第三方的lib,在里面建立一个3rdParty的文件夹,放在里面. Temp - 用于防止编译生成的文件 Lib - 放置编译好的lib文件,将source编译成lib能够更好地保护源码. Game - 用于放置release buid,

竖屏小游戏--喵星战争源代码分析【完整】

 转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/26942311 源代码地址:http://download.csdn.net/detail/oyangyufu/7409593 Ccp文件介绍: GameMenuScene.cpp游戏主菜单 GameMainScene.cpp游戏主页面 GameObjHero.cpp主角 GameHeroBullet.cpp主角的子弹 GameObjEnemy.cpp敌人 GameEnemyBull

“别踩白块儿&quot;游戏源代码分析和下载(一)

本帖最后由 lch123go 于 2014-7-9 17:51 编辑 "别踩白块儿"是目前非常火的一款游戏,游戏非常简单刺激.关于具体怎么火法怎么玩我就不多说了,相信看到本文的朋友们都非常地清楚. 什么游戏火,我们都想知道自己能不能也弄一个玩玩,我也花了点时间弄了一个,游戏代码将会开源,利人利己,大家一起提高,希望各位多多支持. 下面介绍如何用OGEngine游戏引擎完成"别踩白块儿"游戏的经典模式. 源码下载地址 一.最终实现的部分效果截图 1.刚开始时,最下面有

&quot;别踩白块儿&quot;游戏源代码分析和下载(二)

四.游戏交互实现 1.前面已经介绍在 Block 类实现了每个block的触碰监听,block 实现触碰监听,当按下时,调起在GameScene中实现的touchBlock方法.下面来看改方法的实. /** * 点击到Block时进行的逻辑处理 * * @param pBlock *            所点击的block */ public void touchBlock(Block pBlock) { if (gameStatus == ConstantUtil.GAME_START) {