上一章(http://www.jb51.cc/article/p-veeasfti-ho.html)中我们讲解了mac下的cocos2dx环境的搭建,并且创建了helloworld项目,这一章我们就来解读这个helloworld项目。

1.用xcode打开我们的项目,会得到如下图的目录结构:

在这里我们重点关注mac目录和classes目录,打开了一个mac项目,我们第一反应肯定是去看mac下的目录:

mac目录下有两个代码文件,我们看到main.cpp就知道,这是项目的入口处了。

2.main.cpp文件的解读:

打开main.cpp,我们可以看到main.cpp的源码如下:

/****************************************************************************
 copyright (c) 2010 cocos2d-x.org
 
 http://www.cocos2d-x.org
 
 Permission is hereby granted,free of charge,to any person obtaining a copy
 of this software and associated documentation files (the "Software"),to deal
 in the Software without restriction,including without limitation the rights
 to use,copy,modify,merge,publish,distribute,sublicense,and/or sell
 copies of the Software,and to permit persons to whom the Software is
 furnished to do so,subject to the following conditions:
 
 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.
 
 THE SOFTWARE IS PROVIDED "AS IS",WITHOUT WARRANTY OF ANY KIND,EXPRESS OR
 IMPLIED,INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,fitness FOR A PARTIculaR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR copYRIGHT HOLDERS BE LIABLE FOR ANY CLaim,damAGES OR OTHER
 LIABILITY,WHETHER IN AN ACTION OF CONTRACT,TORT OR OTHERWISE,ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 ****************************************************************************/

#include "AppDelegate.h"
#include "cocos2d.h"

USING_NS_CC;

int main(int argc,char *argv[])
{
    AppDelegate app;
    return Application::getInstance()->run();
}

可以看出main函数是构建了appdelegate项目并运行它,在classes目录下我们可以找到这个文件(进过查找资料,我们可以知道自定义的项目源码放在classes目录)。

为了对代码了解,我会在代码上书写注释,这样就好了。

3.AppDelegate.cpp源码解析:

#include "AppDelegate.h" //引入头文件
#include "HelloWorldScene.h" //引入helloworldsecene的文件,该类主要是创建场景和层的将在下一步讲解该类

USING_NS_CC; //定义命名空间为cocos2d,这样引用类和方法时比较方便,其源码为:#define USING_NS_CC                     using namespace cocos2d

AppDelegate::AppDelegate() {

}

AppDelegate::~AppDelegate() 
{
}

bool AppDelegate::applicationDidFinishLaunching() {//应用开始时所做的工作
    // initialize director
    auto director = Director::getInstance(); //创建一个导演,关于导演,场景,层和精灵的关系将在文章最后讲到
    auto glview = director->getopenGLView();//该导演打开了gl的端口
    if(!glview) {
        glview = GLView::create("My Game"); //创建为  my game
        director->setopenGLView(glview); //将创建的设置进去
    }

    // turn on display FPS
    director->setdisplayStats(true);//true显示fps

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);//每秒显示的fps数

    // create a scene. it's an autorelease object
    auto scene = HelloWorld::createScene();//得到场景,该场景是从helloworld中创建的

    // run
    director->runWithScene(scene);//运行这个场景

    return true;
}

// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
void AppDelegate::applicationDidEnterBackground() {//应用在后台运行时所做的工作
    Director::getInstance()->stopAnimation();

    // if you use SimpleAudioEngine,it must be pause
    // SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground() {//应用被唤醒时所做的工作
    Director::getInstance()->startAnimation();

    // if you use SimpleAudioEngine,it must resume here
    // SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
}

4.HelloWorldScene.cpp文件的解析:
#include "HelloWorldScene.h"

USING_NS_CC;//定义命名空间为cocos2d,这样引用类和方法时比较方便,其源码为:#define USING_NS_CC                     using namespace cocos2d

Scene* HelloWorld::createScene()//创建场景的方法
{
    // 'scene' is an autorelease object
    auto scene = Scene::create(); //创建场景

    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();//创建层,由头文件:class HelloWorld : public cocos2d::Layer可以看出该类自己就是一个层

    // add layer as a child to scene
    scene->addChild(layer);//将层加入到场景中

    // return the scene
    return scene;//返回场景
}

// on "init" you need to initialize your instance
bool HelloWorld::init()//init方法系统会自动去调用
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    /////////////////////////////
    // 2. add a menu item with "X" image,which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    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);

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

    // add a label shows "Hello World"
    // create and initialize a label
    
    auto label = LabelTTF::create("Hello World","Arial",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);

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


void HelloWorld::menuCloseCallback(Ref* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
	MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
    return;
#endif

    Director::getInstance()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}
源码先简单的解析到这里,下面来阐述导演,场景,层和精灵的关系,阐述完后我们在下一章中自己定义场景的时候就可以很好的理解了。

5.导演,场景,层与精灵的阐述:

游戏和戏剧的区别就是游戏里你是半个编剧而戏剧里你只是一个观众,游戏你可以参与,戏剧你只能观看。何为半个编剧,即是你能够按照已经设定好的规则来指挥演员来演出。

游戏里的导演和戏剧的导演一样,就是按照剧本来指挥演员等元素来呈现一个画面,音乐等。我们以演出《雷雨》为例。

导演就是根据《雷雨》的剧本来导出所有的视觉听觉等五官效果。

场景就是《雷雨》里某一幕,拿侍萍控诉周朴园来说,这一幕就是一个场景。

层就是场景里的3维关系,在这里,天空乌云密布,天空为一层,院子里花草摇曳,院子为一层,大厅里侍萍控诉周朴园,大厅为一层,这些层组成了一幕。

精灵就是演员了,之所以称为精灵是因为这些演员不全是人。在天空这一层,乌云是精灵,他们有动作,有形态。在院子里花,草,树木都是精灵,它们也有各自的动作和形态。大厅里侍萍和周朴园也是精灵。

由此可以看出,我们写游戏的时候不妨把自己看成一个拿着半个剧本在拍戏的剧作人。下一章我们将创建自己的场景并运行它。

cocos2dx解析helloworld项目源码的更多相关文章

  1. HTML实现代码雨源码及效果示例

    这篇文章主要介绍了HTML实现代码雨源码及效果示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. 源码推荐:简化Swift编写的iOS动画,iOS Material Design库

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  3. swift皮筋弹动发射飞机ios源码

    这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧。

  4. [翻译]Swift编程语言——造型

    Swift的造型通过is和as操作符实现。类似的,itemisSong检查当前内容是否是一个Song实例。)在每次循环中检查向下造型的做法是合适的:例子一开始是这将当前的item向下造型为Movie。对Any和AnyObject造型Swift提供了两个特殊的类型别称表示没有指定的类型:AnyObject可以表示任意类的实例。这是因为OC语言没有明确类型的数组。可以在switch的case语句中使用is和as操作符,从仅仅已知为Any或者AnyObject类型的常量或者变量中发现特定的类型。

  5. swift 写的app 源码,保存一下下

    http://www.topthink.com/topic/3345.htmlhttp://www.csdn.net/article/2015-01-09/2823502-swift-open-source-libs

  6. swift 源码网站 code4app

    http://code4app.com/ios/HTHorizontalSelectionList/54cb2c94933bf0883a8b4583http://123.th7.cn/code/DMPagerViewController_2522.html

  7. OpenStack Swift源码导读:业务整体架构和Proxy进程

    OpenStack的源码分析在网上已经非常多了,针对各个部分的解读亦是非常详尽。其中proxy是前端的业务接入进程。account、container和object目录分别是账户、容器和对象的业务处理逻辑进程。各个业务进程或模块之间的逻辑关系可以参考《OpenstackSwift简介》文中的架构图。在《OpenstackSwift简介》从理论上面介绍了具体的节点寻找过程。

  8. 源码推荐(7.21):顶部滑动菜单FDSlideBar,Swift版无限循环轮播图

    顶部滑动菜单FDSlideBarFDSlideBar是一个顶部滑动菜单,如常见的网易、腾讯新闻等样式。菜单间切换流畅,具有较好的体验性。测试环境:Xcode6.2,iOS6.0以上Swift版无限循环轮播图无限循环轮播图片点击代理可设置图片Url的数组Url和本地图片混合轮播测试环境:Xcode6.2,iOS7.0以上弹幕系统实现--QHDanumuDemo说明:QHDanmu文件夹下是主要的弹幕模块系统,QHDanmuSend文件夹下是简单的发射弹幕的界面。

  9. openstack swift和wsgi源码分析1 HTTP请求处理过程

    分析proxy-server代理服务的执行流程,其他的三个主要服务accountserver,containerserver,objectserver执行过程通proxyserver类似。入口函数调用run_wsgi,此函数完成以下工作:下面重点研究下process_request函数是如何把消息转化为HTTP的request对象这一过程。process_request函数,生成HttpProtocol对象,并执行init操作,注意,HttpProtocol对象自身没有init函数,所以会调用父类的父类的

  10. fir.im Weekly - 进击的 Swift

    最近Swift开源了,众开发者们欢呼雀跃。本期fir.imWeekly准备了一些关于Swift的“新鲜”干货分享,也包括一些优秀的GitHub源码、开发工具和技术文章等等。同时,苹果启用了新的官网:Swift.org,Swift的GitHub主页:https://github.com/apple/swiftSwift3API设计准则勤快的@星夜暮晨翻译了苹果Swift官方网站博客的一篇文章:Swift3APIDesignGuidelines,了解Swift3特性,希望对你有所帮助。如何在iOS中实现一个可

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部