Cocos2d-x之Director
| 版权声明:本文为博主原创文章,未经博主允许不得转载。
Director类简介
在Cocos2d-x-3.x引擎中,采用节点树形结构来管理游戏对象,一个游戏可以划分为不同的场景,一个场景又可以分为不同的层,一个层又可以拥有任意个可见的游戏节点(即对象,游戏中基本上所有的类都派生于节点类Node)。可以执行Action来修改游戏节点的属性,使其移动、旋转、放大、缩小等等。每一个时刻都有一个场景在独立运行,通过切换不同的场景来完成一个游戏流程,游戏流程的管理由Director来执行,其基本框架类图如下:

一款游戏好比一部电影,只是游戏具有更强的交互性,不过它们的基本原理是一致的。所以在Cocos2dx中把统筹游戏大局的类抽象为导演(Director),Director是整个cocos2dx引擎的核心,是整个游戏的导航仪,游戏中的一些常用操作就是由Director来控制的,比如OpenGL ES的初始化,场景的转换,游戏暂停继续的控制,世界坐标和GL坐标之间的切换,对节点(游戏元素)的控制等,还有一些游戏数据的保存调用,屏幕尺寸的获取等都要由Director类来管理控制的。因为Director是游戏项目的总导演,会经常调用进行一些控制,所以该Director利用了单件设计模式,也就是项目里取到的director都是同一个。用getInstance() 方法取得Director的实例,具体的API可以参考相关文档,就不做赘述了。
Director类是Cocos2D-X游戏引擎的核心,它用来闯将并控制着主屏幕的显示,同时控制场景的显示时间和显示方式。Director类还可以设定游戏呈现方面,包括游戏呈现的窗口,PFS显示,默认帧率上限,纹理颜色为框等;在整个游戏里一般只有一个导演。游戏的开始、结束、暂停都会调用Director类的方法。Director类的主要功能如下:
◆ 初始化OpenGL会话
◆ 设置OpenGL的一些参数和方式
◆ 访问和改变场景以及访问Cocos2D-X的配置细节
◆ 访问视图
◆ 设置投影和朝向
Director是单例模式,调用Director方法的标准如下:
auto director = Director::getInstance();
director -> 函数名();
或者
Director::getInstance() -> 函数名();

DisplayerLinkDirector继承了Director,是一个自动刷新的导演类。它支持1/60, 1/30, 1/15三种动画帧间隔。
Director类的主要函数:



画红线重要函数的讲解:
getVisibleOrigin: 获得当前窗口的原点坐标

getVisibleSize: 获取可见窗口的大小,返回的是点

getRunningScene: 获得当前正在运行的场景,导演一次只能运行一个场景。

setOpenGLView: 设置绘制所有对象的OpenGL视图
getOpenGLView: 获得绘制所有对象的OpenGL视图

setProjection: 设置OpenGL投影。
getProjection: 获取OpenGL投影。

getWinSize: 获得当前窗口的大小,经常根据返回的窗口尺寸,定位其他节点位置(点坐标)

convertToGL: 将屏幕坐标转换为一个OpenGL坐标。 对于将(多点)触摸坐标转换为当前布局(横向或纵向)很有用。

convertToUI: 转换一个OpenGL坐标到屏幕坐标。 对于比如glScissor调用将node点转换到窗口点很有用。

stopAnimation: 停止动画。不进行绘制。主循环不会再被触发。 如果你不想暂停动画,请调用 [pause]。

startAnimation: 主循环触发一次。 只有之前调用过stopAnimation,才能调用这个函数。不调用这个函数来开始主循环。请调用runWithScene来开始主循环。

end: 结束场景,同时退出应用

下面这几个函数见cocos2d-x引擎框架那里
runWithScene: 启动游戏,并运行scene场景。这个方法在主程序启动时第一次启动主场景时调用 popScene: 释放当前场景,再从代执行场景栈中弹出栈顶的场景,并将其设置为当前运行场景。如果栈空,则直接结束应用。 pushScene: 将当前运行中的场景暂停并压入到带执行场景栈中去,再将传入的scene设置为当前运行场景。 replaceScene: 直接使用传入的scene替换当前场景来切换画面,当前场景将被释放 pause: 暂停当前运行场景中的所有计时器和动作,场景任会显示在屏幕上 resume: 恢复当前运行场景中被暂停的计时器和动作
导演类的使用代码:
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
} Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin(); /////////余下部分省略 return true;
} void HelloWorld::menuCloseCallback(Ref* pSender) //回调函数的功能实现
{
Director::getInstance()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit();
#endif
} bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
glview = GLViewImpl::createWithRect("MyGame01", Rect(, , designResolutionSize.width, designResolutionSize.height));
#else
glview = GLViewImpl::create("MyGame01");
#endif
director->setOpenGLView(glview);
} // turn on display FPS
director->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this
director->setAnimationInterval(1.0 / ); // Set the design resolution
glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER);
Size frameSize = glview->getFrameSize();
// if the frame's height is larger than the height of medium size.
if (frameSize.height > mediumResolutionSize.height)
{
director->setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height, largeResolutionSize.width/designResolutionSize.width));
}
// if the frame's height is larger than the height of small size.
else if (frameSize.height > smallResolutionSize.height)
{
director->setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height, mediumResolutionSize.width/designResolutionSize.width));
}
// if the frame's height is smaller than the height of medium size.
else
{
director->setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height, smallResolutionSize.width/designResolutionSize.width));
} register_all_packages(); // create a scene. it's an autorelease object
auto scene = MyGame::createScene(); // run
director->runWithScene(scene); return true;
} // This function will be called when the app is inactive. When comes a phone call,it's be invoked too
void AppDelegate::applicationDidEnterBackground() {
Director::getInstance()->stopAnimation(); // if you use SimpleAudioEngine, it must be pause
// SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
} // this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground() {
Director::getInstance()->startAnimation(); // if you use SimpleAudioEngine, it must resume here
// SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
}
Cocos2d-x之Director的更多相关文章
- cocos2d基本类介绍 director/scene/layer/sprite
[核心类] 导演Director.场景Scene.布景层Layer.精灵Sprite的概念请移步: 导演控制场景,场景控制图层,图层控制精灵,精灵控制动作. 相互之间的关系框架 ...
- Cocos2d 之FlyBird开发---GameAbout类
| 版权声明:本文为博主原创文章,未经博主允许不得转载.(笔者才疏学浅,如有错误,请多多指教) 一般像游戏关于的这种界面中,主要显示的是游戏的玩法等. GameAbout.h #ifndef _G ...
- Cocos2d 之FlyBird开发---GameScore类
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 这个类主要实现的是,显示历次成绩中的最好成绩.当然我写的这个很简洁,还可以写的更加的丰富.下面贴上代码: GameScore.h #ifn ...
- Cocos2d 之FlyBird开发---MainMenu类
| 版权声明:本文为博主原创文章,未经博主允许不得转载. MainMenu类主要实现的是游戏主界面的布局,它相当于一个港口,有开向各处的航道,而游戏中的MainMenu则是有跳转到各个场景的一个集 ...
- cocos2d-x 3.6 mac下的试用(粒子,触摸事件,图片)
戏说 虽然公司再如何如何,咱程序员在干好课外学习的情况下也是要努力做好本职工作的. 工作中的lua也写多了,深入了解Cocos2d-x当然还是要倒腾倒腾C++,对于一个C#用了这么多年,工作用lua的 ...
- Cocos2d-x 3.x 头像选择,本地相册图片+图片编辑(Android、IOS双平台)
大连游戏产业不是很发达,最后,选择一个应用程序外包公司.积累的工作和学习过程中的一点业余生活微信体验,我想分享的游戏小朋友的爱. 在应用开发过程中会经常实用户上传头像的功能,在网上找了N多资料发现没有 ...
- Cocos2dx 3.x 屏幕适配
Cocos2dx 3.10+Cocos Studio3.10 1.在适配过程中必须明确几个概念: ①Frame大小:这个值在windows/mac/linux下就是创建窗体的大小,在手机上就是屏幕大小 ...
- 1.cocos_helloworld
在class HelloWorld : public cocos2d::Layer中添加函数 void menuclose(cocos2d::Ref *psender); 实现: void Hello ...
- 小尝试一下 cocos2d
好奇 cocos2d 到底是怎样一个框架,正好有个项目需要一个游戏框架,所以稍微了解了一下.小结一下了解到的情况. 基本概念 首先呢,因为 cocos2d 是基于 pyglet 做的,你完全可以直接用 ...
- 学生信息管理系统(cocos2d引擎)——数据结构课程设计
老师手把手教了两天半,看了一下模式,加了几个功能就大功告成了!!! 给我的感想就是全都是指针! 添加图片精灵: CCSprite* spBG = CCSprite::create("&qu ...
随机推荐
- svn设置文件提交过滤、svn设置classes文件提交
在svn提交文件的时候为了避免一些不必要的文件也提交到资源库 像编译后的.class文件 第一步:在文件中右击打开设置, 第二步:找到全局忽略样式 第三步:修改要过滤的文件 设置过滤通配符 *clas ...
- python 中for与else搭配使用
先看一段程序: for i in range(10): if i == 5: print( 'found it! i = %s' % i) break else: print('not found i ...
- VC++实现窗口置顶
最近在跟着Visual C++网络编程开发与实战视频教程做HttpSourceViewer这个MFC项目时,可以看我Github上的项目HttpSourceViewer,目前基本实现了所有功能,就是关 ...
- 微信小程序实战篇-分类页面制作
https://blog.csdn.net/u012927188/article/details/73650264
- js 中的深拷贝与浅拷贝
在面试中经常会问到js的深拷贝和浅拷贝,也常常让我们手写,下面我们彻底搞懂js的深拷贝与浅拷贝. 在js中 Array 和 Object 这种引用类型的值,当把一个变量赋值给另一个变量时,这个值得副 ...
- 搭建git服务器遇到的问题
1.错误提示: remote: error: insufficient permission for adding an object to repository database ./objects ...
- db2重组所有表和更新表统计信息
1.构建db2admin模式下的所有表的重组语句: select ' reorg table '||TABLE_NAME||';' from sysibm.tables where TABLE_SC ...
- [Java 教程 02] 开发环境搭建
在上一篇文章对Java做了一个简单介绍之后,我想大家都已经对她有一个初步的认识了吧!那踏入正式学习使用Java之前,我们有一步是不得不做的,它是什么呢?没有错,就是我们本篇文章的标题所说,搭建Java ...
- CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架 2018.3.11
CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架 阿里云服务器的选择 当然是选择学生优惠啦.这里阿里云还提供了轻量级服务器这个选项,可以预装 LA ...
- php yield关键字以及协程的实现
php的yield是在php5.5版本就出来了,而在初级php界却很少有人提起,我就说说个人对php yield的理解 Iterator接口 在php中,除了数组,对象可以被foreach遍历之外,还 ...