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 / ); // 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/ ,
origin.y + pCloseItem->getContentSize().height/)); CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu, ); // 创建一个label
CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", ); pLabel->setPosition(ccp(origin.x + visibleSize.width/,
origin.y + visibleSize.height - pLabel->getContentSize().height)); this->addChild(pLabel, ); CCSprite* pSprite = CCSprite::create("HelloWorld.png"); pSprite->setPosition(ccp(visibleSize.width/ + origin.x, visibleSize.height/ + origin.y)); this->addChild(pSprite, ); 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,实现了访问器方法。 |
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
cocod2d-x 之 HelloWorld的更多相关文章
- 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&引用jquery来实现alert
使用webstorm+webpack构建简单入门级"HelloWorld"的应用&&构建使用jquery来实现 1.首先你自己把webstorm安装完成. 请参考这 ...
- Idea下用SBT搭建Spark Helloworld
没用过IDEA工具,听说跟Eclipse差不多,sbt在Idea其实就等于maven在Eclipse.Spark运行在JVM中,所以要在Idea下运行spark,就先要安装JDK 1.8+ 然后加入S ...
- 菜鸟学Struts2——HelloWorld
写在前面 自从工作后就过上了只有一个月记忆的生活,太健忘,很多学过的东西因为用得少便忘记了,第二次学习struts,为了以后便于查阅,开始自己的博客之旅.Struts的学习还是从Hello World ...
- 初识AngularJS 之 HelloWorld和数据绑定
1.Hello World 我用的开发工具是 atom ,大家有需要的话可以找我要安装包嘻嘻 第一步: 写入以下代码: <!DOCTYPE html> <html ng-ap ...
- java环境搭建和写出一个Helloworld
一.安装环境和配置环境变量(必要环节) 安装java并配置环境变量 :在"系统变量"中设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击 ...
- Delphi_01_控制台版HelloWorld
对于Windows下的控制台编程,我相信很多人都不陌生.而C语言开始的著名的“Hello world”程序基本是学习编程的第一步.我想对于 RAD开发,大家熟悉的一般都是GUI编程,而对于consol ...
- Quartz —— 从 HelloWorld 开始
1.Quartz 是用来完成任务调度的. 2.Quartz 的三个核心概念:调度器.任务.触发器. (1)Job:通过实现该接口来定义需要执行的任务. public interface Job { / ...
- 转载文章——从HelloWorld学习操作系统
转载地址:https://my.oschina.net/hosee/blog/673628?p=%7b%7bcurrentPage+1%7d%7d 本文就将系统性的串联起那些知识点,方便复习和回顾.本 ...
- AngularJS 系列 01 - HelloWorld和数据绑定
目录导读: AngularJS 系列 学习笔记 目录篇 前言: 好记性不如烂键盘,随笔就是随手笔记,希望以后有用. 本篇目录: 1. Hello World 2. AngularJS中的数据绑定 3. ...
- iOS系列 基础篇 01 构建HelloWorld,剖析并真机测试
iOS基础 01 构建HelloWorld,剖析并真机测试 前言: 从控制台输出HelloWorld是我们学习各种语言的第一步,也是我们人生中非常重要的一步. 多年之后,我希望我们仍能怀有学习上进的心 ...
随机推荐
- Ethernet & IEEE 802.3 802.X 802.1ag-MEP
ISO/IEC 7498标准,它定义了网络互联的7层框架,也就是开放式系统互连参考模型(OSI模型). 交换机好比是邻近的街道,而路由器则是街道的交汇点. (交换机第二层,即数据链路层,也有四层,七层 ...
- ADO数据库链接
一.数据库操作准备 // --------------------------------------------------------------------------------------- ...
- wine on ubuntu linux, and source insight 绿色版的安装
1.安装一些必要组件 winetricks msxml3 gdiplus riched20 riched30 vcrun6 vcrun2005sp1 wenquanyi 2.拷贝字体 下载网盘中的字体 ...
- SharePoint 2013的100个新功能之网站管理(二)
一:SharePoint 2013的网站策略 网站策略指的是自动关闭或删除网站的条件.有四个选项:不自动关闭或删除网站.自动删除网站.自动关闭并删除网站和运行一个工作流来关闭.删除网站. 二:新的主题 ...
- 某外企mono for android试题
Hitcents C#Programming Test This test is designed to evaluate generalC# and Xamarin development skil ...
- oracle REPLACE 函数 介绍
oracle REPLACE 函数是用另外一个值来替代串中的某个值. 例如,可以用一个匹配数字来替代字母的每一次出现.REPLACE 的格式如下所示: REPLACE ( char, search_s ...
- xen credit scheduler and policy
最近在研究xen的vcpu 调度和cpu qos策略,现在默认的scheduler是credit, 对应的代码是sched_credit.c xen支持好几种控制策略,效果最好的当选pin, 灵活性最 ...
- UltraISO对光盘镜像的常用操作
UltraISO,它能直接编辑光盘映像或者从光盘映像文件里面提取文件:可以从CD-ROM里面制作光盘映像:也可以把硬盘上的文件制作成ISO文件:可以把ISO中启动信息保存下来,也可以为ISO添加启动功 ...
- DELPHI 重命名文件名时 文件存在自动重命名
procedure TForm1.Button1Click(Sender: TObject); var Dir, FileTitle, FileExt: string; s,s1: str ...
- python 3Des 加密
import hashlib; from Crypto.Cipher import DES3 import base64 def create_key(sk): r=hashlib.md5(sk).d ...