最简单实例 HelloWorld分析

来源:互联网 发布:emerson college知乎 编辑:程序博客网 时间:2024/05/07 18:37

我们首先从helloworld开始,cocos2d-x工程中自带helloworld项目,我们就可以通过这个项目来看出cocos2d-x的基本结构

项目结构

可以看到win32,linux,bada,ios等文件夹与平台相关的,与开发逻辑相关的即是Classes和Resource文件夹,Classes文件夹放置代码,Resource放置资源(图片,声音,图片配置文件等)

可以看出除了图片外还有app.config.txt和app.icf都是与配置相关的文件

程序结构:

在win32平台上,就是win32文件夹中的内容和Classes当中的内容,win32文件夹内就是main类,而Classes中是平台配置文件和我们的helloworld场景类

main类就算是win32平台的一个入口类启动程序

AppDelegate是应用真正的入口,在这里有平台的适配参数,找到导演类,启动我们的场景

在AppDelegate除了构建函数和析构函数之外,就是处理暂停和重新开始的函数,initInstance函数处理不同平台的问题,在applicationDidFinishLaunching中就是处理导演类和场景开始


(1)适配策略
2.0版本提供了三种适配策略:
kResolutionNoBorder:超出屏幕的部分会被裁剪,两侧没有黑边,铺满屏幕,按图片原始比例显示,图片不变形。
kResolutionShowAll:整个游戏界面是可见的,会按原始比例进行缩放,图片不变形,但两侧可能会留有黑边,不铺满屏幕。
kResolutionExactFit:整个游戏界面是可见的,图片可能会进行拉伸或者压缩处理,铺满屏幕,图片会变形。
可以根据自己的要求选择。
(2)VisibleSize和VisibleOrigin
getVisibleSize:表示获得视口(可视区域)的大小,如果DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize等于getWinSize。
getVisibleOrigin:表示可视区域的起点坐标,这在处理相对位置的时候非常有用,确保节点在不同分辨率下的位置一致。
(3)DesignResolutionSize
DesignResolutionSize是一个比较重要的概念,其实2.0版本的适配跟1.0版本原理差不多,都是按比例进行缩放。这个DesignResolutionSize表示设计方案,就是你的游戏完美支持的分辨率方案,一般根据图片资源的尺寸来定,自适配时会按照这个分辨率计算出缩放因子。因此,这个值也应该是动态的,如果是横屏游戏则高度肯定是铺满屏幕的,宽度也要尽可能的铺满屏幕,因此应该选择宽高比最大的作为设计分辨率。
(4)设置相对位置
在游戏中使用相对位置设置坐标的好处是显而易见的,这样就不需要为每个分辨率都定义一套坐标了。首先得定义一些参考点,引擎的TestCpp例子中就提供了一种方法,以屏幕上可视区域的9个点作为参考点,相当于在该矩形内写一个米字,这9个点分别是:左上、左、左下、下、右下、右、右上、上、中心。

bool AppDelegate::applicationDidFinishLaunching() {    // initialize director    CCDirector* pDirector = CCDirector::sharedDirector();    CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();    pDirector->setOpenGLView(pEGLView);    // Set the design resolution 设置分辨率,图片显示模式 三种模式    pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionNoBorder);
}

代码很易懂包括设置导演类帧每秒等参数

最后是用摄像机的runWithScene开始场景

最后就是HelloWorldScene场景类,构建方法主要是建层等,关键的方法是init,主要是构建场景中的各种元素

代码也很易懂,每次创建元素后将其使用this-〉addchild函数插入,即放入此场景,第二个参数就是绘制的顺序。其中构建关掉程序的方法中传入了menuCloseCallback方法,即是本类中的menuCloseCallback方法,这样就完成了第一个程序helloworld


坐标体系:

<span style="white-space:pre"></span>//opengl的坐标系和世界坐标系相同,都是以屏幕左下角为原点,向右为x轴的增加方向,向上为y轴的增加方向//这里的世界指的是游戏世界//屏幕坐标系是以左上角为原点,是我们熟悉的//CCDirector::sharedDirector()->convertToGL 转换到OPENGL坐标系//CCDirector::sharedDirector()->convertToUI 转换到屏幕坐标系//CCNode::convertToWorldSpace()把本地坐标系转换到世界坐标系//CCNode::convertToNodeSpace()把世界坐标系转换到本地坐标系
几个大小:

 GetClientRect(m_hWnd, &rcClient); 获取窗口的客户区大小矩形,这个客户区其实就是咱们OpenGL视窗的实际大小,不包含一般窗口的菜单,边框,状态栏等部分。 
setDesignResolutionSize

       分辨率:即是屏幕上图像的精细度,在Cocos2d-x中其大小为屏幕在横向和纵向可以容纳的逻辑点数量,为了好理解,我们把它想像成投影机的分辨率。

       影幕:想想小时候看电影时用到的那块白布吧,当然也许公司会议室里也能看到它。也就是投影机用来投射画面的画布。

       视口:其实就是上面说的投影机投影出来的影片画面所占的矩形。它如果大于影幕的大小,那么你就不能看到完整的影片画面。如果小于影幕的大小。你就可以在它显示的区域里看到影片画面。



  1. CCEGLView::sharedOpenGLView()->setDesignResolutionSize(80, 320, kResolutionExactFit);  
  2. CCEGLView::sharedOpenGLView()->setDesignResolutionSize(80, 320, kResolutionNoBorder);  
  3. CCEGLView::sharedOpenGLView()->setDesignResolutionSize(80, 320, kResolutionShowAll);  
       并进行测试。下面是测试图。



0 0
原创粉丝点击