cocos2d 解密ccbi_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
{
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]={'\0'};
...
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
{
JSONNode temp=rn[1][i];
for(int j=0;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
#include
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)
intjint
stringjstring
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
CCTMXMapInfoCCTileMapAtlas
CCTMXtiledMapCCParallaxNode
CCTMXLayer
CCParallaxNode
物理引擎分析:
scheduleUpdate();CCLayer::update(float dt)
-> CCPhysicsDebugNode->CCDrawNode
CCPhysicsSprite
網絡模塊:
CCHttpClient:(Http客戶端) CCHttpRequest
多線程 CCHttpResponse
請求隊列
響應隊列
數據儲存和音樂音效
CCUserDefault 在目錄:support/user_default
SimpleAudioEngine
總結
以上是生活随笔為你收集整理的cocos2d 解密ccbi_cocos2d-x高级学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: m01是什么指令
- 下一篇: 用hundred造句子_关于冬至的问候短