cocos2d-x高级学习

弱联网开发技术: 

libcurl

添加lib文件:libcurl_imp.lib  pthreadVCE2.lib

添加头文件:#include"curl/curl.h"

curl_global_init(CURL_GLOBAL_ALL);//初始化

  curl_global_cleanup();//结束执行

简单接口:easy interface  单线程会引起阻塞

//设定请求的网络地址

//向服务器读数据

CURL *easy_handle=curl_easy_init();
curl_easy_setopt(easy_handle,CURLOPT_URL,"http:://www.baidu.com");

curl_easy_setopt(easy_handle,CURLOPT_WRITEFUNCTION,write_data);//回调函数,请求的数据都会被放到write_data函数里面
//curl_easy_setopt(easy_handle,CURLOPT_WRITEDATA,&internal_struct);
CURLcode success =curl_easy_perform(easy_handle);//返回0执行成功

curl_easy_cleanup(easy_handle1);

//高级2

                        //指定上传

                      //指定上传大小

//easy handle回到原生状态

curl_easy_setopt(easy_handle,CURLOPT_HTTPGET,1L);

 多接口:muti interface   多线程不会引起阻塞

封装成Http请求:

CCHttpRequest *request=new CCHttpRequest();
request->setUrl("http://www.baidu.com");
request->setRequestType(CCHttpRequest::kHttpGet);
request->setResponseCallback(this,callfuncND_selector(HelloWorld::onHttpRequestCompleted));
request->setTag("GET test1");
CCHttpClient::getInstance()->send(request);
request->release();

多线程开发技术: pthread跨平台库  视频5

static void *thread_1(void *data)
{
CURL *easy_handle=curl_easy_init();
curl_easy_setopt(easy_handle,CURLOPT_URL,"http://www.baidu.com");

curl_easy_setopt(easy_handle,CURLOPT_WRITEFUNCTION,write_data);//call back
FILE *file;
curl_easy_setopt(easy_handle,CURLOPT_WRITEDATA,&file);

CURLcode success =curl_easy_perform(easy_handle);
if (success==CURLE_OK)
{

}

return ((void *)1);
}

互斥量:pthread_mutex_t  count_lock;

死锁:

条件变量:pthread_cond_t count_nonzero;

pthread_create(&tid,NULL,thread_1,NULL);
void * returnVoid;
pthread_join(tid,&returnVoid);//wait thread end 等待线程结束,未结束之前下面的代码不执行

线程属性:pthread_attr_t:是否绑定,是否分离,堆栈地址,堆栈大小,优先级,

//PTHREAD_SCOPE_SYSTEM 绑定,  PTHREAD_SCOPE_PROCESS非绑定

   线程属性初始化:pthread_attr_setscope(&atr,PTHREAD_SCOPE_SYSTEM);

为精灵添加事件:

通知事件:
A发送通知,B修改状态

输入框:
CCTextFieldTTF
CCTMEDelegate 针对输入法的操作
CCTextFieldDelegate 操作TextField外观和动画的

cocos2d-x几何图形绘制: 关键函数draw()

程序进入到一个节点的时候,会执行节点的onEnter()函数

cocos2d-x 动作行为:
动作与动作执行函数:CCAction * runAction(CCAction *action);
动作类型:瞬时动作

CCActionInstant
CCPlace 让节点到一个位置
CCHide/CCShow 隐藏和显示
CCToggleVisiility 也是显示和隐藏,只是相对的修改当前的状态
CCFlipX/CCFlipY 翻转 对XY轴镜像
延时动作
CCActionInterval
CCMoveTo/CCMoveBy to->移动到,By->根据当前位置移动多少的距离
CCJumpto/CCJumpBy 跳跃
CCBezierTo/CCBezierBy 贝塞尔曲线
CCScaleTo/CCScaleBy 缩放
CCRotateTo/CCRotateBy 旋转
CCBlink 闪烁
CCTintTo/CCTintBy 色调变化
CCFadeTo 变暗到
CCFadeIn 淡出(慢慢显示)
CCFadeOut 渐隐(慢慢隐藏掉)

组合动作
CCSequence 序列
CCSpawn 同步
CCRepeat 重复有限次数
Reverse 反动作
CCRepeatForever 无限重复
CCAnimate 创建帧动画

速度变化
CCEaseIn 由慢变快(速度线性变化)
CCEaseOut 由快至慢
CCEaseInOut 由慢至快再由快至慢
CCEaseSineIn 由慢至快
CCEaseSineInOut 由慢至快再由快至慢
CCEaseExponentialIn 由慢至极快
CCEaseExponentialIn 由极快至慢
CCEaseExponentialInOut 由慢至极快再
CCSpeed 人工设定速度,通过setSpeed不断调整
扩展动作
延时:CCDelayTime
函数调用 //动画执行完调用一个函数接着执行下一个动画
CCCallFunc(无参数函数)
CCCallFuncN(当前对象CCNode)
ActionManager 动作管理器 管理所有的Action

画一个导图:展示所有动作类的类图。

缓存机制:
纹理缓存:
精灵帧缓存:
动画缓存:
TexturePacker图片拼合
CCSprite存储图片-》 CCTexture2D-》CCTextureCache(图片缓存)

实时联网游戏开发技术:更新太快,所以后面再讲
Socket通信技术

数据储存:文件目录管理(CCFileUtils)和文件存取:(CCUserDefaault:轻量级数据)
(FILE)
CCFileUtils:文件管理工具
unsigned char * getFileData(const char * pszFileName,const char *PszMode,unsigned long *pSize)
getFileDataFromZip(...)
fullPathFromRelativePath(...)
fullPathFromRelativeFile(...)
setResourceDirectory(...)
getResourceDirectory()
getWriteablePath()
文件读取:
CCUserDefault(易于存储配置信息,存储在XML文件当中)

CCUserDefault::sharedUserDefault()->setStringForKey("string", "value1"); CCUserDefault::sharedUserDefault()->setIntegerForKey("我老婆", 小珊珊);
string ret = CCUserDefault::sharedUserDefault()->getStringForKey("string");
string ret = CCUserDefault::sharedUserDefault()->getStringForKey("我老婆");

File
File *fopen(char *path,char *mode);

mode 类型,打开的方式: r,r+,rb+,rw+,w,w+,a,a+,

//从文件读取一个字符。出错或文件尾返回EOF
int fgetc(FILE *stream)
//写入
int fputc(int c,FILE *stram);
fspritf
fclosef


网络数据处理:

xml数据处理的不同方式:
cocos2d-x自带的libxml2
具体代码操作在视频11

ICONV处理中文:
int code_convert(char * from_cahrset,char * to_charset,char *inbuf,char *outbuf,int inlen,int outlen)
{
iconv_t cd;
char **pin=&inbuf;
char **pout=&outbuf;
cd=iconv_open(to_charset,from_charset);
if(cd==0)
return -1;
memset(outbuf,0,outlen);
if(iconv(const char**)pin,(unsigned int *)&inlen,pout,(unsigned int *)&outlen)==-1)
return -1;
iconv_close(cd);
return 0;
}

CCSAXParser 使用:专门用来解析xml文件(陆续读取数据,适合数据量比较大的情况) 边读取边解析
CCSAXParser
static void startElement(void *ctx, const CC_XML_CHAR *name, const CC_XML_CHAR **atts);
static void endElement(void *ctx, const CC_XML_CHAR *name);
static void textHandler(void *ctx, const CC_XML_CHAR *name, int len);

第三方库:tinyxml(网上下载),视频13,将文件添加到项目中

TiXmlDocument *myDocument=new TiXmlDocument();
myDocument->LinkEndChild(...);
myDocument->SaveFile(filePath);

json数据处理的不同方式: 轻量级
http://json.org
[
{"name":"more-top","age":17},
{"name":"android","age":5}
]
第三方库:
JsonCpp http://sourceforge.net/projects/jsoncpp/

//读Json
char *file=(char*) CCFileUtils::sharedFileUtils()->getFileData("testjson.json","r",&size);
Json::Reader reader;
Json::Value root;
if(!reader.parse(std::string(file),root,false))//解析函数
{
return;
}
//Json中一个元素
std::string name=root["name"].asString();
int age=root["age"].asInt();


//Json中多个元素

size =root.size();
for(int i=0;i<size,++i)
{
name=root[i]["name"].asString();
age=root[i]["age"].asInt();
CCLOG("name=%s,age=%d",name.c_str(),age);//输出
}
//写Json

Json::Value root;
Json::FastWriter writer;
Json::Value person;
person["name"]="hello world";
person["age"]=100;
root.append[person];
std::string json_file=writer::write(root);
char filePath[1024]={''};
...
File *file=fopen(filePath,"w+");
fwrite(json_file.c_str(),json_file.size(),1,file);
fclose(file);


libJson 视频14
先下载,再配置
编译时默认是Release版本,所以要改成Debug版本。
方法:找到头文件:JSONOptions.h
#defile JSON_DEBUG //必须打开。如果要发布则关闭
#define JSON_LIBRARY //必须关闭(使用C++版)否则C版

//读取:
char *str=(char*) CCFileUtils::sharedFileUtils()->getFileData("testjson.json","r",&size);

if(libjson::is_valid(str)==false)//判断是否有效的JSon
{
delete str;
str=NULL;
//容错处理
}
JSONNNode rn=libjson::parse(str);
delete str;
int tmp=rn.size();
CCLOG("%d",tmp);
for(int i=0;i<rn[1].size();i++)
{
JSONNode temp=rn[1][i];
for(int j=0;j<temp.size();j++)
{
CCLOG("%s:%s",temp[j].name().c_str(),temp[j].as_string().c_str());
}

}
//写入
JSONNode n(JSON_NODE);
n.push_back(JSONNode(JSONNode("RootA","Value in parent node"));
JSONNode c1(JSON_ARRAY);

加密技术:
什么时候需要加密 防盗版 ,防作弊
那些地方需要加密:资源加密,网络传输,数据存储加密
常见加密方案 MD5(网络请求)(只能加密不能解密) ,BASE64, SHA1(只能加密不能解密)


CCCrypto.h 加密头文件
加密视频17

差异化与本地化的处理方式和游戏的优化技巧

多分辨率的适配方案:
按照分辨率存放资源文件:
CCFileUtils::shareFileUtils()->setResourceDirectory("hd");
//指定缩放因子 等比缩放
pDirector->setContentScaleFactor(resourceSize.heigth/designSize.height);
//非等比缩放
kResolutionNoBorder:超出屏幕部分会被裁剪,两侧没有黑边,图片不变形
kResolutionShowAll:会按原始比例进行缩放,图片不变形
kResolutionExactFit:图片可能会进行拉伸或者压缩处理,铺满屏幕,图片会变形

设计分辨率:DesignResolutionSize
CCEGLView::shareOpenGLView()->setDesignResolutionSize(designSize.width,designSize.height,kResolutionNoBorder);

显示范围:
getVisibleSize:表示可视区域的大小
getVisibleOrigin:表示可视区域的坐标起点

相对位置:在游戏中使用相对位置坐标的好处是显而易见的,这样就不需要为每个分辨率都定义一套坐标了。
首先得定义一些参考点。引擎的TestCpp例子就是提供了一种方法,以屏幕上可是区域的9个点作为参考点,相当于在该矩形内写一个米字,这9个点分别是:左上,左,左下,下,右下,右,右上,上,中心。


针对不同的分辨率加载不同的资源文件

本地化语言方案:
ccLanguageTypes currentLanguageType=CCApplication::shareApplication()->getCurrentLanguage();
typedef enum LanguageType
{
kLanguage

}
资源文件适配
CCFileUtils::shareFileUtils()->setResourceDirectory("hd_zh");//指定资源路径
CCFileUtils::shareFileUtils()->setResourceDirectory("hd_en");
字符串资源适配:

游戏优化技巧:
什么样的内容会影响效率和内存等
cocos2d-x可以进行哪些优化
引擎底层优化:


纹理优化:
二的幂次方(拼图) 480*320->512*512
色深优化 (格式转换)
A8R8G8B8(32bit) A1R5G5B5(16bit) ARGB4444 (透明图片需要R通道)
RGB888 RGB565 (非可透明图片)
纹理压缩格式
IOS设备用的是PowerVR显示芯片,而PVR格式(A1R5G5B5(16bit))可以被显示芯片直接读取,有硬件设备解码支持,效率更高,但是不适合Android

骨骼动画
Cocos2d-x2.0.3版本已经支持骨骼动画系统。cocosbuilder2.1版本工具也可以进行相应的骨骼动画编辑。这对于优化内存是一个很好的方案。 (身体和脚是拆分的,身体一帧,脚很多帧)

纹理尺寸限制(拼图最好尽量限制在1024)


渲染优化:

批次处理CCSpriteBatchNode


资源缓存:
CCSpriteFrameCache
CCTextureCache

内存优化:
资源占用的内存
内存池方案
内存计算: 图片的宽度*高度*色深(32位的话,一个像 素点占用4个字节)

Cocos2D-x高级UI系统
高级UI控件:
CCSacle9Sprite(按照9宫格方式去缩放一张图片)

CCRect rect=CCRectMake(0,0,76,63);//图片区域
CCRect capInsets=CCRectMake(10,10,40,40);//中间那块区域
CCSize winRect=CCSizeMake(size.width/2,size.height/2);//窗口尺寸
CCScale9Sprite *m_pNextBG=CCScale9Sprite::create("extensions/orange.png",rect,capInsets);//后面两个参数不带的话,则就会平均分配
m_pNextBG->setPreferredSize(winRect);
m_pNextBG->setPositon(...);
this->addChild(m_pNextBG,5);


控制按钮CCControlButton://TestCpp里面的ExtensionTest/CCControlButtonTest
控制事件CCControlEvent
virtual void sendActionsForContrilEvents(CCControlEvent controlEvents);

标签+按键组合
controlButton->addTageWithActionForControlEvents(this,
cccontrol_select(CCControlButtonTest_Event::touchDownAction,CCControlEventTouchDown);

拖动条CCControlSlider
CCControlSlider *slider = CCControlSlider::create("extensions/sliderTrack.png","extensions/sliderProgress.png" ,"extensions/sliderThumb.png"); slider->setAnchorPoint(ccp(0.5f, 1.0f));
slider->setMinimumValue(0.0f); // Sets the min value of range
slider->setMaximumValue(5.0f); // Sets the max value of range
slider->setPosition(ccp(screenSize.width / 2.0f, screenSize.height / 2.0f + 16));
slider->setTag(1);
restrictSlider->addTargetWithActionForControlEvents(this, cccontrol_selector(CCControlSliderTest::valueChanged), CCControlEventValueChanged);

颜色选取器CCControlColourPicker
CCControlColourPicker *colourPicker = CCControlColourPicker::create(); colourPicker->setColor(ccc3(37, 46, 252));
colourPicker->setPosition(ccp (colourPicker->getContentSize().width / 2, 0));
// Add it to the layer
layer->addChild(colourPicker);
// Add the target-action pair

colourPicker->addTargetWithActionForControlEvents(this, cccontrol_selector(CCControlColourPickerTest::colourValueChanged), CCControlEventValueChanged);
layer_width += colourPicker->getContentSize().width;

开关控件CCControlSwitch
CCControlSwitch *switchControl = CCControlSwitch::create
(
CCSprite::create("extensions/switch-mask.png"),
CCSprite::create("extensions/switch-on.png"),
CCSprite::create("extensions/switch-off.png"),
CCSprite::create("extensions/switch-thumb.png"), CCLabelTTF::create("On", "Arial-BoldMT", 16),
CCLabelTTF::create("Off", "Arial-BoldMT", 16)
);
switchControl->setPosition(ccp (layer_width + 10 + switchControl->getContentSize().width / 2, 0));
layer->addChild(switchControl);
switchControl->addTargetWithActionForControlEvents(this, cccontrol_selector(CCControlSwitchTest::valueChanged), CCControlEventValueChanged);

压力计CCControlPotentionmeter
CCControlPotentiometer *potentiometer = CCControlPotentiometer::create("extensions/potentiometerTrack.png" ,"extensions/potentiometerProgress.png" ,"extensions/potentiometerButton.png");
potentiometer->setPosition(ccp (layer_width + 10 + potentiometer->getContentSize().width / 2, 0));

分段控件CCControlStepper
CCControlStepper *stepper = this->makeControlStepper();
stepper->setPosition(ccp (layer_width + 10 + stepper->getContentSize().width / 2, 0));
stepper->addTargetWithActionForControlEvents(this, cccontrol_selector(CCControlStepperTest::valueChanged), CCControlEventValueChanged);
layer->addChild(stepper);

滚动视图CCScrollView 视频25
virtual void scrollViewDidScroll(CCScrollView *view)=0;//滚动结束之后触发
virtual void scrollViewDidZoom(CCScrollView * view)=0;//缩放结束之后触发

列表视图CCTableView
class CCCTableViewDelegate:public CCScrollViewDelegate

CCTableViewDataSorce

CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCTableView* tableView = CCTableView::create(this, CCSizeMake(250, 60));
tableView->setDirection(kCCScrollViewDirectionHorizontal);
tableView->setPosition(ccp(20,winSize.height/2-30));
tableView->setDelegate(this);
this->addChild(tableView);
tableView->reloadData();


Cocos2D-x集成SDK控件:
集成IOS平台控件: 直接替换掉项目中class和Resource两个文件夹再进行编译就行了。
集成Android平台控件:
开发环境搭建
Java/c/c++互相调用
Android view

Android NDK 开发
1NDK开发环境搭建 Native Development Kit(原生代码)
2安装cygwin(windows)
3Android SDK开发环境
4安装CDT插件(在eclipse 下编写C++代码)
5下载并解压NDK
6设置NDK环境变量
安装Sequoyah插件(http://www.eclipse.org/sequoyah/downloads/)
配置NDK路径:在“window->preferences->Android->本机开发”中添加NDK的路径。



hello-jni 实例:

//java 文件
public native String stringFromJNI();//这个函数会调用C++函数

//c++文件
#include<string.h>
#include<jin.h>

jstring java_com_example_helljni_HelloJni_stringFromJNI(JNIEnv* env,jobject thiz)
{
return (*env)->NewStringUTF(env,"Hello,from JNI !");
}

编译hello-jni
LOCAL_PATH:=$(call my-dir) //定义本地路径

include $(CLEAE_VARS) //清除之前所有内容

LOCAL_MODLE:=hell-jni
LOCAL_SRC_FILES:=hello-jni.c //所有文件
include$(BUILD_SHARED_LIBRARY) //编译成so文件(IOS)

JNI概述:
Jni所有接口都在#inclu"jni.h"

JavaType Native Type(c++type)

int jint
string jstring

Java 调用C方法流程:
在java层使用native关键字定义函数
public native String stringFromJNI(int x,int y);//这个函数会调用C++函数


在c中实现native函数
jstring java_com_example_helljni_HelloJni_stringFromJNI(JNIEnv* env,jobject thiz,int x,int y)
{
return (*env)->NewStringUTF(env,"Hello,from JNI !");
}

C调用java静态方法 视频27 (跳看)

开发环境:mac平台 Xcode

C/c++与Object-C混编 .mm 文件 直接相互调用
关键文件:main.m->AppController.mm

开源可视化开发工具:
CocosBuilder游戏设计:http://cocosbuilder.com 视频29

CocosBuilder的场景 只能在mac上使用

加载一个cocosBuilder 编辑好的场景:
在scene()函数下:
scene()
{
CCScene *scene=CCScene::create();
CCNodeLoaderLibrary * lib=CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
CCBReader *reader=new CCBReader(lib);
CCNode *node=reader->readNodeGraphFromFile("MainScene.ccbi",scene);
reader->release();
if(node!=NULL)
{
scene->addChild(node);
}
return scene;
}
cocosbuilder 场景制作 视频29、视频30 (未详细看)


Cocos2D-x底层实现
引擎实现基础:OPenGL是2D/3D图形编程的低级API。针对显卡的编程(效率较高,硬件加速)。 都是基于OpenGL实现
OpenGL基础
OpenGL

OpenGL ES2.0:针对可编程管线硬件(programmable pipeline),则需要手动编写shader程序来完成对显卡的操作。


OpenGL渲染基础:

OpenGL使用流程:
1)准备view //显示图片渲染
2)创建OpenGL context
3)创建render buffer(渲染缓冲去)
OpenGL的一个对象,用于存放渲染过的图像。屏幕大的二维数组,用于存放渲染后的图片

4)创建frame buffer(帧缓冲区)
OpenGL的对象,它包含了前面提到的render buffer,以及其它后面会讲到的诸如:depth buffer、stencil buffer和accumulation buffer。

OpenGL渲染流程
编写着色器shaders程序(由显卡执行)
要在OpenGL场景汇总渲染物体,都需要创建两个着色器程序。


Vertex shaders (顶点着色器)
attribute vec4 Position;//位置信息,需要传入的数据
attribute vec4 SourceClolr;//颜色信息,需要传入的颜色(需要传入则标示为attribute)
varying vec4 DestinationColor;//传出的颜色
void main(void)
{
DestinationColor=SourceColor;//不会处理颜色,直接传出给片段着色器接收
gl_Positon=Positon;//内置变量,保存顶点数据
}


Fragment shaders (片段着色器)//负责计算颜色
varying lowp vec4 DestinationColor;//highp 精度标示
void main(void)
{
gl_FragColor=DestinationColor;
}


编译Vertex shader 和Fragment shader//运行时才进行编译,非常好的支持跨平台

glCreateShader//创建shader对象,安装类型区分(GL_VERTEX_SHADER、GL_FRAGMENT_SHADER)
glShaderSource//获取shader源码
glCompileShader//编译shader
glGetShaderiv、glGetShaserInfoLog//检查编译是否成功,得到错误信息
glCreateProgram//创建渲染Program
glAttachShader//绑定两个shader到Program
glLinkProgram //将两个shader链接成一个完整的Program
glGetProgramiv、lglGetProgramInfoLog//检测是否链接成功、打印错误信息
glUseProgram//让OpenGL执行Program
glGetAttribLocation//获取shader中传入变量,后期将传递值到shader中计算
glEnableVertexAttribArray//启用数据

顶点数据:
创建Vertex Buffer对象
glGenBuffers//创建一个Vertex Buffer对象
glBindBuffer//告诉OpenGL vertexBuffer是指GL_ARRAY_BUFFER
glBufferData//绑定数据到Vertex Buffer

渲染图形
glVertexAttribPointer//像shader提供输入参数值
glDrawElements//绘制图形,在每个顶点调用定点vertex shader,在每个像素调用fragment shader

投影矩阵:
uniform mat4 Projection;//矩阵变量
gl_Positon=Projection * Position;
glGetUniformLocation//获取在vertex shader 中的Projection输入变量
glUniformMatrix4fv//为shader提供传入变量的值

模型视图矩阵
uniform mat4 Modelview;
gl_Position =Projection *Modelview * Position;//矩阵相乘的顺序不能改变


纹理数据:把图片数据映射到前面定义好的四边形中
attribute vec2 TexCoordIn;//输入纹理坐标
varying vec2=TexCoordOut; //输出纹理坐标
TexCoorOut=TexCoordIn;

varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;//纹理采样
gl_FragColor=DestinationColor*texture2D(Texture,TexCoordOut); //后面函数返回对应纹理点的颜色值


glGenTextures//创建纹理
glBindTexture//绑定纹理
glTexParemeteri//设置纹理过滤,类似于设置桌面壁纸方案
glTexImage2D//设置纹理数据->把图像数据映射到纹理上面来
glActiveTexture//激活纹理
glBindTexture//绑定纹理
glUniformli//向fragment shader传递纹理数据


游戏引擎实现:(剖析引擎实现)

cocos2d-x引擎结构:
程序入口main()->初始化窗口、初始化OpenGL/DX->游戏主程序:1更新游戏、2显示游戏


引擎结构剖析:视频37(win32), 视频38(ios) 视频39(java),《未细看,拖着看的》

Cocos结构分析:

几何图形:渲染步—骤视频43 ,熟悉OpGL的时候再温习一下
Shader
-> CCShaderCache ->CCDrawingPrimitives-> init/free 、draw...
CCGLProgram GLStateCache

CCNOde系统:图片展示:
CCNode要点:
1.节点树
2.visit
3....


坐标与尺寸:
locationView //转化为相对于UI(view)的点
convertToGL //转化为相对于GL世界坐标的点
//将GL世界坐标的点转化为相对节点空间的点
convertToNodeSpace(const CCPoint & worldPoint);
convertToWorldpace(const CCPoint & nodePoint);
//需要考虑到锚点
convertToNodeSpaceAR(const CCPoint & worldPoint);
convertToNodeSpaceAR(const CCPoint & nodePoint);

尺寸和多分辨率适配:
contentScalseFactor=RH/DH=640/320=2.0f
OPGL 视口

列表视图裁剪:CCEGVLiew::sharedOpenGLView()->setScissorInPoints(100,100,100,100);
glEnable(GL_SCISSOR_TEST); //要打开


内存管理机制:视频48


事件处理机制:
CCTouch

视频49-视频55误删了

Action分析:(动画)视频56


Animation分析:

CCSpriteFrame(精灵帧,也就是一张图片)数据储存中转站

CCAnimationFrame(动画帧)

CCAnimation(连续的图片展示) CCAnimationCache


CCAnimate需要根据CCAnimation来构建动画。

粒子系统分析:粒子(particle)、粒子发射器(给定一些属性,启动每一个粒子)
CCTextureAtlas(文理渲染)
->CCParticleBatchNode(纹理集合批次管理)
->CCParticleSystem
-> CCparticleSystemPoint
CCparticleSystemQuad->CCparticleFire、CCParticleSun、CCParticleFlower

地图系统分析:
CCTMXXMLParser:
CCTMXXTilesetInfo
CCTMXMapInfo CCTileMapAtlas

CCTMXtiledMap CCParallaxNode

CCTMXLayer

CCParallaxNode


物理引擎分析:
scheduleUpdate();CCLayer::update(float dt)
-> CCPhysicsDebugNode->CCDrawNode
CCPhysicsSprite

网络模块:
CCHttpClient:(Http客户端) CCHttpRequest
多线程 CCHttpResponse
请求队列
响应队列

数据储存和音乐音效

CCUserDefault 在目录:support/user_default
SimpleAudioEngine


原文地址:https://www.cnblogs.com/xxiaoye/p/3760161.html