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


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










你可能感兴趣的:(helloworld,开始)