2014年笔试面试综合相关材料cocos2d x屏幕适配_第1页
2014年笔试面试综合相关材料cocos2d x屏幕适配_第2页
2014年笔试面试综合相关材料cocos2d x屏幕适配_第3页
2014年笔试面试综合相关材料cocos2d x屏幕适配_第4页
2014年笔试面试综合相关材料cocos2d x屏幕适配_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

为了适应移动终端的各种分辨率大小,各种屏幕宽高比,在cocos2d-x(当前稳定版:2.0.4)480×3201280×8001080,从到平,还有果设备的ia,这么多同的分率,而大计,在幕设又太浪,而且的硬资源也相对的紧cocos2d-x也帮我们解决宽高比:什么是宽高比,就是你的屏幕是方的还是长的,靠近方形的分辨率如480×320,比例为3:2,还有960×540的16:9标准宽屏,这也算是两种总情况了,如果能在这两种比例情况做好适配基本就可以了,如果比3:2“更方”如4:316:9“更长”,那么不论如何布局,显示效果差距甚大,最好对固定比例优cocos2d-x为我们提供了三种模式,这些模式的是帮我们解决比例不一的情况cocos2d-x默认的适配方案,现在我们就来认识一下这些模式,并且通过这些模式去认识其中一些概念FrameSize、WinSize、VisibleSize、VisibleOrigin,以及它们存在的意义,并且最后灵活运行这些概念创建出kResolutionUnKnowncocos2d-x编写的默认模式,没有做任何处理,在这种情况下,游戏画面的大小与 proj.linux/main.cpplinux CCEGLView*eglView= voidenv,jobjectthiz,jintw,jint // voidenv,jobjectthiz,jintw,jint CCEGLView*view= AppDelegate*pAppDelegate=new // 在此我们首先认识了FrameSize参数,在游戏运行时,我们可以通过了,比如我们写一个精灵的位置距离底部320高度,在480×320分辨率,能看到其在屏幕上方,如果换一台分辨率960×540那么只能显示在中间靠上的位置,如果设置此时可行的方案是使用百分比,如精灵位置在屏幕横向距离左边1/3宽度,在1/2正中间处,而类似这样的设置也不用依赖FrameSize的具体数值。而这样的做法,使得内部元素像弹簧一样,随着FrameSize的大小改变而改变,伸缩或者挤压,对于资源大此不推荐使用cocos2d-x的无模式方案。kResolutionExactFitandkResolutionShowAllAppDelegate.cpp // // DsiRsliize×0左下角(),右角(,),而不论Frmize的大小多少,是×也是,是×0优势而为了保持画面的宽高比,cocos2d-x做了些牺牲,牺牲了什么呢?kResolutionExactFit使用。kResolutionShowAll为了保持设计画面比例对四周进行留黑边处理,使得不同比例下画面不能全屏。鱼和熊掌不能兼得也~setDesignResolutionSize 我们可以用Cocos2d-x程序是如何开始运行与结束的一文的方法,WinSize的初 // //getWinSize(); CCSize //m_obWinSizeInPoints voidCCEGLViewProtocol::setDesignResolutionSize(floatwidth,floatheight,Resolutionresolution) return kResolutionShowAll方案可以作为我们的默认解决方案,使得游戏的设计更为简化,但为kResolutionNoBorderVisibleSize比kResolutionShowAll有所区别的是,为了填补留下的黑边,将画面稍微放大,以至于固定,可以看到ShowAll之中的黑色阴影部分为留边,而NoBorder的紫色阴大小就失去了一定的参考价值了,因为这可能让你的画面显示残缺。这时仅仅通过WinSize满足不了我们的设计需求,所以引入了VisibleSize与VisibleOrigin概念。取和竖向截取,这取决于实际分辨率的宽。而A、B、C、D所标示的是设计分辨率,固定大小。如果我们想让一个精灵元素显示在屏幕上方靠边,那么如果使用WinSize的高度设置其位置,可能出现的情况就是显示到屏幕之外了。FrameSize和WinSize我们VisibleSizeVisibleOrigin所代表的是什么呢,又时如何为我们解决靠边的问题!注意上图下方的定义,VisibleSize=HIJK是用紫色标注的。而在上FrameSizeVisibleSizeHIJK,FrameSize是实际的屏幕分辨率,而VisibleSize是在WinSize之内,保持FrameSize的宽所能占用的最大区域,实际屏幕分辨率HIJK(黑色)可以大于WinSize,但VisibleSize一定会小于或者等于WinSize,这两者相同的是宽。VisibleSize有着WinSize大小(随WinSize的大小改变而改变,还有着FrameSize的宽,它标示在设计分辨率(WinSize)下,在屏幕中的可见区域大小。而VisibleOrigin则标示在设计分辨率下被截取的区域大小,用点K标示,有了这些数据, //组[1] FrameSize:width=720,height= WinSize:width=720,height= VisibleSize:width=720,height VisibleOrigin:x=0,y //组[2][1FrameSizeVisibleSizeVisibleOriginWinSize FrameSize:width=720,height WinSize:width=480,height VisibleSize:width=480,height VisibleOrigin:x=0,y= FrameSize:width=720,height= //组[3]:[1WinSize FrameSize:width=720,height= WinSize:width=720,height= VisibleSize:width=640,height VisibleOrigin:x=40,y WinSizeVisibleSizeVisibleOrigin WinSize.width=(VisibleOrigin.x*2) WinSize.height=(VisibleOrigin.y*2)NoBorder具体的使用方法可以参考cocos2d-x自带例程TestCpp,有详细的使用方法,并且封装了VisibleRect类,可以获取设计分辨率,不同比例屏幕之时的主要参考基于这几种模式的程序使用方法,cocos2d-x自带例程或者网上有很多,这里只详细!这是什么模式!好吧,Leafsoar是一叶的ID,或者是本博客的一级而已:P在cocos2d-x中并没有这种模式。除却UnKnown与ExactFit不说,ShowAll的优势是,只需要一个设计分辨率,然后通过WinSize设置相对对位即可,而且位置的最大长NoBorder况下,实现全屏,显示效果更好,但WinSize一定程度失效,需要通过运行时计算VisibleSizeVisibleOrigin来设置位置,由于是运行时计算,所以也就会出现,各种屏ShowAll和NoBorder各有,各有所短,而这里新适配解决方案正是取两者之长,舍两者之短的组合模式。简单说来就是用NoBorder去实现ShowAll的思想。NoBorder可以保证全屏利用,ShowAll可以更好的使用实际设计坐标固定位置,而且相一目了然(两个图,两个方向:NoBorder模式示意图上添加了新的概念,LsSizeXYMN(leafsoar简写了,为了不跟cocos2d-x的一些概念,什么名字不重要,只要了解其含义即可),在NoBorder模式下的LsSize相对于FrameSize而言,正如在ShowAll模式下的WinSize相对于FrameSize,所以说这是ShowAllNoBorder的组合概念,而这里的LsSize与WinSize的宽是一致的。在ShowAll中,WinSize作为最高的宽高,以此参照设置位置,因为在此范围内都能在NoBorder使得四周可能被截去一块区域,而这个区域大小不可控制,WinSize作为参考点来设置位置,而这里的LsSize同样,因为LsSzie不论在什么情况下,总能显示在屏幕之内,我们可以方便的使用LsSize作为坐标系参VisibleSizeNoBorder加强了不少。它可以可以把LsSize当作ShowAll中的WinSize来用,而黑边可以使用稍大的填充,或LsSizeLsSizeLsSize480×320的分辨率 ointcenter= //600x500NoBorder 480x320LsSize 37x37480x320 CCSprite*p1= CCSprite*p2 CCSprite*p3= CCSprite*p4= 显示效果:(FrameSize显示效果:(ShowAll;FrameSize520×320WinSize显示效果:(NoBorderFrameSize520×320WinSizeFrameSizeNoBorder时,画面由于填充了黑边,将好!既然我们知道是由于放大所致,那么画面缩小呢?cocos2d-x提供了一个方 CCEGLView::sharedOpenGLView()->getScaleY()取得。其实setContentScaleFactor我们看到480×320的显示完全正确了,也正是我们想要的效果,但唯一的缺点~~拐角处四个精灵的位置依然不是我们想要的,我们设计的位置是以480×320设置位WinSize480×320480×320的设计必然会显示到屏幕之外,而要想不修改精灵位置,而让其显示正确的位置,那么为了保证LsSize的固定,我们需要一个方法,那就是动态设置WinSize。什么意思?我们知道一般这些模式设计游戏时,是通过setDesignResolutionSize设置WinSize的,这个值在游戏运行其间是定植,动态改变的是VisibleSize等,而这里提出了LsSize的概念,可想而知,如果WinSize固定,那么LsSize会随着屏幕宽的改变而改变,那么我们反其道而行,固定LsSize值,那么在运行时可以通过实际的宽高WinSizeWinSizeLsSize是一个相对论,WinSize与LsSizeWinSize在运行时动态获得LsSize(NoBorderWinSize没有参考价值,不如我们固定LsSize而在运行时算得WinSize设置来的要更妙一些。现在不使用setContentScaleFactor方法,而修改setDesignResolutionSize这里的值,我们知道WinSize是480×320时,LsSize必然会小于此值,而NoBorder的放大系数我们可以通过如下方式算得(setDesignResolutionSize方法内部实现,并在AppDelegate里执行: //LsSize CCSizelsSize floatscaleY=(float)frameSize.height //scale floatscale=0.0f;//MAX(scaleX, if(scaleX>scaleY) //因为此时FrameSize和LsSize //因为此时FrameSize和LsSize的上下边 scale=scaleX/(frameSize.height } scale=scaleY/(frameSize.width/ CCLog("x:%f;y:%f;scale:%f",scaleX, //根据LsSize和屏幕 动态设定 lsSize.height*scale,(NoBorder;FrameSize520×320LsSize480×320WinSize=动我们看到在没有修改源代码,并且在设计中使用480×320的参考系,也既是基于LsSizeFrameSize来看看是否能够自动适(NoBorder;FrameSize600×480LsSize480×320WinSize=动到此,基于LsSize参考系的游戏设计已经完成了,这样做的好处是很明显的,集ShowAll和NoBorder的优点于一处,这里的元素是为了好定位,实现的需要而写用VisibleSize得到LsSize之外的部分区域大小,在LsSize之外可以使用背景作为装饰,即保证了游戏的全屏,又保证了游戏设计时的方便,如果使用完全基于LsSizeLsSizeLsSize之LsSize // CCScene*scene= // CCLayer*b= //

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论