学习笔记cocos2d-x之项目分析

注意:cocos2d-x版本是3.8.1,vs是2013

一、准备过程


1.新建一个新的cocos2d-x的项目


二、结构解说


1.resource文件夹主要用于存放游戏中需要的图片、音频和配置等资源文件。为了方便管理,可以在其中创建子文件夹。在不同平台下,对于文件路径的定义是不一致的,但实际接口大同小异。cocos2d-x为我们屏蔽了这些差异,其中resource文件夹可以默认为游戏运行时的目录。

2.AppDelegate.h和AppDelegate.cpp文件是cocos2d-x游戏的通用入口文件,类似于一般Windows工程中主函数所在的文件。

AppDelegate控制着游戏的生命周期,除去构造函数和析构函数外共三个方法


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

bool AppDelegate::applicationDidFinishLaunching() .应用程序启动后将调用这个方法。默认的实现中已经包含了游戏启动后的必要准备。

auto director = Director::getInstance(); //出事后游戏引擎控制器,已便启动游戏
auto glview = director->getOpenGLView();

director->setDisplayStats(true); //启用FPS显示,FPS即每秒帧速率,也就是屏幕每秒重绘的次数启用了FPS显示后,当前的FPS会在游戏的左下角显示。通常在游戏开发阶段,我们会启用FPS显示,这样可以方便地确定游戏运行是否流畅。

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

auto scene = HelloWorld::createScene(); //创建Hello World场景,指派director运行这个场景。对于游戏开发者而言,我们需要在此处来对我们的游戏进行其他必要的初始化,例如读取游戏设置,初始化随机数列等。
director->runWithScene(scene);
return true;//程序的最末端返回true,表示程序已经正常初始化

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

void AppDelegate::applicationDidEnterBackground()

当应用程序将要进入后台时,会调用这个方法。具体来说,当用户把程序切换到后台,或者手机接到电话或短信后程序被系统切换到后台时会调用这个方法。此时,应该暂停游戏中正在播放的音乐或音效。动作激烈的游戏通常也应该在此时进行暂停操作,以便玩家暂时离开游戏时不会遭受重大损失。

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

void AppDelegate::applicationWillEnterForeground()

该方法与applicationDidEnterBackground()成对出现,在应用程序回到前台时被调用。相对地,我们通常在这里继续播放刚才暂停的音乐,显示游戏暂停菜单等。

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

3.HelloWorldScene.h与HelloWorldScene.cpp文件,这两个文件定义了HelloWorld项目中默认的游戏场景。Cocos2d的游戏结构可以简单的概括为场景、层、精灵,而这两个文件就是Hello World场景的实现文件。每个游戏组件都可以添加到另一个组件中,形成层次关系,例如场景中可以包含多个层,层中可以包含多个精灵。HelloWorldScene中定义了一个HelloWorld类,该类继承自CCLayer,因此HelloWorld本身是一个层。HelloWorld类包含一个静态函数和一个实例方法

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

static cocos2d::Scene* createScene();

在Cocos2d中,在层下设置一个创建场景的静态函数是一个常见的技巧。我们为HelloWorld层编写了CCLayer的一个子类,在子类中为层添加各种精灵或是逻辑处理代码。然而我们的HelloWorld场景十分简单,只包含了一个层,没有任何其他需要处理的问题。因此,我们处理创建CCScene的一个子类之外,也可以直接使用静态函数来创建一个空场景,再把层置入场景之中

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

Scene* HelloWorld::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::create(); //利用Scene::create()创建了一个空场景,在bool AppDelegate::applicationDidFinishLaunching()中此场景被运行

// 'layer' is an autorelease object
auto layer = HelloWorld::create(); //利用Helloworld::create()方法创建一个HelloWorld层的实例


// add layer as a child to scene
scene->addChild(layer); //调用scene对象的addChild方法来把创建的层加入场景之中。addChild方法可以把一个游戏元素放置到另一个元素之中。只有把一个游戏元素放置到其他已经呈现出来的游戏元素中,它才会呈现出来。比如将HelloWorld层置入上面的空场景中,Director已经运行了该场景,因此HelloWorld层就会显示在屏幕上


// return the scene
return scene;
}

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

virtual bool init();

用于初始化HelloWorld类

//对父类进行初始化

if ( !Layer::init() )
{
return false;
}

//创建菜单并添加到层

auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));

closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2,
origin.y + closeItem->getContentSize().height/2));


// create menu,it's an autorelease object
auto menu = Menu::create(closeItem,NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu,1);

//创建HelloWorld标签并添加到层中

auto label = Label::createWithTTF("Hello World","fonts/Marker Felt.ttf",24);

// position the label on the center of the screen
label->setPosition(Vec2(origin.x + visibleSize.width/2,
origin.y + visibleSize.height - label->getContentSize().height));


// add the label as a child to this layer
this->addChild(label,1);

//创建显示HelloWorld.png的精灵并添加到层中

// add "HelloWorld" splash screen"
auto sprite = Sprite::create("HelloWorld.png");


// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x,visibleSize.height/2 + origin.y));


// add the sprite as a child to this layer
this->addChild(sprite,0);

return true;//最后程序返回true,表示初始化成功

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

概念:

1.FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。FPS是测量用于保存、显示动态视频的信息数量。每秒钟帧数愈多,所显示的动作就会愈流畅。通常,要避免动作不流畅的最低是30。某些计算机视频格式,每秒只能提供15帧。


函数解说:

1.addChild(CCNode* child,int zOrder),其中zOrder是指child的z轴顺序,也就是显示的先后顺序,其值越大,表示显示的位置就越靠前

2.setPosition方法用来设置游戏元素的位置。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...