Cocos2d是一个图形引擎,封装了复杂的图形接口,通过抽象出精灵,动作等概念,降低了游戏开发难度,简化了开发过程。Cocos2d-X为保证游戏能方便地移植到不同平台,做了很多扩展,包括了一套Object-C风格的基础类系、平台无关的多点触摸协议、重力感应和音频系统等。
Cocos2d-X Feature:
流程控制:非常容易管理不同场景之间的流程控制
精灵:快速且方便的精灵用于显示一切可见的元素
节点:基于树结构的分层组织方式,方便管理不同层次的游戏元素,同时提供了统一管理的计时器
动作: 应用于精灵或者其他游戏的动画效果,可以组合成复杂的动作,比如移动、旋转、缩放等
特效:包括波浪、旋转、透镜等视觉特效
平面地图:支持矩形和六边形的平面地图
菜单:创建游戏常用的菜单
用户输入:提供接受用户触摸事件,传感器等输入的简单解决方案
文档: 编程指南、API参考及许多简单可靠的测试样例
MIT许可:免费开放的协议,但是请谨记尊重版权
基于OPENGL:深度优化的绘图方式,支持硬件加速
Cocos2d-X的流程控制是个相当方便的特点,利用CCDirector我们可以方便地在不同场景间切换,而且为了防止切换的生硬,提供了CCTransitionScene系列特效类来包装原来的场景类,做到平滑地过渡。其他引擎鲜有做到。
环境搭建
http://mobile.51cto.com/iphone-330448.htm 有详细介绍。下面我们会搭建最简单的Win32平台
从官方网站[http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download]下载最新的Cocos2d-x版本,我选择的2.0版本
解压后运行install-templates-msvs.bat, Cocos2d-X 应用模板会正确安装到VS环境。
下面就可以建立项目了。
打开vs, 新建项目 -- 选择安装好的Cocos2d-X项目, 一路Next, 就可以建好我们的第一个Cocos2d-X项目。
将新项目选为启动项目,compile-link-run, 如果一切顺利, 会出现一个Hello World场景。
Hello World项目结构分析
resource 文件夹
该文件夹主要用于存放游戏中的图片、音频、配置等资源。为了方便管理,可以在下面创建新文件夹。在不同的平台下,对于文件路径的定义是不一致的,但是
实际接口大同小异。Cocos2d-X为我们屏蔽了这些差异。其中resource文件夹可以默认为游戏运行时的目录
include & source 文件夹
这两个文件夹用于放置游戏头文件和源代码文件夹。可以看到,项目模板为我们放置了3个文件为main.h, main.cpp和resource.h,它们是平台相关的程序文件,
为windows专有。通常情况下,程序入口与资源文件管理在不同平台下是不同的,但是Cocos2d-X为我们处理了这些细节,不需要对它们进行修改
AppDelegate.h & AppDelegate.cpp
Cocos2d-X游戏的通用入口文件,类似于一般Windows工程中的主函数
打开AppDelegate.cpp, 我们可以已经自动添加的代码。AppDelegate控制着程序的生命周期,除掉构造函数和析构函数,共有3个方法
1. bool applicationDidFinishLauching()
2. bool applicationDidEnterBackground()
3. bool applicationDidEnterForeground()
方法1在应用程序启动后调用,默认的实现已经包含了游戏启动后的必要准备:
//初始化游戏引擎控制器CCDirector,以便启动游戏引擎
CCDirector *pDirector = CCDirector:: sharedDirector();
pDirector->setOpenGLView(&CCEGLView:: sharedOpenGLView());
//启动高分辨率屏幕,比如IOS设备的Retina屏幕
//pDirector->enableRetinaDisplay(true);
//启用FPS显示
pDirector->setDisplayStatus(true);
//设置绘制间隔
pDirector->setAnimationInterval(1.0 / 60);
CCScene *pScene = HelloWorld:: scene();
pDirector->runWithScene(pScene);
return true;
pDirector是游戏的大总管,一般这类管理类角色采用单例模式。Cocos2d-X单例采用sharedXXX的写法,比如这里的
CCDirector::sharedDirector(), CCEGLView:: sharedOpenGLView()
Cocos2d-X的指针实例貌似都采用p打头,比如这里pDirector、pScene
CCDirector *pDirector = CCDirector:: sharedDirector()简简单单的一句代码,其实背后干了很多的事情。这会在后面来一一分析。
接下来,bool applicationDidEnterBackground(),bool applicationDidEnterForeground(),这两个方法是程序进入后台和返回前台时候自动调要的函数。类似于JAME中的HideNotify() 和 ShowNotify(),比如在进入后台要关闭游戏中音乐,终止游戏,进入前台,要恢复到游戏中止前的状态,比如进入游戏暂停菜单
HelloWorldScene.h 和 HelloWorldScene.cpp
这两个文件定义了HelloWorld项目默认的游戏场景。Cocos2d-X的游戏结构可以简单地概括为场景、层、精灵,而这两个文件就是HelloWorld的场景实现文件。一般地,场景包括层,层包括精灵。后续部分我们将详细讲解Cocos2d-X的游戏元素概念。
HelloWorldScene中定义了一个HelloWorldScene类,该类继承自CCLayer,因此HelloWorld本身是一个层。HelloWorld类包含一个静态函数和两个实例方法。
下面我们来看两个比较重要的成员
static CCScene * scene() 在Cocos2d-X中,在层中设置一个创建场景的静态函数是一个常见的技巧。我们为HelloWorld层编写了一个CCLayer的子类,在其中
添加各种精灵和逻辑处理代码。
看看static CCScene * scene的实现
CCScene * HelloWorld:: scene()
{
CCScene * scene = NULL;
do
{
scene = CCScene:: create();
CC_BREAK_IF(!scene);
HelloWorld *layer = HelloWorld:: create();
CC_BREAK_IF(!layer);
scene->addChild(layer);
}while(0);
return scene;
}
可见,这里返回了一个包含创建场景的层的场景。确实很方便
这里,我们第一次看到addChild方法来将层添加到Scene对象,这个方法可以把一个游戏元素放到另外一个元素之中。只有把一个元素放到其他已经呈现
出来的游戏元素之中,它才会呈现出来,比如这里我们将HelloWorld层置入创建的空场景中,而在AppDelegate.cpp中,我们已经让CCDirector运行了该
场景,所以,HelloWorld层就会出现在屏幕中。
addChild(CCNode * child, int zOrder) 这个重载方法,第二个参数越大,表示显示的位置越靠前
bool init() 初始化HelloWorld类
1. 对父类进行初始化 // 父类初始化了些什么,参见源码
if(!CCLayer::init())
return false;
2. 创建菜单并添加到层
CCMenuItemImage *pCloseItem = CCMenuItemImage:: create(
"CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback));
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
CCMenu *pMenu = CCMenu:: create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu, 1);
3. 创建"HelloWorld"标签并添加到层中
CCLableTTF *pLabel = CCLabelTTF:: create("HelloWorld", "Arial", 24);
CCSize size = CCDirector::sharedDirector()->getWinSize();
pLabel->setPosition(ccp(size.width / 2, size.height - 50));
this->addChild(pLabel, 1);
4 创建显示"HelloWorld.png"的精灵到层中
CCSprite *pSprite = CCSprite:: create("HelloWorld.png");
pSprite->setPosition(ccp(size.width/2, size.height/2));
this->addChild(pSprite, 0);
return true;
也许读者会有疑惑,为什么我们在一个实例方法中初始化类,而不是在构造函数中呢,这是由于Cocos2d-X来源特殊,所以没有采用C++的编程风格.
总结下,HelloWorld层创建游戏内容以及逻辑,并创建一个空场景作为自己的父容器,而AppDelegate启动了这个父容器,从而使得游戏得以呈现。可见游戏的核心部分是由层创建的。
初学Cocos2d-X,错误之处,请大家指出.
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。