【笔记】Cocos2d-x高级开发教程:制作自己的<捕鱼达人> 笔记一:序_前言_第一章


转载请注明出处http://blog.csdn.net/l_badluck/article/details/17585939


-------------------------------------------------

一切都是为了梦想..

三年,每天学5个小时 3*5*366=5490 这就是自己离梦想的距离

5490-4=5486

-------------------------------------------------

1.Cocos2d-x开源项目诞生于2010年7月。

2.代表作品:<捕鱼达人><我叫MT><龙之力量><找你妹>等。

3.本书中会讲解游戏框架的搭建,基本游戏元素的使用、动作、音乐与音效、物理引擎、高级开发技巧、游戏优化策略以及网络编程等内容,还挑选了引擎的调度系统、动作系统、输入事件处理与底层绘图原理等内容的剖析。

4.触屏时间的派发有坑时该如何绕过去。

5.内存引用计数用着不爽时如何用boost智能指针来替换。

6.cocos2d-iphone如何移植到cocos2d-x上。讲解其中的技术策略、各种策略的优劣以及工作分解。
-------------------------------------------------
前言

1.Cocos2d-x采用C++编写,基于Cocos2d-iphone设计。

2.书中会介绍一些新技术,如多平台开发、可视化开发、游戏移植、cocos2d-HTML5.

3.本书示例游戏中的代码和资源文件可以从 随书源代码 下载。
  本书的电子版本下载地址 http://pan.baidu.com/s/1dD7SSUl

PS:
页码 勘误内容

2 前言,P2,“本书分工与致谢”第一段第二行“丁伟杰”改为“丁炜杰”

9 第一章第9页,bool init()代码中(2)里的代码前5行是一句。但排版却在第四行和第五行之间多了一空行,而且缩进也没了,这样会让读者误以为这是两句代码,而实际上这就是一句,被排版切开了
------------------------------------------------

第一部分 引擎基础

1.介绍如何建立Cocos2d-x的开发环境,游戏开发的基本概念,常用的Cocos2d-x游戏元素,如何创建动态的游戏,以及如何使玩家与游戏进行交互。介绍引擎基本部件,也阐述了引擎关键部分的原理。
-------------------------------------------------
第一章 Hello Cocos2d-x

1.Cocos2d-x的原型是Cocos2d,一个最早来源于几位Python开发者在PyWeek竞赛中的作品,目的是封装底层绘图代码,简化2d游戏的开发过程,避免每次都"重新发明轮子",让开发者不必关心绘图的细节。

2.Cocos2d-x只需要少量调整,就可以移植到IOS、Android、Windows、Linux诸多平台上。

3.本质上,Cocos2d是一个图形引擎,封装了复杂的图形接口,通过抽象出精灵、动作等概念,降低了游戏开发难度,简化了开发过程。Cocos2dx为了保证跨平台,在此基础上做了很多扩展,包括一套Object-C风格的基础类系、平台无关的多点触摸协议、重力感应和音频系统等。

4.Cocos2d特性见到介绍:

5.书中用到的工具
VS2010中文版
我的百度云盘下载链接 http://pan.baidu.com/s/1jG7IFDO
cocos2d-2.0-x-2.0.4
我的百度云盘下载链接 http://pan.baidu.com/s/1o6yNePk

6.打开VS,新建项目,可以看到Cocos2d-x项目模板。需要注意的是,默认情况下新建项目的存放位置应该设置在Cocosd-x引擎的安装目录下,否则可能因为找不到库文件而不能通过编译(此时需要在项目编译选项中设置头文件和库的搜索路径)。建立HelloWorld工程步骤参看本书电子版,不赘述。
PS:书中是在新的解决方案下建立新工程,我一般喜欢在cocos2d-2.0-x-2.0.4解决方案下建新工程。

7.新建的工程中
"main.h""main.cpp""resource.h"
它们是平台相关的程序文件,为Windows专有。通常情况下,程序入口与资源文件管理在不同平台下是不同的,但cocos2d-x的模板已经基本处理好了这些细节,不需要对它们进行修改。
------------------------------------------
"AppDelegate.h""AppDelegate.cpp"
是Cocos2d-x游戏的通用入口文件。类似主函数所在的文件。

AppDelegate类。控制着游戏的生命周期。除了构造函数和析构函数,有三个方法:

bool AppDelegate::applicationDidFinishLaunching()
{//应用程序启动后将调用这个方法。默认的视线中已经包含了游戏启动后的必要准备
    //初始化游戏引擎控制器CCDirector,以便启动游戏引擎
    CCDirector *pDirector = CCDirector::sharedDirector();
    pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());

    //启动FPS(每秒帧速率)显示
    pDirector->setDisplayStats( true);

    //设置绘制间隔. 默认值 1.0/60
    pDirector->setAnimationInterval(1.0 / 60);

    //创建一个场景. it's an autorelease object
    CCScene *pScene = HelloWorld::scene();
      
//需要在此处来对游戏进行必要的初始化,如读取游戏设置、初始化随机数列表等。(PS:不知道自己理解的对不 ^_^ 卖萌)

    //运行场景
    pDirector->runWithScene(pScene);
    return true;
}
绘制间隔指的是两次绘制的时间间隔,因此绘制间隔的倒数就是FPS上限。对于移动设备来说,通常会将FPS限制在一个适当的范围内。过低的每秒重绘次数会使动画显示出卡顿的现象,而提高每秒重绘次数会导致设备运算量大幅增加,造成更高的能耗。
人眼的刷新频率约为60次每秒,因此FPS限定在60是一个较为合理的设置。


// This function will be called when the app is inactive. 
// When comes a phone call,it's be invoked too
// 当程序将要进入后台时会调用这个方法。具体来说,当用户把程序切换到后台,
//或手机接到电话或短信后程序被系统切换到后台时,会调用这个方法。
//此时应该暂停游戏中正在播放的音效。也应该在此时进行动作操作的暂停。
void AppDelegate::applicationDidEnterBackground()
{
    CCDirector::sharedDirector()->stopAnimation();

    SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
}

// this function will be called when the app is active again
//此方法与applicationDidEnterBackground()成对出现,程序在回到前台时被调用
//通常在这里继续播放刚才暂停的音乐,显示游戏暂停菜单等。
void AppDelegate::applicationWillEnterForeground()
{
    CCDirector::sharedDirector()->startAnimation();

    SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}

-----------------------------------------
"HelloWorldScene.h""HelloWorldScene.cpp"
定义了项目中默认的游戏场景
Cocos2d的游戏结构可以简单地概括为场景、层、精灵。这两个文件就是一个场景类的实现。
场景中可以包含多个层,层中可以包含多个精灵。


class HelloWorld : public cocos2d::CCLayer
{
public :
    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init(); 

    // there's no 'id' in cpp, so we recommand to return the exactly class pointer
    static cocos2d::CCScene* scene();
   
    // a selector callback
    void menuCloseCallback(CCObject* pSender);

    // implement the "static node()" method manually
    CREATE_FUNC(HelloWorld);
};

HelloWorld 场景类继承自 CCLayer,所以它本身是一个层。


CCScene* HelloWorld::scene()
{
    CCScene * scene = NULL;
    do
    {
        // 'scene' is an autorelease object 创建一个空场景
        scene = CCScene::create();
        CC_BREAK_IF(! scene);

        // 'layer' is an autorelease object 创建一个层
        HelloWorld *layer = HelloWorld::create();
        CC_BREAK_IF(! layer);

        // add layer as a child to scene
               // 把层添加到场景中。
               // 只有放置到已经呈现出来的游戏元素中,它才会呈现出来
        scene->addChild(layer);
    } while (0);

    // return the scene
    return scene;
}

在层下设置一个创建场景的静态函数是一个常见的技巧。


// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    bool bRet = false ;
    do
    {
        //
        // super init first
        //

        CC_BREAK_IF(! CCLayer::init());//调用父类的init方法进行最初的初始化

        //
        // add your codes below...
        //

        // 1. Add a menu item with "X" image, which is clicked to quit the program.

        // Create a "close" menu item with close icon, it's an auto release object.
        // 创建菜单并添加到层
        CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
            "CloseNormal.png" ,
            "CloseSelected.png" ,
            this,
            menu_selector(HelloWorld::menuCloseCallback));
        CC_BREAK_IF(! pCloseItem);

        // Place the menu item bottom-right conner.
        pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));

        // Create a menu with the "close" menu item, it's an auto release object.
        CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
        pMenu->setPosition(CCPointZero);
        CC_BREAK_IF(! pMenu);

        // Add the menu to HelloWorld layer as a child layer.
        this->addChild(pMenu, 1);

        // 2. Add a label shows "Hello World".

        // Create a label and initialize with string "Hello World".
        // 创建"Hello World"文本标签并添加到层中
        CCLabelTTF* pLabel = CCLabelTTF::create( "Hello World" , "Arial" , 24);
        CC_BREAK_IF(! pLabel);

        // Get window size and place the label upper.
        CCSize size = CCDirector::sharedDirector()->getWinSize();
        pLabel->setPosition(ccp(size.width / 2, size.height - 50));

        // Add the label to HelloWorld layer as a child layer.
        this->addChild(pLabel, 1);

        // 3. Add add a splash screen, show the cocos2d splash image.
        // 创建显示"HelloWorld.png"的精灵并添加到层中
        CCSprite* pSprite = CCSprite::create( "HelloWorld.png" );
        CC_BREAK_IF(! pSprite);

        // Place the sprite on the center of the screen
        pSprite->setPosition(ccp(size.width/2, size.height/2));

        // Add the sprite to HelloWorld layer as a child layer.
        //void CCNode::addChild(CCNode *child, int zOrder)
        //zOrder指child的z轴顺序,值越大,表示显示位置越靠前
        this->addChild(pSprite, 0);

        bRet = true;
    } while (0);

    return bRet;
}

-----------------------------------------
小结

1.AppDelegate:cocos2dx项目中的程序入口文件,提供对程序生命周期的控制事件。
2.游戏元素:任何可以呈现出来的元素,例如场景、层和精灵。
3.CCNode::addChild方法:用于将一个游戏元素添加到另一个元素中。
在创建一个层或者场景时,通常会初始化自己的游戏元素,定义一些特殊的效果,或者是将其他的游戏元素组合到一起。
而addChild方法就是用于组合游戏元素的。
4.cocos2dx在一个实例方法中初始化类,而不在构造函数中初始化类。是因为这个引擎的来源特殊。
(PS:小生邪恶的理解为这类似于文言文中的直译与意译,cocos2dx从cocos2d-iphone移植过来的时候是直译)

文章中所使用的自己建立的第一个工程代码下载地址:http://download.csdn.net/detail/l_badluck/6773287


Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐