【核心类】

导演Director、场景Scene、布景层Layer、精灵Sprite的概念请移步:cocos2dx基础篇(3)——第一个程序HelloWorld

导演控制场景,场景控制图层,图层控制精灵,精灵控制动作。

相互之间的关系框架如下图所示:

由此看出:

(1)整个游戏一般只有一个导演。

(2)一个游戏可以由多个场景组成(菜单界面、游戏界面、游戏结束界面等),但是每次导演只能指导一个场景的运作。

(3)一个场景可以由多个图层组成(背景层、道具层、英雄层、怪物层等,每个图层都可以由多个精灵元素组成(标签、按钮、菜单等)。

(4)对于图层上的每个精灵元素,一般都附带相应的动作,可以带多个动作。如挥刀、使用魔法、跑、跳,以及放大、缩小、旋转等动作。




【导演Director】

就和现实中的导演一样,这里的导演也是起到指导的作用的。导演在这里负责的就是让不同的场景切换,控制整个游戏的流程,包括开始,继续,暂停等。以及设置、获取系统信息,比如调整OpenGL相关的设置,获取屏幕的大小等。

和Scene、Layer、Sprite等不同的是,导演类Director是直接继承Ref类的,而不是Node类。

继承关系如下:

主要函数如下:

///**导演类Director主要是用来:-创建一个主窗口-管理场景SceneDirector也负责以下:-初始化OpenGL内容-设置OpenGL像素格式(默认值时RGB565)-设置OpenGL缓存大小(默认是0-bit)-设置投影(默认是一个3D)-设置方向(默认是竖屏Portrait)Director是一个单例对象,标准的调用方法是:-Director::getInstance()->methodName();*/classCC_DLLDirector:publicRef{/***获取单例对象*///获取全局唯一的Director实例,替代sharedDirector//使用方法:Director::getInstance()->replaceScene(scene);staticDirector*getInstance();/***场景管理相关*-runWithScene*-pushScene*-popScene,popToRootScene,popToSceneStackLevel*-replaceScene*-pause,resume,end*-getRunningScene,isPaused*///指定进入Director的主循环运行的场景.//ps:仅在运行第一个场景时调用,如果已经存在运行中的场景,不能调用本方法.//本方法调用后将调用pushScene方法,然后调用startAnimation.voidrunWithScene(Scene*scene);//将运行中的场景暂停,并push到场景堆栈中,运行新的场景.voidpushScene(Scene*scene);//从场景堆栈中pop出一个场景,替换现在正运行的场景,而运行中的场景将被删除.voidpopScene();//从场景堆栈中pop出所有场景,最后一个栈底的场景将替换现在正运行的场景,而运行中的场景将被删除.voidpopToRootScene();//弹出从队列中的所有场景,直到它到达level.//如果level是0,它将结束director.//如果level是1,从队列中弹出所有的场景,直到只有根场景在队列中.//如果level<=当前的堆栈水平,它不会做任何事情。voidpopToSceneStackLevel(intlevel);//使用新场景替换当前场景,而运行中的场景将被删除.//PS:旧场景不压入堆栈,而是直接删除.voidreplaceScene(Scene*scene);voidpause(void);//暂停场景voidresume(void);//恢复被暂停的场景voidend(void);//终止执行,释放运行中的场景.GLview需手动移除.inlineScene*getRunningScene();//获取当前运行的场景inlineboolisPaused();//Director是否被暂停/***刷新帧数FPS相关*-setAnimationInterval*-setDisplayStats*-getSecondsPerFrame,getTotalFrames*///设置程序的FPS值.即刷新频率,相连两帧的时间间隔.//如dValue=1.0/60.0表示每秒60帧.virtualvoidsetAnimationInterval(doubleinterval)=0;inlinedoublegetAnimationInterval();//是否在左下角显示FPSinlinevoidsetDisplayStats(booldisplayStats);inlineboolisDisplayStats();//获取每秒执行帧数inlinefloatgetSecondsPerFrame()//从Director开机后,总共已经渲染了多少帧inlineunsignedintgetTotalFrames();/***OpenGL图形渲染相关*-setOpenGLView*-setProjection*-getTextureCache*-setViewport,setGLDefaultValues,setAlphaBlending,setDepthTest*///获取渲染所有东西的GLViewvoidsetOpenGLView(GLView*openGLView);inlineGLView*getOpenGLView();//设置一个OpenGL投影//Projection::_2D:设定的二维投影(正投影)//Projection::_3D:使用fovy=60,znear=0.5fandzfar=1500设置一个3D投影//Projection::CUSTOM:投影委托里面它调用"updateProjection".//Projection::DEFAULT=_3D:默认投影是3D投影voidsetProjection(Projectionprojection);inlineProjectiongetProjection();TextureCache*getTextureCache()const;//获取纹理缓冲voidsetViewport();//设置glViewportvoidsetGLDefaultValues();//设置OpenGL默认值voidsetAlphaBlending(boolon);//启用/禁用OpenGLalpha混合voidsetDepthTest(boolon);//启用/禁用OpenGL深度测试/***OpenGLView视图相关*-getWinSize*-getVisibleSize,getVisibleOrigin*-convertToGL,convertToUI*///类似手机屏幕的大小constSize&getWinSize()const;//获取OpenGLview大小,单位点.SizegetWinSizeInPixels()const;//获取OpenGLview大小,单位像素.//类似程序的游戏区域//如果不调用GLView::setDesignResolutionSize(),值等于getWinSizeSizegetVisibleSize()const;//获取OpenGLView可视区域大小,单位点.Vec2getVisibleOrigin()const;//获取可视区域的原点坐标.//将UIKit坐标与OpenGL坐标的相互转换//UIKit坐标:原点在屏幕的左上角.从左到右,从上到下.//OpenGL坐标:原点在屏幕的左下角.从左到右,从下到上.Vec2convertToGL(constVec2&point);//转为GL坐标Vec2convertToUI(constVec2&point);//转为UI坐标/***其他操作*-purgeCachedData*-getRenderer*-setDefaultValues*-setScheduler,setActionManager,setEventDispatcher*/voidpurgeCachedData();//移除所有cocos2d缓存数据.Renderer*getRenderer()const;//获取渲染器(Renderer).v3.0voidsetDefaultValues();//设置配置信息的默认值voidsetScheduler(Scheduler*scheduler);//设置与director关联的调度器voidsetActionManager(ActionManager*actionManager);//设置与director关联的ActionManagervoidsetEventDispatcher(EventDispatcher*dispatcher);//设置与director关联的EventDispatcher.v3.0Scheduler*getScheduler()const;ActionManager*getActionManager()const;EventDispatcher*getEventDispatcher()const;}//




【场景Scene】

Scene是继承与Node类的。作为场景类,它却只有函数create。因为场景就像是一个容器,将不同的布景层(Layer)组合在一起,方便管理。

一个游戏会有很多的场景,比如,主界面,游戏界面,载入界面等等都是一个场景。而每一个场景都是由多个图层组合在一起,形成一个完整的游戏画面。

其实在cocos2dx基础篇(3)——第一个程序HelloWorld中就出现了Scene的创建,以及将HelloWorld布景层放入该Scene中。

继承关系如下:

主要函数如下:

//classCC_DLLScene:publicNode{staticScene*create();//大小和屏幕一样staticScene*createWithSize(constSize&size);//自定义大小virtualScene*getScene()constoverride;//覆盖};//




【布景层Layer】

Layer继承于Node。Layer不仅继承了CCNode的所有操作,还附加触控、重力加速度计、支持键盘输入的事件代理。

一个布景层(Layer)可以包含多个元素,如标签(Label)、菜单(Menu)、精灵(Sprite)等等。

和2.x对比,3.2版本的Layer做了很大的改动:将触控函数 ccTouch 改为 onTouch ,还弃用了好多加速度计、键盘输入事件相关操作函数。

并且对于触控、加速度计、键盘输入的事件回调函数,将通过3.x中新的事件分发机制来完成。

注意:Layer的锚点默认为(0,0),即左下角。并且忽略锚点的设置,即使你setAnchorPoint了锚点,Layer的锚点也不会改变,依然是(0,0)。

继承关系如下:

主要函数如下:

//classCC_DLLLayer:publicNode{/***创建布景层*-create*/staticLayer*create();/***触控相关*-单点触控onTouch*-多点触控onTouches*///单点触控virtualboolonTouchBegan(Touch*touch,Event*unused_event);virtualvoidonTouchMoved(Touch*touch,Event*unused_event);virtualvoidonTouchEnded(Touch*touch,Event*unused_event);virtualvoidonTouchCancelled(Touch*touch,Event*unused_event);//多点触控virtualvoidonTouchesBegan(conststd::vector<Touch*>&touches,Event*unused_event);virtualvoidonTouchesMoved(conststd::vector<Touch*>&touches,Event*unused_event);virtualvoidonTouchesEnded(conststd::vector<Touch*>&touches,Event*unused_event);virtualvoidonTouchesCancelled(conststd::vector<Touch*>&touches,Event*unused_event);/***加速度计相关.即重力感应.*-Acceleration为加速度计信息*-classAcceleration:publicRef{doublex,y,z,timestamp;};*///加速度计监听事件回调函数virtualvoidonAcceleration(Acceleration*acc,Event*unused_event);/***键盘输入相关*-KeyCode:为键盘按下了那个键.*-举例:KEY_BACKSPACE,KEY_ALT,KEY_F1,KEY_0,KEY_A,...*-详情参照:"\cocos\base\CCEventKeyboard.h"*///按下键盘,监听事件回调函数virtualvoidonKeyPressed(EventKeyboard::KeyCodekeyCode,Event*event);//释放键盘,监听事件回调函数virtualvoidonKeyReleased(EventKeyboard::KeyCodekeyCode,Event*event);};//




【精灵Sprite】

精灵说简单一点,其实就是一个2D的图片。并赋予图片各种属性以及特性。如大小、颜色、放缩、旋转、动作等。精灵一般都是放在布景层(Layer)上面的,即一个布景层(Layer)应当有许多的精灵存在。精灵可以用来当做背景、人物、鸟、白云等内容。

Sprite不仅继承了Node,还继承了纹理协议接口TextureProtocol。

TextureProtocol纹理协议接口主要是负责纹理图片的管理。

注意:精灵的锚点默认为(0.5,0.5),即中心点。

继承关系如下:


主要函数如下:

///**Sprite定义为二维图像,可以通过一个图像或一个图像的矩形裁剪部分创建Sprite.-为了优化Sprite渲染,请遵循以下最佳用法:-所有Sprite放入同一个SpriteSheet-所有Sprite使用相同的渲染混合函数(BlendFunc)-使得渲染器(Renderer)自动批量处理("batch")Sprite(将会在一次OpenGL调用内绘制完成)-为了获得额外5%~10的渲染优化效果,你可以把Sprite作为子节点加入到SpriteBatchNode中,-但这么做有以下限制:-Alias/Antialias属性属于SpriteBatchNode,不能单独设置Sprite的Alias属性。-渲染混合函数(BlendFunc)属于SpriteBatchNode,不能单独设置Sprite的渲染混合函数(BlendFunc)。-不支持ParallaxNode,不过可以使用代理("proxy")Sprite模拟实现。-Sprite的子节点只能是其它Sprite(或Sprite的子类)-Sprite的默认锚点(anchorPoint)为(0.5,0.5)。*/classCC_DLLSprite:publicNode,publicTextureProtocol{/***创建方法*-create*-createWithTexture*-createWithSpriteFrame*/staticSprite*create();//默认创建空精灵对象staticSprite*create(conststd::string&filename);//图片文件(*.png)staticSprite*create(conststd::string&filename,constRect&rect);//截取图片文件中某一区域图片staticSprite*createWithTexture(Texture2D*texture);//纹理图片staticSprite*createWithTexture(Texture2D*texture,constRect&rect,boolrotated=false);//截取纹理图片中某一区域图片,是否旋转staticSprite*createWithSpriteFrame(SpriteFrame*spriteFrame);//精灵帧.精灵帧一般从plist中读取的staticSprite*createWithSpriteFrameName(conststd::string&spriteFrameName);//精灵帧的名字/***批处理节点BatchNode*-updateTransform*-setBatchNode*-getBatchNode*/virtualvoidupdateTransform(void);//更新四个值:position(x,y),rotation,scalevirtualvoidsetBatchNode(SpriteBatchNode*spriteBatchNode);//设置批节点,不推荐手工调用virtualSpriteBatchNode*getBatchNode(void);//如果精灵是由批节点渲染,则返回批节点/***纹理Texture*-setTexture*-setTextureRect*///设置精灵的纹理图片.virtualvoidsetTexture(conststd::string&filename);//调用setTextureRect设置Sprite尺寸virtualvoidsetTexture(Texture2D*texture)override;//纹理的矩形尺寸大小不会改变virtualTexture2D*getTexture()constoverride;//设置Sprite纹理(texture)的Rect尺寸(rect)、是否旋转(rotated)、裁剪尺寸(untrimmedSize)。//调用此方法会修改纹理(texture)的坐标和顶点位置virtualvoidsetTextureRect(constRect&rect,boolrotated=false,constSize&untrimmedSize=rect.size);/***精灵帧SpriteFrames&动画Animation*-setSpriteFrame*-isFrameDisplayed*-getSpriteFrame*-setDisplayFrameWithAnimationName*///设置新的显示精灵帧.替代setDisplayFramevirtualvoidsetSpriteFrame(conststd::string&spriteFrameName);virtualvoidsetSpriteFrame(SpriteFrame*newFrame);//返回精灵帧是否正在显示virtualboolisFrameDisplayed(SpriteFrame*pFrame)const;//返回当前显示的精灵帧.替代getDisplayFramevirtualSpriteFrame*getSpriteFrame()const;//通过动画帧的第frameIndex那一帧来设置显示精灵帧//动画帧是从CCAnimationCache中读取的virtualvoidsetDisplayFrameWithAnimationName(conststd::string&animationName,ssize_tframeIndex);/***精灵属性相关*-setDirty*-getQuad*-isTextureRectRotated*-setAtlasIndex*-getTextureRect*-setTextureAtlas*-getOffsetPosition*-setFlippedX,setFlippedY*///设置Sprite在纹理集Atlas中是否需要更新virtualvoidsetDirty(booldirty);virtualboolisDirty(void)const;//返回四个值的信息:坐标(x,y),顶点,颜色inlineV3F_C4B_T2F_QuadgetQuad(void)const;//判断纹理是否被旋转inlineboolisTextureRectRotated(void)const;//设置纹理集(TextureAtlas)的当前使用索引//警告:除非你了解调用此方法的影响,否则不要改变此值inlinevoidsetAtlasIndex(ssize_tatlasIndex);inlinessize_tgetAtlasIndex(void)const;//返回Sprite的Rect区域信息,单位点inlineconstRect&getTextureRect(void);//如果采用批渲染,设置纹理地图集inlinevoidsetTextureAtlas(TextureAtlas*pobTextureAtlas);inlineTextureAtlas*getTextureAtlas(void);//获取偏移值inlineconstVec2&getOffsetPosition(void)const;//设置是否翻转。voidsetFlippedX(boolflippedX);//设置Sprite是否水平翻转。替代setFlipXboolisFlippedX(void)const;voidsetFlippedY(boolflippedY);//设置Sprite是否垂直翻转。替代setFlipYboolisFlippedY(void)const;/***继承于TextureProtocol*-setBlendFunc*///设置颜色混合模式inlinevoidsetBlendFunc(constBlendFunc&blendFunc)override;inlineconstBlendFunc&getBlendFunc()constoverride;/***继承于Node*-Scale,Position,Skew,AnchorPoint,Visible*-addChild,removeChild,reorderChild,sortAllChildren*-draw,setOpacityModifyRGB,isOpacityModifyRGB*/virtualvoidsetScaleX(floatscaleX)override;virtualvoidsetScaleY(floatscaleY)override;virtualvoidsetScale(floatscaleX,floatscaleY)override;virtualvoidsetScale(floatscale)override;virtualvoidsetPosition(constVec2&pos)override;virtualvoidsetPosition(floatx,floaty)override;virtualvoidsetRotation(floatrotation)override;virtualvoidsetPositionZ(floatpositionZ)override;virtualvoidsetSkewX(floatsx)override;virtualvoidsetSkewY(floatsy)override;virtualvoidsetRotationSkewX(floatrotationX)override;virtualvoidsetRotationSkewY(floatrotationY)override;virtualvoidsetAnchorPoint(constVec2&anchor)override;virtualvoidignoreAnchorPointForPosition(boolvalue)override;virtualvoidsetVisible(boolbVisible)override;virtualvoidaddChild(Node*child,intzOrder,inttag)override;virtualvoidaddChild(Node*child,intzOrder,conststd::string&name)override;virtualvoidremoveChild(Node*child,boolcleanup)override;virtualvoidremoveAllChildrenWithCleanup(boolcleanup)override;virtualvoidreorderChild(Node*child,intzOrder)override;virtualvoidsortAllChildren()override;virtualvoiddraw(Renderer*renderer,constMat4&transform,uint32_tflags)override;virtualvoidsetOpacityModifyRGB(boolmodify)override;virtualboolisOpacityModifyRGB(void)constoverride;};//