zoukankan      html  css  js  c++  java
  • Cocos2d-x之Scene

    |   版权声明:本文为博主原创文章,未经博主允许不得转载。 

      Scene场景也是cocos2dx中必不可少的元素,游戏中通常我们需要构建不同的场景(至少一个),游戏里关卡、版块的切换也就是一个一个场景的切换,就像在电影中变换舞台和场地一样。场景的一个重要的作用就是流程控制的作用,我们可以通过Director的一系列方法控制游戏中不同的场景的自由切换。下面是Director控制场景的常用方法:

    runWithScene( Scene *scene )
    /*启动游戏,并运行scene场景。本方法在主程序第一次启动主场景的时候调用。如果已有正在运行的场景则不能调用该方法;会调用pushScene-->startAnimation。*/
    pushScene( Scene *scene )
    /*将当前运行中的场景暂停并压入到代码执行场景栈中,再将传入的scene设置为当前运行场景,只有存在正在运行的场景时才调用该方法;*/
    replaceScene( Scene *scene )
    /*直接使用传入的scene替换当前场景来切换画面,当前场景被释放。这是切换场景时最常用的方法。*/ 
    popScene()
    /*释放当前场景,再从代码执行场景中弹出栈顶的场景,并将其设置为当前运行场景。如果栈为空,直接结束应用。和PushScene结对使用 */
    end()
    //释放和终止执行场景,同时退出应用 
    pause()
    //暂停当前运行场景中的所有计时器和动作,场景仍然会显示在屏幕上 
    resume()
    //恢复当前运行场景的所有计时器和动作,场景仍然会显示在屏幕上
    

      

      同时场景是层的容器,包含了所有需要显示的游戏元素。通常,当我们需要完成一个场景时候,会创建一个Scene的子类,并在子类中实现我们需要的功能。比如,我们可以在子类的初始化中载入游戏资源,为场景添加层,启动音乐播放 等等。

      Scene来是Node的一个子类。和Node相比,Scene只是添加了一个特性,它拥有自己的锚点,位置在运行窗口屏幕的正中央。除此之外,再也没有额外的功能,只是一个抽象的概念

    新建,运行一个场景的方法:

    使用AppDelegate类中的applicationDidFinishLaunching函数中调用上一步定义的方法,并使用导演类的runWithScene方法运行场景,如下

    Scene* MyGame::createScene()
    {
    	//新建场景的实例
    	auto scene = Scene::create();
    	//定义布景层
    	auto layer = MyGame::create();
    	//将布景层加入场景
    	scene->addChild(layer);
    	//返回场景类
    	return scene;
    }
    // create a scene. it's an autorelease object
    auto scene = MyGame::createScene();
    
    // run
    director->runWithScene(scene);
    

     

    场景的切换:

    首先我们建立一个要切换新的Scene:

    StartGame.h

    #ifndef _START_GAME_SCENE_H_
    #define _START_GAME_SCENE_H_
    #include "cocos2d.h"
    
    class MyGameBegin : public cocos2d::Layer
    {
    public:
    	static cocos2d::Scene* createScene();
    	virtual bool init();
    	void startMenuItemback(cocos2d::Ref* pSender);
    	CREATE_FUNC(MyGameBegin);
    };
    #endif //_START_GAME_SCENE_H_
    

    StartGame.cpp

    #include "Startgame.h"
    USING_NS_CC;
    
    Scene* MyGameBegin::createScene()
    {
    	auto startScene = Scene::create();
    	auto startLayer = MyGameBegin::create();
    	startScene->addChild(startLayer);
    	return startScene;
    }
    bool MyGameBegin::init()
    {
    	if (!Layer::init())
    	{
    		return false;
    	}
    	Size startSize = Director::getInstance()->getVisibleSize();
    	Vec2 startOrigin = Director::getInstance()->getVisibleOrigin();
    	auto startSprite = Sprite::create("bg2.png");
    	startSprite->setPosition(Vec2(startSize.width / 2 + startOrigin.x, startOrigin.y + startSize.height / 2));
    	float xs = startSize.width / startSprite->getContentSize().width;
    	float ys = startSize.height / startSprite->getContentSize().height;
    	startSprite->setScale(xs, ys);
    	this->addChild(startSprite);
    
    	return true;
    }
    

    MyGameScene.h

    #ifndef _MYGAME_SCENE_H_
    #define _MYGAME_SCENE_H_
    #include "cocos2d.h"
    
    class MyGame : public cocos2d::Layer
    {
    public:
    	static cocos2d::Scene* createScene();
    	virtual bool init();
    	void startMenuItemback(cocos2d::Ref* pSender);     	//start的回调函数,在这里切换场景
    	void helpMenuItemback(cocos2d::Ref* pSender);		//点击start的回调函数
    	void exitMenuItemback(cocos2d::Ref* pSender);		//点击start的回调函数
    	CREATE_FUNC(MyGame);
    };
    #endif // _MYGAME_SCENE_H_
    

    MyGameScene.cpp

    #include "MyGameScene.h"
    #include "StartGame.h"                             //要包含切换场景的头文件
    USING_NS_CC;
    
    Scene* MyGame::createScene()
    {
    	auto scene = Scene::create();
    	auto layer = MyGame::create();
    	scene->addChild(layer);
    	return scene;
    }
    
    bool MyGame::init()
    {
    	if (!Layer::init())
    	{
    		return false;
    	}	
    	Size visibleSize = Director::getInstance()->getVisibleSize();
    	Vec2 origin = Director::getInstance()->getVisibleOrigin();
    
    	//设置Sprite
    	auto bg = Sprite::create("bg1.png");
    	bg->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));
    
    	//下面是将图片调节到与窗口同比例的缩放;图片 / 窗口
    	float xs = visibleSize.width / bg->getContentSize().width;
    	float ys = visibleSize.height / bg->getContentSize().height;
    	bg->setScale(xs, ys);
    	this->addChild(bg,0);
    
    	auto mouse = Sprite::create("mouse.png");
    	mouse->setPosition(Vec2(visibleSize.width / 3 + origin.x, visibleSize.height / 4 + origin.y));
    	mouse->setScale(0.5, 0.5);
    	this->addChild(mouse, 1);
    
    	auto hammer = Sprite::create("hammer.png");
    	hammer->setPosition(Vec2(visibleSize.width / 2.5 + origin.x, visibleSize.height / 2 + origin.y));
    	hammer->setScale(0.7, 0.7);
    	this->addChild(hammer);
    
    	//设置Label
    	auto label = Label::createWithTTF("Whac-a-mole", "fonts/Marker Felt.ttf", 38);
    	label->setPosition(Vec2(origin.x + visibleSize.width / 2,
    		                  origin.y + visibleSize.height - label->getContentSize().height));
    	this->addChild(label,1);
    
    	//设置一个菜单项,
    	auto start = MenuItemFont::create("Start", CC_CALLBACK_1(MyGame::startMenuItemback, this));
    	start->setPosition(Vec2(origin.x + visibleSize.width / 2,
    		(origin.y + visibleSize.height - (visibleSize.height / 2))));
    
    	auto menu1 = Menu::create(start, NULL);
    	menu1->setPosition(Vec2(0,0));
    	this->addChild(menu1);
    
    	auto help = MenuItemFont::create("Help", CC_CALLBACK_1(MyGame::helpMenuItemback, this));
    	help->setPosition(Vec2(origin.x + visibleSize.width / 2,
    		(origin.y + visibleSize.height - (visibleSize.height / 2) - (Help->getContentSize().height*1.5))));
    	auto menu2 = Menu::create(help, NULL);
    	menu2->setPosition(Vec2(0, 0));
    	this->addChild(menu2);
    
    	auto exit = MenuItemFont::create("Exit", CC_CALLBACK_1(MyGame::exitMenuItemback, this));
    	exit->setPosition(Vec2(origin.x + visibleSize.width / 2,
    		(origin.y + visibleSize.height - (visibleSize.height / 2) - ((Exit->getContentSize().height*1.5) * 2))));
    	auto menu3 = Menu::create(exit, NULL);
    	menu3->setPosition(Vec2(0, 0));
    	this->addChild(menu3);
    
    	return true;
    }
    
    //replaceScene()切换场景,在回调函数中切换场景
    void MyGame::startMenuItemback(Ref* pSender)
    {
    	//这里写回调函数的操作
    	Director::getInstance()->replaceScene(TransitionJumpZoom::create(2, MyGameBegin::createScene()));
    }
    
    void MyGame::helpMenuItemback(Ref* pSender)
    {
    	//这里写回调函数的操作
    }
    
    void MyGame::exitMenuItemback(Ref* pSender)
    {
    	//这里写回调函数的操作	
    	Director::getInstance()->end();    //exit(0);也可以
    }
    

    效果图:

    开始点击进入游戏:start

     切换的过程中的过渡效果:TransitionJumpZoom::create(time,Scene)

     

    >>场景切换效果函数汇总

    TransitionCrossFade::create(time,Scene);  			
    慢慢淡化到另一场景             
              
    TransitionFade::create(time,Scene); 				
    本场景变暗消失后另一场景慢慢出现         
    
    TransitionFadeBL::create(time,Scene); 
    本场景右上角到左下角方块消失到另一场景 
    
    TransitionFadeDown::create(time,Scene);
    本场景从上到下横条消失到另一场景 
    
    TransitionFadeTR::create(time,Scene); 			        
    本场景左下角到右上角方块消失到另一场景
    
    TransitionFadeUp::create(time,Scene); 			        
    本场景从下到上横条消失到另一场景
    
    TransitionFlipAngular::create(time,Scene,style );		
    本场景翻转消失到另一场景(斜上方)
           
    TransitionFlipX::create(time,Scene,style);			
    本场景翻转消失到另一场景(X轴)
              
    TransitionFlipY::create(time,Scene); 			        
    本场景翻转消失到另一场景(Y轴) 
    
    TransitionJumpZoom::create(time,Scene); 			
    本场景跳动消失后另一场景跳动出现        
    
    TransitionMoveInB::create(time,Scene); 			        
    另一场景由整体从下面出现                 
    
    TransitionMoveInL::create(time,Scene); 			        
    另一场景由整体从左面出现                 
    
    TransitionMoveInT::create(time,Scene); 			        
    另一场景由整体从上面出现                 
    
    TransitionMoveInR::create(time,Scene); 			        
    另一场景由整体从右面出现                  
    
    TransitionPageTurn::create(time,Scene,bool); 		        
    翻页切换,bool为true是向前翻。           
    
    TransitionProgressHorizontal::create(time,Scene);		
    本场景从左到右消失同时另一场景出现       
    
    TransitionProgressInOut::create(time,Scene); 		        
    本场景从中间到四周消失同时另一场景出现   
    
    TransitionProgressOutIn::create(time,Scene);			
    本场景从四周到中间消失同时另一场景出现   
    
    TransitionProgressRadialCCW::create(time,Scene); 		
    本场景逆时针消失到另一场景               
    
    TransitionProgressRadialCW::create(time,Scene); 		
    本场景顺时针消失到另一场景               
    
    TransitionProgressVertical::create(time,Scene); 		
    本场景从上到下消失同时另一场景出现       
    
    TransitionRotoZoom::create(time,Scene); 			
    本场景旋转消失后另一场景旋转出现         
    
    TransitionShrinkGrow::create(time,Scene); 			
    本场景缩小切换到另一场景放大             
    
    TransitionSlideInB::create(time,Scene); 			
    本场景向上滑动到另一场景                 
    
    TransitionSlideInL::create(time,Scene); 			
    本场景向右滑动到另一场景                 
    
    TransitionSlideInR::create(time,Scene); 			
    本场景向左滑动到另一场景                
    
    TransitionSlideInT::create(time,Scene); 			
    本场景向下滑动到另一场景                 
    
    TransitionSplitCols::create(time,Scene); 			
    本场景三矩形上下消失后另一场景三矩形上下 
    
    TransitionSplitRows::create(time,Scene); 			
    本场景三矩形左右消失后另一场景三矩形左右 
    
    TransitionTurnOffTiles::create(time,Scene); 			
    本场景小方块消失到另一场景               
    
    TransitionZoomFlipAngular::create(time,Scene,style); 		
    本场景翻转消失到另一场景(斜上方)       
    
    TransitionZoomFlipX::create(time,Scene,style); 		
    本场景翻转消失到另一场景(X轴)          
    
    TransitionZoomFlipY::create(time,Scene,style);		
    本场景翻转消失到另一场景(Y轴 )         
    

    切换成功:

  • 相关阅读:
    ASP.NET HttpRuntime.Cache缓存类使用总结
    ASP.NET MVC自定义AuthorizeAttribute篇知识点讲解—登录限制
    Echarts图表控件使用总结2(Line,Bar)—问题篇
    数据库查询实例(包含所有where条件例子)
    php file_get_contents读取大容量文件方法
    如何给mysql用户分配权限
    dedecms {dede:php}标签用法介绍
    js获取字符串最后一个字符代码
    CSS3选择器之学习笔记
    SQL中实现SPLIT函数几种方法
  • 原文地址:https://www.cnblogs.com/geore/p/5797118.html
Copyright © 2011-2022 走看看