您的位置:首页 > 移动开发 > Cocos引擎

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

2013-12-26 16:41 501 查看
【笔记】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类。控制着游戏的生命周期。除了构造函数和析构函数,有三个方法:

[align=left][/align]

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;
}

[align=left][/align]

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

[align=left][/align]


// 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();
}


[align=left][/align]

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

[align=left][/align]

[align=left][/align]

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);
};

[align=left][/align]

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

[align=left][/align]

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;
}

[align=left][/align]
在层下设置一个创建场景的静态函数是一个常见的技巧。

[align=left][/align]

// 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;
}


[align=left][/align]

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

1.AppDelegate:cocos2dx项目中的程序入口文件,提供对程序生命周期的控制事件。
2.游戏元素:任何可以呈现出来的元素,例如场景、层和精灵。

3.CCNode::addChild方法:用于将一个游戏元素添加到另一个元素中。
在创建一个层或者场景时,通常会初始化自己的游戏元素,定义一些特殊的效果,或者是将其他的游戏元素组合到一起。

而addChild方法就是用于组合游戏元素的。
4.cocos2dx在一个实例方法中初始化类,而不在构造函数中初始化类。是因为这个引擎的来源特殊。
(PS:小生邪恶的理解为这类似于文言文中的直译与意译,cocos2dx从cocos2d-iphone移植过来的时候是直译)

文章中所使用的自己建立的第一个工程代码下载地址:http://download.csdn.net/detail/l_badluck/6773287
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息