cocos2d-x之TestCpp界面UI代码分析
来源:互联网 发布:无声告白 知乎 编辑:程序博客网 时间:2024/05/08 12:12
第一节 TestCpp 主界面UI代码分析
直接进入TestCpp的目录下,他的UI界面代码中有如下几个文件:
在这里先抛开整个应用的框架(包含AppDelegate.cpp、AppDelegate.h、main.cpp、main.h)不谈,剩下的就是TestCpp主界面的代码了,这些代码并不是很难理解,相反很容易理解,有兴趣一起来看看吧。
1. tests.h文件,此文件将此工程目录下的所有相关demo的头文件包括在内,并定义了测试demo的页面的名称和相应的枚举型变量来对应每一个页面。
#ifndef _TESTS_H_
#define _TESTS_H_
#include"ActionsTest/ActionsTest.h"
#include"TransitionsTest/TransitionsTest.h"
#include"ActionsProgressTest/ActionsProgressTest.h"
#include"EffectsTest/EffectsTest.h"
#include"ClickAndMoveTest/ClickAndMoveTest.h"
#include"RotateWorldTest/RotateWorldTest.h"
#include"ParticleTest/ParticleTest.h"
#include"ActionsEaseTest/ActionsEaseTest.h"
#include"MotionStreakTest/MotionStreakTest.h"
#include"DrawPrimitivesTest/DrawPrimitivesTest.h"
#include"TouchesTest/TouchesTest.h"
#include"MenuTest/MenuTest.h"
#include"ActionManagerTest/ActionManagerTest.h"
#include"LayerTest/LayerTest.h"
#include"SceneTest/SceneTest.h"
#include"ParallaxTest/ParallaxTest.h"
#include"TileMapTest/TileMapTest.h"
#include"IntervalTest/IntervalTest.h"
#include"LabelTest/LabelTest.h"
#include"TextInputTest/TextInputTest.h"
#include"SpriteTest/SpriteTest.h"
#include"SchedulerTest/SchedulerTest.h"
#include"RenderTextureTest/RenderTextureTest.h"
#include"Box2DTest/Box2dTest.h"
#include"Box2DTestBed/Box2dView.h"
#include"EffectsAdvancedTest/EffectsAdvancedTest.h"
#include"AccelerometerTest/AccelerometerTest.h"
#include"KeypadTest/KeypadTest.h"
#include"PerformanceTest/PerformanceTest.h"
#include"ZwoptexTest/ZwoptexTest.h"
#include"CocosDenshionTest/CocosDenshionTest.h"
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
// bada don't support libcurl
#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA)
#include"CurlTest/CurlTest.h"
/*
*此处根据特殊平台,不包含CurlTest.h *
*/
#endif
#endif
#include"UserDefaultTest/UserDefaultTest.h"
#include"BugsTest/BugsTest.h"
#include"Texture2dTest/Texture2dTest.h"
#include"FontTest/FontTest.h"
#include"CurrentLanguageTest/CurrentLanguageTest.h"
#include"TextureCacheTest/TextureCacheTest.h"
#include"NodeTest/NodeTest.h"
#include"ShaderTest/ShaderTest.h"
#include"ExtensionsTest/ExtensionsTest.h"
#include"MutiTouchTest/MutiTouchTest.h"
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
#include"ClippingNodeTest/ClippingNodeTest.h"
#include"ChipmunkTest/ChipmunkTest.h"
/*
*此处根据特殊平台,不包含CurlTest.h,在定义枚举型变量和页面名称时也*是一一对应的
*/
#endif
/*
*以下定义每个demo的枚举型变量,对应每个demo,在启动每一个单独的demo界
*面时候将会用到,正是根据这些枚举型的值来启动对应的demo的,这些值在*controller.cpp用到
*/
enum
{
TEST_ACTIONS = 0,
TEST_TRANSITIONS,
TEST_PROGRESS_ACTIONS,
TEST_EFFECTS,
TEST_CLICK_AND_MOVE,
TEST_ROTATE_WORLD,
TEST_PARTICLE,
TEST_EASE_ACTIONS,
TEST_MOTION_STREAK,
TEST_DRAW_PRIMITIVES,
TEST_COCOSNODE,
TEST_TOUCHES,
TEST_MENU,
TEST_ACTION_MANAGER,
TEST_LAYER,
TEST_SCENE,
TEST_PARALLAX,
TEST_TILE_MAP,
TEST_INTERVAL,
TEST_LABEL,
TEST_TEXT_INPUT,
TEST_SPRITE,
TEST_SCHEDULER,
TEST_RENDERTEXTURE,
TEST_TEXTURE2D,
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
TEST_CHIPMUNK,
#endif
TEST_BOX2D,
TEST_BOX2DBED,
TEST_EFFECT_ADVANCE,
TEST_ACCELEROMRTER,
TEST_KEYPAD,
TEST_COCOSDENSHION,
TEST_PERFORMANCE,
TEST_ZWOPTEX,
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA)
TEST_CURL,
#endif
#endif
TEST_USERDEFAULT,
TEST_BUGS,
TEST_FONTS,
TEST_CURRENT_LANGUAGE,
TEST_TEXTURECACHE,
TEST_EXTENSIONS,
TEST_SHADER,
TEST_MUTITOUCH,
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
TEST_CLIPPINGNODE,
#endif
TESTS_COUNT,
};
const std::string g_aTestNames[TESTS_COUNT] = {
"ActionsTest",
"TransitionsTest",
"ActionsProgressTest",
"EffectsTest",
"ClickAndMoveTest",
"RotateWorldTest",
"ParticleTest",
"ActionsEaseTest",
"MotionStreakTest",
"DrawPrimitivesTest",
"NodeTest",
"TouchesTest",
"MenuTest",
"ActionManagerTest",
"LayerTest",
"SceneTest",
"ParallaxTest",
"TileMapTest",
"IntervalTest",
"LabelTest",
"TextInputTest",
"SpriteTest",
"SchedulerTest",
"RenderTextureTest",
"Texture2DTest",
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
"ChipmunkTest",
#endif
"Box2dTest",
"Box2dTestBed",
"EffectAdvancedTest",
"Accelerometer",
"KeypadTest",
"CocosDenshionTest",
"PerformanceTest",
"ZwoptexTest",
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA)
"CurlTest",
#endif
#endif
"UserDefaultTest",
"BugsTest",
"FontTest",
"CurrentLanguageTest",
"TextureCacheTest",
"ExtensionsTest",
"ShaderTest",
"MutiTouchTest",
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
"ClippingNodeTest"
#endif
};
#endif
2. testResource.h这个文件中将了资源的路径名称定义为static const char的类型方便以后引用,不过不是很明白为什么要定义成static类型的。
全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。
2. VisibleRect.h VisibleRect.cpp
这两个文件定义了界面的几个坐标点,是根据界面的宽高在计算的。
#ifndef __VISIBLERECT_H__
#define __VISIBLERECT_H__
#include"cocos2d.h"
USING_NS_CC;
class VisibleRect
{
public:
//获取界面宽高并以矩形对象的方式返回
static CCRect getVisibleRect();
//获取屏幕左侧的坐标点,其实是左中
static CCPoint left();
//获取屏幕右侧的坐标点,其实是右中
static CCPoint right();
//获取屏幕上侧的坐标点,其实是上中
static CCPoint top();
//获取屏幕底部的坐标点,其实是底中
static CCPoint bottom();
//获取屏幕中心的坐标点,其实是中中
static CCPoint center();
//获取屏幕左上角的坐标点
static CCPoint leftTop();
//获取屏幕右上角的坐标点
static CCPoint rightTop();
//获取屏幕左下角的坐标点
static CCPoint leftBottom();
//获取屏幕右下角的坐标点
static CCPoint rightBottom();
private:
//初始化界面矩形
staticvoid lazyInit();
//声明界面矩形,用来保存界面矩形的数据
static CCRect s_visibleRect;
};
#endif/* __VISIBLERECT_H__ */
VisibleRect.cpp
#include"VisibleRect.h"
//类的非const的静态数据类型必须在类外初始化,初始化矩形数据
CCRect VisibleRect::s_visibleRect;
void VisibleRect::lazyInit()
{
if (s_visibleRect.size.width == 0.0f && s_visibleRect.size.height == 0.0f)
{
//通过调用sharedOpenGLView,
//返回初始化过的CCEGLView类型的指针,返回的是一个静态局部指针,//没有释放却,通过返回的指针给静态数据成员赋值
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
s_visibleRect.origin = pEGLView->getVisibleOrigin();
s_visibleRect.size = pEGLView->getVisibleSize();
}
}
CCRect VisibleRect::getVisibleRect()
{
lazyInit();
//根据成员数据返回一个CCRect对象,数据与类内保存的窗口矩形大小数//据一样
return CCRectMake(s_visibleRect.origin.x, s_visibleRect.origin.y, s_visibleRect.size.width, s_visibleRect.size.height);
}
/*
*以下的九个函数分别返回矩形的9个坐标点
*/
CCPoint VisibleRect::left()
{
lazyInit();
return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height/2);
}
CCPoint VisibleRect::right()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height/2);
}
CCPoint VisibleRect::top()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y+s_visibleRect.size.height);
}
CCPoint VisibleRect::bottom()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y);
}
CCPoint VisibleRect::center()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y+s_visibleRect.size.height/2);
}
CCPoint VisibleRect::leftTop()
{
lazyInit();
return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height);
}
CCPoint VisibleRect::rightTop()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height);
}
CCPoint VisibleRect::leftBottom()
{
lazyInit();
return s_visibleRect.origin;
}
CCPoint VisibleRect::rightBottom()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y);
}
4. testBasic.h与testBasic.cpp
testBasic.h 声明了TestScene类,所有的demo界面的类都将是他的子类,这些界面实现自己的runThisTest()函数,并且在TestScene中将他定义为了纯虚函数,那么TestScene只是作为抽象的层存在,是不能够被实例化的。
#ifndef _TEST_BASIC_H_
#define _TEST_BASIC_H_
#include"cocos2d.h"
#include"VisibleRect.h"
USING_NS_CC;
usingnamespace std;
class TestScene :public CCScene
{
public:
//带参数的构造函数
TestScene(bool bPortrait =false);
//继承并将重定义自己的onEnter函数
virtual void onEnter();
//声明纯虚函数入口,子类可以覆盖
virtual void runThisTest() = 0;
// The CallBack for back to the main menu scene
virtual void MainMenuCallback(CCObject* pSender);
};
/*定义一个函数指针,这个指针指向一个函数,这个函数返回类型为CCLayer*参数列表为空*/
typedef CCLayer* (*NEWTESTFUNC)();
//以下这段,不太明白是什么意思,暂时先留着以后补上
#define TESTLAYER_CREATE_FUNC(className) \
static CCLayer* create##className() \
{ return new className(); }
#define CF(className) create##className
#endif
testBasic.cpp详解:
#include"testBasic.h"
#include"controller.h"
TestScene::TestScene(bool bPortrait)
{
//初始化数据
CCScene::init();
}
void TestScene::onEnter()
{
//调用父类的onEnter函数
CCScene::onEnter();
//add the menu item for back to main menu
//#if (CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)
// CCLabelBMFont* label = CCLabelBMFont::create("MainMenu", "fonts/arial16.fnt");
//#else
/*以下部分定义了一个CCLabelTTF*类型的指针,由它初始化一个CCMenuItemLabel*,并添加了点击触发的函数,并接着初始化了一个CCMenu*,并将它放置在右下的具体坐标,*/
CCLabelTTF* label = CCLabelTTF::create("MainMenu","Arial", 20);
//#endif
CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label,this, menu_selector(TestScene::MainMenuCallback));
CCMenu* pMenu =CCMenu::create(pMenuItem, NULL);
pMenu->setPosition( CCPointZero );
pMenuItem->setPosition( ccp( VisibleRect::right().x - 50, VisibleRect::bottom().y + 25) );
addChild(pMenu, 1);
}
//定义点击menu后返回选择demo的界面
void TestScene::MainMenuCallback(CCObject* pSender)
{
CCScene* pScene = CCScene::create();
CCLayer* pLayer = new TestController();
pLayer->autorelease();
pScene->addChild(pLayer);
CCDirector::sharedDirector()->replaceScene(pScene);
}
5. controller.h与controller.cpp
controller.h声明TestCpp主界面的Layer层,TestController类类型
#ifndef _CONTROLLER_H_
#define _CONTROLLER_H_
#include"cocos2d.h"
USING_NS_CC;
class TestController :public CCLayer
{
public:
TestController();
~TestController();
//根据所点击的demo的menu进入相应的demo界面
void menuCallback(CCObject * pSender);
//关闭TestCpp界面,退出应用
void closeCallback(CCObject * pSender);
//界面响应单点触摸和移动的两个函数
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
private:
//触摸起点
CCPoint m_tBeginPos;
//关闭菜单
CCMenu* m_pItemMenu;
};
#endif
controller.cpp文件
#include"controller.h"
#include"testResource.h"
#include"tests.h"
//两个demo菜单的行间距
#define LINE_SPACE 40
//零点坐标
static CCPoint s_tCurPos = CCPointZero;
//全局静态函数,根据nIdx创建具体的TestScene,返回TestScene类型
static TestScene* CreateTestScene(int nIdx)
{
/** Removes cached all cocos2d cached data.
It will purge the CCTextureCache, CCSpriteFrameCache, CCLabelBMFont cache
大义是删除所有的cache.
*/
CCDirector::sharedDirector()->purgeCachedData();
TestScene* pScene = NULL;
switch (nIdx)
{
case TEST_ACTIONS:
pScene = new ActionsTestScene(); break;
case TEST_TRANSITIONS:
pScene = new TransitionsTestScene(); break;
case TEST_PROGRESS_ACTIONS:
pScene = new ProgressActionsTestScene(); break;
case TEST_EFFECTS:
pScene = new EffectTestScene(); break;
case TEST_CLICK_AND_MOVE:
pScene = new ClickAndMoveTestScene(); break;
case TEST_ROTATE_WORLD:
pScene = new RotateWorldTestScene(); break;
case TEST_PARTICLE:
pScene = new ParticleTestScene(); break;
case TEST_EASE_ACTIONS:
pScene = new ActionsEaseTestScene(); break;
case TEST_MOTION_STREAK:
pScene = new MotionStreakTestScene(); break;
case TEST_DRAW_PRIMITIVES:
pScene = new DrawPrimitivesTestScene(); break;
case TEST_COCOSNODE:
pScene = new CocosNodeTestScene(); break;
case TEST_TOUCHES:
pScene = new PongScene(); break;
case TEST_MENU:
pScene = new MenuTestScene(); break;
case TEST_ACTION_MANAGER:
pScene = new ActionManagerTestScene(); break;
case TEST_LAYER:
pScene = new LayerTestScene(); break;
case TEST_SCENE:
pScene = new SceneTestScene(); break;
case TEST_PARALLAX:
pScene = new ParallaxTestScene(); break;
case TEST_TILE_MAP:
pScene = new TileMapTestScene(); break;
case TEST_INTERVAL:
pScene = new IntervalTestScene(); break;
case TEST_LABEL:
pScene = new AtlasTestScene(); break;
case TEST_TEXT_INPUT:
pScene = new TextInputTestScene(); break;
case TEST_SPRITE:
pScene = new SpriteTestScene(); break;
case TEST_SCHEDULER:
pScene = new SchedulerTestScene(); break;
case TEST_RENDERTEXTURE:
pScene = new RenderTextureScene(); break;
case TEST_TEXTURE2D:
pScene = new TextureTestScene(); break;
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
case TEST_CHIPMUNK:
pScene = new ChipmunkAccelTouchTestScene(); break;
#endif
case TEST_BOX2D:
pScene = new Box2DTestScene(); break;
case TEST_BOX2DBED:
pScene = new Box2dTestBedScene(); break;
case TEST_EFFECT_ADVANCE:
pScene = new EffectAdvanceScene(); break;
case TEST_ACCELEROMRTER:
pScene = new AccelerometerTestScene(); break;
#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA)
case TEST_KEYPAD:
pScene = new KeypadTestScene(); break;
#endif
case TEST_COCOSDENSHION:
pScene = new CocosDenshionTestScene(); break;
case TEST_PERFORMANCE:
pScene = new PerformanceTestScene(); break;
case TEST_ZWOPTEX:
pScene = new ZwoptexTestScene(); break;
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
// bada don't support libcurl
#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA)
case TEST_CURL:
pScene = new CurlTestScene(); break;
#endif
#endif
case TEST_USERDEFAULT:
pScene = new UserDefaultTestScene(); break;
case TEST_BUGS:
pScene = new BugsTestScene(); break;
case TEST_FONTS:
pScene = new FontTestScene(); break;
case TEST_CURRENT_LANGUAGE:
pScene = new CurrentLanguageTestScene(); break;
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
case TEST_TEXTURECACHE: pScene = new TextureCacheTestScene();break;
#endif
case TEST_EXTENSIONS:
{
pScene = new ExtensionsTestScene();
}
break;
case TEST_SHADER:
pScene = new ShaderTestScene();
break;
case TEST_MUTITOUCH:
pScene = new MutiTouchTestScene();
break;
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
case TEST_CLIPPINGNODE:
pScene = new ClippingNodeTestScene();
break;
#endif
default:
break;
}
return pScene;
}
TestController::TestController()
: m_tBeginPos(CCPointZero)
{
// add close menu
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(s_pPathClose, s_pPathClose,this, menu_selector(TestController::closeCallback) );
CCMenu* pMenu =CCMenu::create(pCloseItem, NULL);
pMenu->setPosition( CCPointZero );
pCloseItem->setPosition(ccp( VisibleRect::right().x - 30, VisibleRect::top().y - 30));
// add menu items for tests
m_pItemMenu = CCMenu::create();
for (int i = 0; i < TESTS_COUNT; ++i)
{
// #if (CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)
// CCLabelBMFont* label = CCLabelBMFont::create(g_aTestNames[i].c_str(), "fonts/arial16.fnt");
// #else
CCLabelTTF* label = CCLabelTTF::create(g_aTestNames[i].c_str(),"Arial", 24);
// #endif
CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label,this, menu_selector(TestController::menuCallback));
//添加每个menu的order,在点击时候根据i创建scene
m_pItemMenu->addChild(pMenuItem, i + 10000);
pMenuItem->setPosition( ccp( VisibleRect::center().x, (VisibleRect::top().y - (i + 1) * LINE_SPACE) ));
}
m_pItemMenu->setContentSize(CCSizeMake(VisibleRect::getVisibleRect().size.width, (TESTS_COUNT + 1) * (LINE_SPACE)));
m_pItemMenu->setPosition(s_tCurPos);
addChild(m_pItemMenu);
setTouchEnabled(true);
addChild(pMenu, 1);
}
TestController::~TestController()
{
}
void TestController::menuCallback(CCObject * pSender)
{
// get the userdata, it's the index of the menu item clicked
CCMenuItem* pMenuItem = (CCMenuItem *)(pSender);
int nIdx = pMenuItem->getZOrder() - 10000;
// create the test scene and run it
//根据nIdx创建scene,调用全局的CreateTestScene函数
TestScene* pScene = CreateTestScene(nIdx);
if (pScene)
{
pScene->runThisTest();
//在这里调用release,引用计数减一,意味着,创建的TestScene的子//类对象将交给系统释放内存
pScene->release();
}
}
void TestController::closeCallback(CCObject * pSender)
{
CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
void TestController::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
//获取开始滑动时的起始坐标点
CCSetIterator it = pTouches->begin();
CCTouch* touch = (CCTouch*)(*it);
m_tBeginPos = touch->getLocation();
}
void TestController::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
CCSetIterator it = pTouches->begin();
CCTouch* touch = (CCTouch*)(*it);
CCPoint touchLocation = touch->getLocation();
//计算每次滑动的距离
float nMoveY = touchLocation.y - m_tBeginPos.y;
CCPoint curPos = m_pItemMenu->getPosition();
//计算将要滑动到的位置
CCPoint nextPos = ccp(curPos.x, curPos.y + nMoveY);
//如果将要滑动到的Y坐标位置小于0,就置为0点
if (nextPos.y < 0.0f)
{
m_pItemMenu->setPosition(CCPointZero);
return;
}
//如果将要滑动到的Y坐标位置大于,最顶点的位置与屏幕高度的差值,//就置为最顶点,如果不减去VisibleRect::getVisibleRect().size.height,将会把//最顶部的menu滑动至屏幕显示之外,留下一片空白
if (nextPos.y > ((TESTS_COUNT + 1)* LINE_SPACE - VisibleRect::getVisibleRect().size.height))
{
m_pItemMenu->setPosition(ccp(0, ((TESTS_COUNT + 1)* LINE_SPACE - VisibleRect::getVisibleRect().size.height)));
return;
}
m_pItemMenu->setPosition(nextPos);
m_tBeginPos = touchLocation;
s_tCurPos = nextPos;
}
- cocos2d-x之TestCpp界面UI代码分析
- cocos2d-x的TestCpp分析之TransitionsTest
- cocos2d-x的TestCpp分析
- Cocos2d-x 2.0 TestCpp之场景切换动画深入分析
- Cocos2d-x之testCpp---Accelerometer(重力感应)分析
- Cocos2d-x基础:TestCpp之项目结构分析
- Cocos2d-x 2.0 TestCpp之场景切换动画深入分析
- Cocos2d-x 2.0 TestCpp之场景切换动画深入分析
- Cocos2d-x 2.0 TestCpp框架源码分析
- Cocos2d-x 2.0 TestCpp框架源码分析
- cocos2d-x TestCpp例子工程分析
- Cocos2d-x 2.0 TestCpp框架源码分析
- Cocos2d-x 2.0 TestCpp框架源码分析
- Cocos2d-x新手学习之TestCpp项目结构分析(第四篇)[版本:cocos2d-x-3.1.1]
- Cocos2d-x基础:TestCpp之ActionsTest
- Cocos2d-x基础:TestCpp之场景切换
- Cocos2d-TestCpp之项目结构分析
- cocos2d-x 笔记(四) TestCpp源码分析:control
- Ext进度条
- 视频通讯僵局已由思科打破
- JS获取Cookie值
- HttpClient4之模拟http请求
- 面试
- cocos2d-x之TestCpp界面UI代码分析
- sql_学习笔记
- js验证 数字、正整数
- Type View requires API level 14 (current min is 4): <GridLayout>
- Building a LAMP Server
- 360手机卫士清理后台service的反制方案
- PHY
- ThinkPHP的PHP变量传递到模板原理浅析
- katta--索引的管理者