(4)Cocos2d-x的Helloworld项目工程架构解析

大笑 国际惯例,打个小广告,新手cocos2dx游戏开发学习群: 131430516,欢迎各位一起加入讨论交流,本人QQ692187014

一.基础知识:C++的类

     可能大多数写java的童鞋会很头疼,因为C++类写在两个文件里,一个是.h文件是类的声明,而.cpp文件则是类的定义。在.h头文件里声明类和类的各个方法,然后在.cpp源文件中再定义它的实现方式。个人就把他们理解成是目录和文章的关系。


二.工程架构

     (一)在文件夹中cocos2dx 的文件结构

             

           Class:Cocos2d-x的C++类文件,游戏的入口类为AppDelegate.cpp ,其余文件根据项目情况安排。

           Debug.win32:包括编译生成的OBJ文件、编译日志文件等

           Resoures:资源文件夹,放置声音、图片等文件。

           win32:win32平台的入口文件main.cpp等。

       (题外话:在这里大家可能看到了有两个入口cpp,一个是AppDelegate.cpp,另一个是main.cpp,我可以很负责的告诉大家C++所有的工程都是从main开始启动的,在cocos2d-x中,main.cpp是整个程序窗口的启动类,而AppDelegate.cpp则是Cocos2d-x项目的入口类。)

 

       (二)在VS开发工具中cocos2dx的架构

             

在2.1.3版本的工程中新建一个项目会包含以上几个文件夹,下面简单的说下这几个文件夹里分别是存放什么样的文件

    1.include文件夹:主要存放类的头文件(.h文件)

    2.resource文件夹:主要存放项目的资源文件,如声音、图片等

    3.source文件夹:主要存放类的源文件(.cpp文件)

    4.外部依赖项:编译时会用到的外部加载的类的头文件,这里存放的大部分都是cocos2d-x引擎自带的头文件(在创建的时候自动加载了,不需要手动添加)



三.项目中部分代码讲解

      1.main

    /*main.cpp*/
    // 创建应用程序实例
    AppDelegate app;
    CCEGLView* eglView = CCEGLView::sharedOpenGLView();
    eglView->setFrameSize(480, 320);	//设置程序屏幕的大小
    eglView->setViewName("MyCocos2d-x");    //这句在cocos2d-x中默认项目中是没有的,用途在于设置窗口的名字,eglView是CCEGLView类的指针,指针->函数,表示调用CCEGLView类的setViewName方法。
    int ret = CCApplication::sharedApplication()->run();

      2.AppDelegate

/*AppDelegate.cpp*/     
bool AppDelegate::applicationDidFinishLaunching()
{
    //初始化导演类
    CCDirector *pDirector = CCDirector::sharedDirector();
    pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());

    // 设置是否显示帧数,true为显示,false为不显示
    pDirector->setDisplayStats(true);

    // 设置帧数。默认值是1.0/60
    pDirector->setAnimationInterval(1.0 / 60);

    // 创建一个场景。这是一个生成自动释放对象,pScene指向了HelloWorld场景,在屏幕中会从HelloWorld的场景开始
    CCScene *pScene = HelloWorld::scene();

    // 运行
    pDirector->runWithScene(pScene);
    return true;
}

   3.HelloWorldScene

#include "HelloWorldScene.h"  //包含HelloWorldScene.h头文件,在C++项目中,cpp要用到的类都必须在开始的时候include

using namespace cocos2d;      //使用cocos2d的命名空间,漏了这一句的话,之后很多cocos2d中的变量都会提示你未定义或找不到对象

CCScene* HelloWorld::scene()     //定义一个HelloWorld指针指向scene方法
{
    CCScene * scene = NULL;   	//先把场景scene设为null
    do 
    {
        // 创建一个场景,场景是自动释放资源的对象
        scene = CCScene::create();
        CC_BREAK_IF(! scene);

        // 创建HelloWorld层,并将其传给layer指针,层是自动释放资源的对象
        HelloWorld *layer = HelloWorld::create();
        CC_BREAK_IF(! layer);

        // 将HelloWorld层加入场景scene中,在cocos2dx中使用addChild方法
        scene->addChild(layer);
    } while (0);

    // return the scene
    return scene;
}

// CCLayer类的init函数在创建布景层时被调用
bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        //
        // super init first
        //

        CC_BREAK_IF(! CCLayer::init());

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

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

        // 创建一个关闭按钮
        CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
            "CloseNormal.png",	//正常状态的图片
            "CloseSelected.png",   //按下时的图片
            this,
            menu_selector(HelloWorld::menuCloseCallback));
        CC_BREAK_IF(! pCloseItem);

        // 设置按钮pCloseItem的坐标,并用导演类的shareDirector方法获得屏幕的宽,若要获得高则,CCDirector::sharedDirector()->getWinSize().height
        pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));

        // 创建一个菜单类的指针,并把关闭按钮放进菜单中
        CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
        pMenu->setPosition(CCPointZero); 	//菜单的坐标为原点
        CC_BREAK_IF(! pMenu);

        // 将菜单加入到HelloWorld层容器中,并置于第一层中,层越大则在屏幕中越慢绘制
        this->addChild(pMenu, 1);	


        //创建一个文字标签,“显示的字符,字体,字号”
        CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);
        CC_BREAK_IF(! pLabel);

        // 设置文字标签的坐标
        CCSize size = CCDirector::sharedDirector()->getWinSize();
        pLabel->setPosition(ccp(size.width / 2, size.height - 50));

        // 将文字坐标加入到HelloWorld层中
        this->addChild(pLabel, 1);

        // 定义一个精灵用于显示HelloWorld.png图片
        CCSprite* pSprite = CCSprite::create("HelloWorld.png");
        CC_BREAK_IF(! pSprite);

        // 设置精灵的位置,位置都是用cpp(x,y)表示的,如果设置为原点可以CCPointZero
        pSprite->setPosition(ccp(size.width/2, size.height/2));

        // 将精灵加入到HelloWorld层中,并处于第0层的位置,比文字标签要低层,所以先绘制,也就是说文字会在这张图片的上面.
        this->addChild(pSprite, 0);

        bRet = true;
    } while (0);

    return bRet;
}

/*事件响应函数*/
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    // 按下了关闭按钮后,程序退出
    CCDirector::sharedDirector()->end();
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值