从HelloWorld开始-创新互联

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类包含一个静态函数和两个实例方法。

创新互联建站是工信部颁发资质IDC服务器商,为用户提供优质的托管服务器服务

  下面我们来看两个比较重要的成员
  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,错误之处,请大家指出.

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:从HelloWorld开始-创新互联
分享地址:http://ybzwz.com/article/dpephs.html