cocos2d-x 2.2建立项目node
进入cocos2d-x-2.2/tools/project-creator,运行命令python
python create_project.py -project MyGame -package com.MyCompany.AwesomeGame -language cpplinux
便可在cocos2d-x-2.2/projects下生成空白项目,进入项目中查看文件结构,主要有Class文件夹,存放源文件,Resources文件夹存放游戏中须要的图片、音频和配置等资源文件,还有为各平台生成的proj文件夹。空项目建立后便可编译运行,win平台直接使用vs从proj.win32打开项目并引入依赖,F5运行。linux平台进入proj.linux,直接bash build.sh编译,而后进入生成的bin/debug或bin/release目录下运行可执行文件。bash
进入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的初始化app
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目录下。ide
cocos2d-x的渲染树架构动画
任何可见的游戏元素都派生自Cocos2d-x节点(CCNode),常见的游戏元素有场景(CCScene)、层(CCLayer)和精灵(CCSprite)等。一般游戏按照场景、层、精灵的层次顺序组织。ui
动做(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,实现了访问器方法。 |
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