zoukankan      html  css  js  c++  java
  • 【梦幻连连连】源代码分析(二)

    转载请注明出处http://blog.csdn.net/oyangyufu/article/details/24736711

    源代码下载:http://download.csdn.net/detail/oyangyufu/7272177

    GameLayer场景界面效果:

     

    源代码分析:

     

    GameLayer场景初始化,主要是初始化载入界面及背景音乐
    bool GameLayer::init()
    {
     float dt=0.0f;
        
        if ( !CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)))
        {
            return false;
        }
        
        this->initLoadingUI();
        
        //循环播放三首背景音乐
        this->playSound1(dt);
            
        return true;
    }
    载入界面
    void GameLayer::initLoadingUI()
    {
    
        loadSprite=CCSprite::create("loading_logo-hd.png");
        
        loadSprite->setPosition(ccp(wSize.width/2, wSize.height/2));
    
        this->addChild(loadSprite, 0);
       
        this->loadingAnimation();  //载入时动作
    }
    load界面动画
    void GameLayer::loadingAnimation()
    {
        
        CCFadeOut *ac1=CCFadeOut::create(3.0f);
        
        CCSequence *seq=CCSequence::create(ac1,CCCallFunc::create(this, callfunc_selector(GameLayer::removeLoadSprite)),NULL); //载入完后消失
        
        loadSprite->runAction(seq);
    }
    删除load界面
    void GameLayer::removeLoadSprite()
    {
        loadSprite->removeFromParentAndCleanup(true);
        
        this->initData(); //初始本场景数据
        this->initUI();  //初始化本场景UI
    }
    初始关卡数据、等级数值
    void GameLayer::initData()
    {
     char st[10];
        
        //dialogLevelString=CCString::create(UTEXT("第一关"));
        dialogLevelString=CCString::create("第一关");
     ++_level_num;
     CCLOG("_level_num: %d", _level_num);
     sprintf(st, "%d", _level_num) ;
        _level=CCString::create(st);
    }
    本场景UI初始化。基本跟上一个场景几乎相同
    void GameLayer::initUI()
    {
        CCSprite *bgSprite=NULL;
        
        
        if (wSize.width==1136 && wSize.height==640)
        {
      
            bgSprite=CCSprite::create("background_568-hd.png");
        }
        else
        {       
            bgSprite=CCSprite::create("background-hd.png");   
        }
        
        bgSprite->setPosition(ccp(wSize.width/2, wSize.height/2));
        this->addChild(bgSprite, 0);
         
        //加入白云(1)
        CCSprite *cloudSprite=CCSprite::create("background_cloud_1-hd.png");
        cloudSprite->setAnchorPoint(ccp(0, 0));
        cloudSprite->setPosition(ccp(0, wSize.height-cloudSprite->getContentSize().height));
        this->addChild(cloudSprite, 1);
        
        
        //加入白云倒影
        CCSprite *daoyingloudSprite=CCSprite::create("background_cloud_1-hd.png");
        daoyingloudSprite->setAnchorPoint(ccp(0, 0));
        //垂直翻转
        daoyingloudSprite->setFlipY(true);
        daoyingloudSprite->setOpacity(40);
        daoyingloudSprite->setPosition(ccp(wSize.width-cloudSprite->getContentSize().width-40, wSize.height-cloudSprite->getContentSize().height-78*2));
        this->addChild(daoyingloudSprite, 1);
        
        //加入白云(2)
        CCSprite *cloud2Sprite=CCSprite::create("background_cloud_2-hd.png");
        cloud2Sprite->setAnchorPoint(ccp(0, 0));
        cloud2Sprite->setPosition(ccp(cloudSprite->getPosition().x+cloudSprite->getContentSize().width, wSize.height-cloud2Sprite->getContentSize().height));
        this->addChild(cloud2Sprite, 1);
        
        //加入岛
        CCSprite *landSprite=CCSprite::create("island-hd.png");
        landSprite->setAnchorPoint(ccp(0, 0));
        landSprite->setPosition(ccp(wSize.width-landSprite->getContentSize().width-20*2, wSize.height-landSprite->getContentSize().height-47*2));
        this->addChild(landSprite, 1);
        
        //加入岛倒影
        CCSprite *daoyinglandSprite=CCSprite::create("island-hd.png");
        daoyinglandSprite->setAnchorPoint(ccp(0, 0));
        daoyinglandSprite->setFlipY(true);
        daoyinglandSprite->setOpacity(40);
        daoyinglandSprite->setPosition(ccp(wSize.width-landSprite->getContentSize().width-20*2, wSize.height-landSprite->getContentSize().height-78*2));
        this->addChild(daoyinglandSprite, 1);
        this->initDialog(); //关卡对话框
        
        //加入杯子图标
        leisureSprite=CCSprite::create("game_leisure_logo-hd.png");
        leisureSprite->setPosition(ccp(leisureSprite->getContentSize().width/2+10*2, wSize.height+leisureSprite->getContentSize().height/2));
        
        this->addChild(leisureSprite, 1);
        
        //加入等级图标
        levelSprite=CCSprite::create("orange_font_level-hd.png");
        levelSprite->setPosition(ccp(leisureSprite->getContentSize().width/2+8*2, 255*2));
        
        this->addChild(levelSprite, 1);
        levelSprite->setVisible(false);
        
        
        //加入等级精灵
        levelnumsAtlas=CCLabelAtlas::create(_level->getCString(), "small_blue_number_level-hd.png",16, 20, '0');
        
        levelnumsAtlas->setScale(1.2f);
        levelnumsAtlas->setPosition(ccp(leisureSprite->getContentSize().width/2-6*2,levelSprite->getPosition().y-20*2));
        levelnumsAtlas->setVisible(false);
        
        this->addChild(levelnumsAtlas, 1);
        
        //加入暂停菜单
        pauseSprite=CCSprite::create("button_pause-hd.png");
        
        CCSprite *pauseSprite_s=CCSprite::create("button_pause-hd.png");
        
        CCMenuItemSprite *item=CCMenuItemSprite::create(pauseSprite, pauseSprite_s, this, menu_selector(GameLayer::pausePressed));//菜单2种状态转换
        
        pausemenu=CCMenu::create(item,NULL);
        
        item->setAnchorPoint(ccp(0.5, 0.5));
        pausemenu->setPosition(ccp(pauseSprite->getContentSize().width/2+10*2,-pauseSprite->getContentSize().height/2));
        
        this->addChild(pausemenu, 1);
        
        this->dialogAnimaton();
        
        
        //加入进度条背景
        progressbgSprite=CCSprite::create("time_slot-hd.png");
        
        progressbgSprite->setAnchorPoint(ccp(0, 0));
        progressbgSprite->setPosition(ccp(120, wSize.height-55));
        
        this->addChild(progressbgSprite, 1);
        
        progressbgSprite->setVisible(false);
        
        CCSprite *progressSprite=CCSprite::create("time_bars-hd.png");
        //加入进度条
        progress=CCProgressTimer::create(progressSprite);
        progress->setAnchorPoint(ccp(0, 0));
        progress->setType(kCCProgressTimerTypeBar);
        
        progress->setPosition(ccp(120, wSize.height-55));
        
        //加入效果
        progress->setMidpoint(ccp(0, 0));
        
        //加入进度条宽高变化
        progress->setBarChangeRate(ccp(1, 0));
        
        progress->setPercentage(100);
        
        this->addChild(progress, 1);
        
        progress->setVisible(false);
        
        //加入进度条数值100
        numsTTF=CCLabelTTF::create("100", "Thonburi", 24);
        
        numsTTF->setAnchorPoint(ccp(0, 0));
        numsTTF->setPosition(ccp(400, wSize.height-55));
        numsTTF->setColor(ccBLACK);
        
        this->addChild(numsTTF, 1);
        
        numsTTF->setVisible(false);
        
        
        //加入暂停界面
        pauseLayer=PauseLayer::create();
        
        pauseLayer->setPosition(ccp(-pauseLayer->getContentSize().width, wSize.height/2-pauseLayer->getContentSize().height/2));
        this->addChild(pauseLayer, 1);
        
        //设置监听事件
        pauseLayer->backitem->setTarget(this, menu_selector(GameLayer::backPressed));//上一步菜单
        pauseLayer->startitem->setTarget(this, menu_selector(GameLayer::startPressed)); //继续菜单
    	pauseLayer->restartitem->setTarget(this,menu_selector(GameLayer::restartPressed)); //重新启动菜单
       
        //布局连连看地图
        mapLayer=MapLayer::create();
        
        mapLayer->setPosition(120,20);
        
        this->addChild(mapLayer, 1);
        
        
        mapLayer->setVisible(false);   
        
    }
    初始化关卡弹出框
    void GameLayer::initDialog()
    {
        //弹出框
        dialogLayer=CCLayerColor::create(ccc4(0, 0, 0, 0), 333*2, 235*2);
        
        dialogLayer->setPosition(ccp(wSize.width/2-dialogLayer->getContentSize().width/2, wSize.height/2-dialogLayer->getContentSize().height/2));
        
        dialogLayer->setScale(0.9);
        this->addChild(dialogLayer, 1);
        
        
        CCSprite *dialogSprite=CCSprite::create("game_dialog-hd.png");
        dialogSprite->setAnchorPoint(ccp(0, 0));
        dialogSprite->setPosition(ccp(0, 0));
        
        dialogLayer->addChild(dialogSprite, 1);
        
        //标题1
        CCLabelTTF *dialoglevel=CCLabelTTF::create(dialogLevelString->getCString(), "Marker Felt", 50);
        dialoglevel->setAnchorPoint(ccp(0, 0));
        dialoglevel->setPosition(ccp(dialogLayer->getContentSize().width/2-dialoglevel->getContentSize().width/2, dialogLayer->getContentSize().height/2-dialoglevel->getContentSize().height/2+30*2));
        dialoglevel->setColor(ccWHITE);
        dialogLayer->addChild(dialoglevel, 1, 310);
    }

    暂停对话框及各按键的事件处理:


    源代码分析:

    暂停菜单
    void GameLayer::pausePressed(CCObject* pSender)
    {  
       // CCLOG("111111111111");
       // CCDirector::sharedDirector()->pause();
    
        
        SimpleAudioEngine::sharedEngine()->playEffect("3.wav");//菜单音效
        
        this->functionSpriteAnimation(CCPoint(leisureSprite->getContentSize().width/2+10*2, wSize.height+leisureSprite->getContentSize().height/2+5*2) ,CCPoint(leisureSprite->getContentSize().width/2+10*2, wSize.height+leisureSprite->getContentSize().height/2));
        
        this->functionPauseSpriteAnimation(CCPoint(pausemenu->getPosition().x, -pauseSprite->getContentSize().height/2-5*2), CCPoint(pausemenu->getPosition().x, -pauseSprite->getContentSize().height/2));
    
    	//暂停隐藏等级图标、进度条图标等
        levelSprite->setVisible(false);
        levelnumsAtlas->setVisible(false);
        progressbgSprite->setVisible(false);
        progress->setVisible(false);
        numsTTF->setVisible(false);
    
    
        CCMoveTo *ac1=CCMoveTo::create(0.15, CCPoint(-44*2, pauseLayer->getPosition().y));
        CCMoveTo *ac2=CCMoveTo::create(0.15, CCPoint(-100, pauseLayer->getPosition().y));
        
        
        CCSequence *seq=CCSequence::create(ac1,ac2,CCCallFunc::create(this, callfunc_selector(GameLayer::gamePause)),NULL);//暂停游戏
        
        
        pauseLayer->runAction(seq);
    
    }
    
    游戏暂停
    void GameLayer::gamePause()
    {
       CCDirector::sharedDirector()->pause();
    
    }
    此弹出框动画
    void GameLayer::dialogAnimaton()
    {
        SimpleAudioEngine::sharedEngine()->playEffect("19.wav");   
        CCShow *ac1=CCShow::create();
        CCScaleTo *ac2=CCScaleTo::create(0.1f, 1.0);
        CCSpawn *spwan=CCSpawn::create(ac1,ac2,NULL);
        CCSequence *seq=CCSequence::create(spwan,CCCallFunc::create(this, callfunc_selector(GameLayer::dialogAnimaton2)),NULL);
      
        dialogLayer->runAction(seq);
       
    }
    
    void GameLayer::dialogAnimaton2()
    {   
        CCScaleTo *ac1=CCScaleTo::create(0.1f, 0.9);
        CCSequence *seq=CCSequence::create(ac1,CCCallFunc::create(this, callfunc_selector(GameLayer::dialogAnimaton3)),NULL);
        dialogLayer->runAction(seq);
    
    }
    
    void GameLayer::dialogAnimaton3()
    {
        CCScaleTo *ac1=CCScaleTo::create(0.1f, 1.0);
        CCScaleTo *ac2=CCScaleTo::create(0.2f, 1.2);
        CCFadeTo *ac3=CCFadeTo::create(0.2f, 0);
        CCSpawn *spwan=CCSpawn::create(ac2,ac3,NULL);
           
        CCSequence *seq=CCSequence::create(ac1,CCDelayTime::create(1.5f),spwan,CCCallFunc::create(this, callfunc_selector(GameLayer::removeDialogLayer)),NULL);
          
        dialogLayer->runAction(seq);   
    }
    对话框消除后,相关图标正常显示,继续走表减时间
    void GameLayer::removeDialogLayer()
    {
    
    
        SimpleAudioEngine::sharedEngine()->playEffect("16.wav");
    
    
        dialogLayer->removeFromParentAndCleanup(true);
        
        levelSprite->setVisible(true);
        levelnumsAtlas->setVisible(true);
        
        progressbgSprite->setVisible(true);
        progress->setVisible(true);
        numsTTF->setVisible(true);
        
        mapLayer->setVisible(true);
        
        this->functionSpriteAnimation(CCPoint(leisureSprite->getPosition().x, wSize.height-leisureSprite->getContentSize().height/2-15*2) ,CCPoint(leisureSprite->getPosition().x, wSize.height-leisureSprite->getContentSize().height/2-10*2));
        
        this->functionPauseSpriteAnimation(CCPoint(pausemenu->getPosition().x, 34*2), CCPoint(pausemenu->getPosition().x, 29*2));
        
        
        //系统刷新
        //this->scheduleUpdate();
            
        this->schedule(schedule_selector(GameLayer::update), 1);
        
        
    }																	
    返回键,切换上一场景
    void GameLayer::backPressed(CCObject* pSender)
    {
    
        this->gameRestart();
    
        SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
        SimpleAudioEngine::sharedEngine()->playEffect("2.wav");
        
        CCScene *scene=HelloWorld::scene();
        
        //旋转动画
        CCDirector::sharedDirector()->replaceScene(CCTransitionFlipX::create(1.2f, scene));
    
        
    }
    进度表倒计时
    void GameLayer::update(float dt)
    {
    	int cu=progress->getPercentage(); 
    	if (cu>0)//倒记数
    	{
    		cu=cu-1.0f;
    		progress->setPercentage(cu); 
    		CCString *str = CCString::createWithFormat("%d",cu);
    		numsTTF->setString(str->getCString());
    	}
    	if (cu==0)//闯关失败
    	{
    		this->unschedule(schedule_selector(GameLayer::update));
    		CocosDenshion::SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
    		CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("lose.mp3");
    
    
    		//CCLabelTTF *label = CCLabelTTF::create(UTEXT("闯关失败"), "Arial", 36.0);
    		CCLabelTTF *label = CCLabelTTF::create("闯关失败", "Arial", 50);
    
    
    		CCSize s = CCDirector::sharedDirector()->getWinSize();
    		label->setPosition(ccp(s.width/2, s.height/2));
    		this->addChild(label);
    		this->scheduleOnce(schedule_selector(GameLayer::exitGame), 1.0);
    	}
    
    
        
    }
    void GameLayer::exitGame(float dt)
    {
    	this->gameRestart();
    
    
    	SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
    	SimpleAudioEngine::sharedEngine()->playEffect("2.wav");
    
    
    	CCScene *scene=HelloWorld::scene();
    
    
    	//旋转动画
    	CCDirector::sharedDirector()->replaceScene(CCTransitionFlipX::create(1.2f, scene));
    
    
    }
    继续键。游戏继续。暂停对话框消除,显示相关图标
    void GameLayer::startPressed(CCObject* pSender)
    {
        
        
        this->gameRestart();
        
        CCMoveTo *ac1=CCMoveTo::create(0.15, CCPoint(-100+4, wSize.height/2-pauseLayer->getContentSize().height/2));
        CCMoveTo *ac2=CCMoveTo::create(0.15, CCPoint(-pauseLayer->getContentSize().width, wSize.height/2-pauseLayer->getContentSize().height/2));
        
        
        CCSequence *seq=CCSequence::create(ac1,ac2,NULL);
        
        pauseLayer->runAction(seq);
        
        levelSprite->setVisible(true);
        levelnumsAtlas->setVisible(true);
        
        progressbgSprite->setVisible(true);
        progress->setVisible(true);
        numsTTF->setVisible(true);
        
        
        this->functionSpriteAnimation(CCPoint(leisureSprite->getPosition().x, wSize.height-leisureSprite->getContentSize().height/2-15*2) ,CCPoint(leisureSprite->getPosition().x, wSize.height-leisureSprite->getContentSize().height/2-10*2));
        
        this->functionPauseSpriteAnimation(CCPoint(pausemenu->getPosition().x, 34*2), CCPoint(pausemenu->getPosition().x, 29*2));
    
    }
    又一次開始键
    void GameLayer::restartPressed(CCObject* pSender)
    {
    	this->gameRestart();
    	SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
    	SimpleAudioEngine::sharedEngine()->playEffect("2.wav");
    
    
    	CCScene *scene=GameLayer::scene();
    
    
    	//旋转动画
    	CCDirector::sharedDirector()->replaceScene(CCTransitionRotoZoom::create(1.2f, scene));
    
    
    }
    
    关闭背景音乐
    void PauseLayer::musicPressed(CCObject* pSender)
    {
    	if (SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying())
    	{
    
    
    		SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
    
    
    		CCSprite *musicSprite=CCSprite::create("button_music_off-hd.png");
    
    
    		CCSprite *musicSprite_s=CCSprite::create("button_music_off-hd.png");
    
    
    		CCMenuItemSprite *musicitem=CCMenuItemSprite::create(musicSprite, musicSprite_s, this, menu_selector(PauseLayer::musicPressed2));
    
    
    		CCMenu *musicmenu=CCMenu::create(musicitem,NULL);
    
    
    		musicitem->setAnchorPoint(ccp(0, 0));
    
    
    		musicmenu->setPosition(ccp(127*2,66*2));
    
    
    		this->addChild(musicmenu, 1);
    	}
    
    
    }
    
    
    void PauseLayer::musicPressed2(CCObject* pSender)
    {
    	
    	SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();
    	CCSprite *musicSprite=CCSprite::create("button_music-hd.png");
    	CCSprite *musicSprite_s=CCSprite::create("button_music-hd.png");
    
    
    	CCMenuItemSprite *musicitem=CCMenuItemSprite::create(musicSprite, musicSprite_s, this, menu_selector(PauseLayer::musicPressed));
    
    
    	CCMenu *musicmenu=CCMenu::create(musicitem,NULL);
    
    
    	musicitem->setAnchorPoint(ccp(0, 0));
    
    
    	musicmenu->setPosition(ccp(127*2,66*2));
    
    
    	this->addChild(musicmenu, 1);
    }


  • 相关阅读:
    vue, 同一个页面有多处地方需要上传图片
    单张图片上传,vue
    replace 替换只会替换找到的第一个字符
    vue ant design table中rowSelection属性的应用
    一般做页面时需要注意的事项
    vue 为form 表单赋值 获取form表单的值
    vue 父子组件中的传值
    vue 页面跳组件,实现点击浏览器自带返回箭头,返回到上一个页面,而不是返回道上个路由
    vue ant design a-table 的分页
    初建vuex项目
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10662717.html
Copyright © 2011-2022 走看看