zoukankan      html  css  js  c++  java
  • cocod2d-x 之 HelloWorld

      cocos2d-x 2.2创建项目

      进入cocos2d-x-2.2/tools/project-creator,运行命令

      python create_project.py -project MyGame -package com.MyCompany.AwesomeGame -language cpp

      即可在cocos2d-x-2.2/projects下生成空白项目,进入项目中查看文件结构,主要有Class文件夹,存放源文件,Resources文件夹存放游戏中需要的图片、音频和配置等资源文件,还有为各平台生成的proj文件夹。空项目创建后即可编译运行,win平台直接使用vs从proj.win32打开项目并引入依赖,F5运行。linux平台进入proj.linux,直接bash build.sh编译,然后进入生成的bin/debug或bin/release目录下运行可执行文件。

      进入Class目录查看框架生成的文件,包括HelloWorldScene和AppDelegate,AppDelegate中主要包含3个方法:项目的初始化bool applicationDidFinishLaunching(), 项目进入后台时的处理方法 void applicationDidEnterBackground(), 项目恢复到前台时的处理方法 void applicationWillEnterForeground()。项目在前后台切换时一般都是停止/恢复所有的精灵动作、背景音乐、特效音乐等。applicationDidFinishLaunching方法

    bool AppDelegate::applicationDidFinishLaunching() {
        // initialize director
        //初始化游戏引擎控制器CCDirector,以便启动游戏引擎
        CCDirector* pDirector = CCDirector::sharedDirector(); 
        CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
      
        pDirector->setOpenGLView(pEGLView);
            
        // turn on display FPS
        //启用FPS显示
        pDirector->setDisplayStats(true);
      
        // set FPS. the default value is 1.0/60 if you don't call this
        //设置绘制间隔,默认每秒60帧
        pDirector->setAnimationInterval(1.0 / 60);
      
        // create a scene. it's an autorelease object
        //创建场景
        CCScene *pScene = HelloWorld::scene();
        // run
        //运行
        pDirector->runWithScene(pScene);
    
        return true;
    }

      HelloWorldScene的初始化

    CCScene* HelloWorld::scene()
    {
        CCScene *scene = CCScene::create();
        HelloWorld *layer = HelloWorld::create();
        scene->addChild(layer);
        return scene;
    }
    
    // 初始化
    bool HelloWorld::init()
    {
        // 1. super init first
        if ( !CCLayer::init() )
        {
            return false;
        }
        
        CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
        CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
    
        // 添加关闭按钮,位置为屏幕左下方
        CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                            "CloseNormal.png",
                                            "CloseSelected.png",
                                            this,
                                            menu_selector(HelloWorld::menuCloseCallback));
        
        pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
                                    origin.y + pCloseItem->getContentSize().height/2));
    
        CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
        pMenu->setPosition(CCPointZero);
        this->addChild(pMenu, 1);
    
        // 创建一个label
        CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);
        
        pLabel->setPosition(ccp(origin.x + visibleSize.width/2,
                                origin.y + visibleSize.height - pLabel->getContentSize().height));
    
        this->addChild(pLabel, 1);
    
        CCSprite* pSprite = CCSprite::create("HelloWorld.png");
    
        pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
    
        this->addChild(pSprite, 0);
        
        return true;
    }

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

      cocos2d-x没有API文档,但是自带了很多demo,就在cocos2d-x-2.2/samples目录下。

      cocos2d-x的渲染树架构

      任何可见的游戏元素都派生自Cocos2d-x节点(CCNode),常见的游戏元素有场景(CCScene)、层(CCLayer)和精灵(CCSprite)等。通常游戏按照场景、层、精灵的层次顺序组织。

      动作(action)作用于游戏元素,可以使游戏元素运动起来。常见的动作有移动、转动、闪烁、消失等。动作分为持续性动作与瞬时动作,持续性动作在一段时间内连续完成,瞬时动作会瞬间完成。在Cocos2d-x中,动作由CCAction类实现,由CCAction类派生出持续性动作类CCAction Interval和瞬时动作类CCActionInstant。所有的动作都派生自以上两个类之一。

      动画(animation)是一种特殊的持续性动作,它只能应用于精灵上,用于实现帧动画效果。静止的图片叫做帧(frame),帧的序列代表一个动画效果。

      命名空间与类名称

      Cocos2d-x拥有一个包含其他所有头文件的文件"cocos2d.h"。通常,我们只需要在使用时包含这个头文件,就可以使用引擎的全部功能了。如要使用扩展类,还需要包含"cocos2d-ext.h"。可使用引擎提供的一个宏USING_NS_CC来引用cocos2d命名空间。

      Cocos2d-x不使用传统的值类型,所有的对象都创建在堆上,然后通过指针引用。创建Cocos2d-x对象通常有两种方法:第一种是首先使用new操作符创造一个未初始化的对象,然后调用init系列方法来初始化;第二种是使用静态的工厂方法直接创建一个对象。

    CCSprite* sprite1 = new CCSprite();
    sprite1->initWithFile("HelloWorld.png");
    CCSprite* sprite2 = CCSprite::spriteWithFile("HelloWorld.png");
    CCSprite* sprite3 = CCSprite::create("HelloWorld.png");

      

      选择器

    schedule_selector(SELECTOR)
    callfunc_selector(SELECTOR)
    callfuncN_selector(SELECTOR)
    callfuncND_selector(SELECTOR)
    callfunc_selector(SELECTOR)
    menu_selector(SELECTOR)
    event_selector(SELECTOR)
    compare_selector(SELECTOR)

      属性和宏

      为每一个属性编写一个或两个访问器方法是一项十分枯燥的任务,为了避免重复性的工作,Cocos2d-x提供了一系列宏来帮助我们方便地创建属性,它们定义在引擎目录中的"cocos2d/platform/CCPlatformMacros.h"中。

    描述
    CC_PROPERTY

    定义一个属性及其访问器,没有实现。
    通常用于简单的值类型

    CC_PROPERTY_READONLY 定义一个属性,只包含get访问器,没有实现
    CC_PROPERTY_PASS_BY_REF

    定义一个属性,访问器使用引用类型传
    递参数,没有实现。通常用于结构体类型

    CC_PROPERTY_READONLY_PASS_BY_REF

    定义一个属性,只包含get访问器,
    且使用引用类型传递参数,没有实现

    CC_SYNTHESIZE 同CC_PROPERTY,实现了访问器方法
    CC_SYNTHESIZE_READONLY 同CC_PROPERTY_READONLY,实现了访问器方法
    CC_SYNTHESIZE_READONLY_PASS_BY_REF

    同CC_PROPERTY_READONLY_PASS_BY_REF,
     实现了访问器方法

    CC_SYNTHESIZE_RETAIN

    同CC_PROPERTY,实现了访问器方法。
    用于派生自CCObject的类型,访问器采取
    Cocos2d-x的内存管理机制自动维护
    对象的引用计数

      CCPlatformMacros.h中宏源码

    #define CREATE_FUNC(__TYPE__) 
    static __TYPE__* create() 
    { 
        __TYPE__ *pRet = new __TYPE__(); 
        if (pRet && pRet->init()) 
        { 
            pRet->autorelease(); 
            return pRet; 
        } 
        else 
        { 
            delete pRet; 
            pRet = NULL; 
            return NULL; 
        } 
    }
    
    #define NODE_FUNC(__TYPE__) 
    CC_DEPRECATED_ATTRIBUTE static __TYPE__* node() 
    { 
        __TYPE__ *pRet = new __TYPE__(); 
        if (pRet && pRet->init()) 
        { 
            pRet->autorelease(); 
            return pRet; 
        } 
        else 
        { 
            delete pRet; 
            pRet = NULL; 
            return NULL; 
        } 
    }
    
    #define CC_PROPERTY_READONLY(varType, varName, funName)
    protected: varType varName;
    public: virtual varType get##funName(void);
    
    #define CC_PROPERTY_READONLY_PASS_BY_REF(varType, varName, funName)
    protected: varType varName;
    public: virtual const varType& get##funName(void);
    
    #define CC_PROPERTY(varType, varName, funName)
    protected: varType varName;
    public: virtual varType get##funName(void);
    public: virtual void set##funName(varType var);
    
    #define CC_PROPERTY_PASS_BY_REF(varType, varName, funName)
    protected: varType varName;
    public: virtual const varType& get##funName(void);
    public: virtual void set##funName(const varType& var);
    
    #define CC_SYNTHESIZE_READONLY(varType, varName, funName)
    protected: varType varName;
    public: virtual varType get##funName(void) const { return varName; }
    
    #define CC_SYNTHESIZE_READONLY_PASS_BY_REF(varType, varName, funName)
    protected: varType varName;
    public: virtual const varType& get##funName(void) const { return varName; }
    
    #define CC_SYNTHESIZE(varType, varName, funName)
    protected: varType varName;
    public: virtual varType get##funName(void) const { return varName; }
    public: virtual void set##funName(varType var){ varName = var; }
    
    #define CC_SYNTHESIZE_PASS_BY_REF(varType, varName, funName)
    protected: varType varName;
    public: virtual const varType& get##funName(void) const { return varName; }
    public: virtual void set##funName(const varType& var){ varName = var; }
    
    #define CC_SYNTHESIZE_RETAIN(varType, varName, funName)    
    private: varType varName; 
    public: virtual varType get##funName(void) const { return varName; } 
    public: virtual void set##funName(varType var)   
    { 
        if (varName != var) 
        { 
            CC_SAFE_RETAIN(var); 
            CC_SAFE_RELEASE(varName); 
            varName = var; 
        } 
    } 
    
    #define CC_SAFE_DELETE(p)            do { if(p) { delete (p); (p) = 0; } } while(0)
    #define CC_SAFE_DELETE_ARRAY(p)     do { if(p) { delete[] (p); (p) = 0; } } while(0)
    #define CC_SAFE_FREE(p)                do { if(p) { free(p); (p) = 0; } } while(0)
    #define CC_SAFE_RELEASE(p)            do { if(p) { (p)->release(); } } while(0)
    #define CC_SAFE_RELEASE_NULL(p)        do { if(p) { (p)->release(); (p) = 0; } } while(0)
    #define CC_SAFE_RETAIN(p)            do { if(p) { (p)->retain(); } } while(0)
    #define CC_BREAK_IF(cond)            if(cond) break
    
    #define __CCLOGWITHFUNCTION(s, ...) 
        CCLog("%s : %s",__FUNCTION__, CCString::createWithFormat(s, ##__VA_ARGS__)->getCString())
    
    // cocos2d debug
    #if !defined(COCOS2D_DEBUG) || COCOS2D_DEBUG == 0
    #define CCLOG(...)       do {} while (0)
    #define CCLOGINFO(...)   do {} while (0)
    #define CCLOGERROR(...)  do {} while (0)
    #define CCLOGWARN(...)   do {} while (0)
    
    #elif COCOS2D_DEBUG == 1
    #define CCLOG(format, ...)      cocos2d::CCLog(format, ##__VA_ARGS__)
    #define CCLOGERROR(format,...)  cocos2d::CCLog(format, ##__VA_ARGS__)
    #define CCLOGINFO(format,...)   do {} while (0)
    #define CCLOGWARN(...) __CCLOGWITHFUNCTION(__VA_ARGS__)
    
    #elif COCOS2D_DEBUG > 1
    #define CCLOG(format, ...)      cocos2d::CCLog(format, ##__VA_ARGS__)
    #define CCLOGERROR(format,...)  cocos2d::CCLog(format, ##__VA_ARGS__)
    #define CCLOGINFO(format,...)   cocos2d::CCLog(format, ##__VA_ARGS__)
    #define CCLOGWARN(...) __CCLOGWITHFUNCTION(__VA_ARGS__)
    #endif // COCOS2D_DEBUG
    View Code
  • 相关阅读:
    Qt之QLabel
    在Servlet中使用spring注入的bean
    Matlab中图片保存的5种方法
    LATEX中优化问题如何排列Max——s.t.格式
    Latex 初学者入门(四)-- 多个作者共享同一个地址
    一份不太简短的LaTeX教程 lshort – A short in­tro­duc­tion to LATEX 2elshort – A short in­tro­duc­tion to LATEX 2e
    LaTeX技巧:LaTeX括号总结
    Bibtex使用方法
    Latex初学者入门(三)-- 用BibTeX生成参考文献
    LaTeX之参考文献的写法
  • 原文地址:https://www.cnblogs.com/waimai/p/3784132.html
Copyright © 2011-2022 走看看