【唠叨】

本节摘自:

(1)v3.0 发布说明:https://github.com/fusijie/Cocos2d-x3.0-Release-Note/blob/master/cocos2d-x_v3.0_release_notes.md

(2)C++11 新特性:http://blog.csdn.net/ls1122/article/details/38339851


【v3.0 亮点】

> 使用 C++(C++11) 的特性取代了 Objective-C 的特性

> 优化了 Labels

> 优化了渲染器(比 v2.2 更快)

> 新的事件分发机制

> 物理引擎集成

> 新的 UI 对象

> 模板容器

> 使用 cocos2d::Map<> 替代了 CCDictionary , 用法

> 使用 cocos2d::Vector<> 替代了 CCArray, 用法

> 使用 cocos2d::Value 替代了 CCBool, CCFLoat, CCDouble, 用法


1、C++11 特性

1.1、新的关键字及语法

(1)nullptr

nullptr是为了解决NULL的二义性,因为NULL实际上代表的是0。

1
2
3
4
5
6
7
8
9
//
     void  f( int );    //#1
     void  f( char  *); //#2
     
     //C++03
     f(0);           //二义性
     //C++11
     f(nullptr)      //无二义性,调用f(char*)
//

(2)auto

根据上下文自动类型推导。

1
2
3
4
5
6
7
//
     //v2.x
     CCSprite *pSprite = CCSprite::create( "HelloWorld.png" );
     //v3.x
     auto  pSprite = Sprite::create( "HelloWorld.png" );
//

(3)decltype

decltype与此相反,从变量或表达式中获取类型。

1
2
3
4
//
     int  x = 3;
     decltype (x) y = x;
//

(4)override

派生类重写基类的虚函数时,在函数的声明中加上override(非必须)。

这样可在编译时检测出对基类函数的错误重写。

1
2
3
4
5
6
7
8
9
10
11
12
//
     struct  B {
         virtual  void  f();
         virtual  void  g()  const ;
         void  k();            // not virtual
     };
     struct  D : B {
         void  f() override;   // OK: overrides B::f()
         void  g() override;   // error: wrong type
         void  k() override;   // error: B::k() is not virtual
     };
//

(5)final

可用来修饰基类的虚函数,表示该函数不可被派生类重写即override。

1
2
3
4
5
6
7
8
9
10
11
//
     struct  B {
         virtual  void  f()  const  final;  // do not override
         virtual  void  g();
     };
     struct  D : B {
         void  f()  const // error: D::f attempts to override final B::f
         void  g();        // OK
     };
//

(6)序列for循环

在C++中for循环可以使用类似java的简化的for循环。

可以用于遍历数组,容器,string以及由begin和end函数定义的序列(即有Iterator)。

示例代码如下:

1
2
3
4
5
6
//
     map<string,  int > m{{ "a" , 1}, { "b" , 2}, { "c" , 3}};
     for  ( auto  p : m){
         cout<<p.first<< " : " <<p.second<<endl;
     }
//

(7)lambda表达式

类似Javascript中的闭包,它可以用于创建并定义匿名的函数对象,以简化编程工作。

Lambda语法:[函数对象参数](操作符重载函数参数)->返回值类型{ 函数体 }

举例:      [](int a, int b){ return a > b; }

运用在MenuItem的回调函数:

1
2
3
4
5
6
7
8
//
     auto  closeItem = MenuItemImage::create(
             "CloseNormal.png" "CloseSelected.png"
             [](Object* sender)
             {
                 Director::getInstance()->end();  //直接在这里添加按钮要调用的代码
             } );
//

1.2、std::function 与 std::bind

std::function :可以定义类似函数指针的类型

std::bind     :可以方便的绑定类的成员函数

这个常在cocos2dx中的回调函数中使用:

> CallFunc  可以由 std::function<void()> 来创建。

> CallFuncN 可以由 std::function<void(Node*)> 来创建。

> CallFuncND和CallFuncO已经被移除,它们可以类似地由CallFuncN和CallFunc来创建。

> MenuItem 支持 std::function<void(Node*)> 作为回调

1
2
3
4
5
6
7
8
9
10
11
12
//
     std::function< void ( const  std::vector<Touch*>&, Event*)> onTouchesBegan;
     std::function< void ( const  std::vector<Touch*>&, Event*)> onTouchesMoved;
     std::function< void ( const  std::vector<Touch*>&, Event*)> onTouchesEnded;
     std::function< void ( const  std::vector<Touch*>&, Event*)> onTouchesCancelled;
     // new callbacks based on C++11
     #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
     #define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
     #define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
     #define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)
//

MenuItem 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//
     // v2.1 版本
     CCMenuItemLabel *item = CCMenuItemLabel::create(label,  this , menu_selector(MyClass::callback));
     // v3.0 版本 (短版本)
     auto  item = MenuItemLabel::create(label, CC_CALLBACK_1(MyClass::callback,  this ));
     // v3.0 版本 (长版本)
     auto  item = MenuItemLabel::create(label, std::bind(&MyClass::callback,  this , std::placeholders::_1));
     // v3.0 中你也可以使用lambda表达式或者其他函数对象
     auto  item = MenuItemLabel::create(label,
                      [&](Object *sender) {
                          // do something. Item "sender" clicked
                       });
//

1.3、强类型枚举

以 k 开头的常量和枚举量,通常被定义为 int 或者简单的 enum 类型,现在已经被强类型枚举(enum class)所替代,这样有利于避免冲突和类型错误。

新的格式是:

| v2.1       | v3.0        |

| kTypeValue | Type::VALUE |

示例:

| v2.1                             | v3.0                             |

| kCCTexture2DPixelFormat_RGBA8888 | Texture2D::PixelFormat::RGBA8888 |

| kCCDirectorProjectionCustom      | Director::Projection::CUSTOM     |

| ccGREEN                          | Color3B::GREEN                   |

| CCPointZero                      | Point::ZERO                      |

| CCSizeZero                       | Size::ZERO                       |


2、去OC化

2.1、移除"CC"前缀以及free functions

(1)移除C++类的"CC"前缀

| v2.1       | v3.0     |

| CCSprite   | Sprite   |

| CCNode     | Node     |

| CCDirector | Director |

| etc...                |

(2)free functions的变更

> 对于 drawing primitives:

> 已经被添加到 DrawPrimitives 命名空间

> 移除 cc 前缀

> 对于 gl proxy functions:

> 已经被添加到 GL 命名空间

> 移除 ccGL 前缀

示例:

| v2.1                | v3.0                         |

| ccDrawPoint()       | DrawPrimitives::drawPoint()  |

| ccDrawCircle()      | DrawPrimitives::drawCircle() |

| ccGLBlendFunc()     | GL::blendFunc()              |

| ccGLBindTexture2D() | GL::bindTexture2D()          |

| etc...                                             |

2.2、使用 clone 替代 copy

> clone() 返回了一份 autoreleased 版本的拷贝。

> copy()  不再被支持,如果你使用它,仍然是可以编译的,但是代码会崩掉。

2.3、单例类采用了 getInstance 和 destroyInstance

> getInstance     替代 shared*** 。

> destroyInstance 替代 end***    。

示例:

| v2.1                          | v3.0                        |

| CCDirector->sharedDirector()  | Director->getInstance()     |

| CCDirector->endDirector()     | Director->destroyInstance() |

| etc...                                                      |

2.4、使用 Ref 代替了 Object

因为 Object 容易让人混淆,所以重命名为 Ref ,同时移除了和引用计数无关的函数,之前所有继承于 Object 的类现在都改为继承于 Ref。

2.5、getters

Getters 现在使用了 get 前缀。

示例:

| v2.1                            | v3.0*                              |

| node->boundingBox()             | node->getBoundingBox()             |

| sprite->nodeToParentTransform() | sprite->getNodeToParentTransform() |

| etc...                                                               |

当然 getters 在声明中也被标识为 const 。

示例:

1
2
3
4
5
6
7
//
     // v2.1
     virtual float getScale();
     // v3.0
     virtual float getScale()  const ;
//

2.6、POD 类型

接收 POD 类型作为参数的方法(比如:TexParams, Point, Size,等等)已经修改为传递成 const 型引用。

示例:

1
2
3
4
5
6
7
//
     // v2.1
     void  setTexParameters(ccTexParams* texParams);
     // v3.0
     void  setTexParameters( const  ccTexParams& texParams);
//


3、新的渲染器

3.1、自动批处理

自动批处理功能意味着 渲染器将会把 多次绘制调用 打包为一次 大的绘制调用(AKA batch)。

组合 绘制调用 当然需要满足一定的条件:

> 它仅工作在QuadCommand命令下(由Sprite和ParticleSystem对象使用)

> QuadCommadnds 必须共享相同的材质ID:相同纹理ID、相同GLProgram、相同混合功能

> QuadCommands 必须是连续的

如果这些条件都满足的话,渲染器 将会使用所有这些 QuadCommand 对象创建一个批处理(一次绘制调用)。

如果你不熟悉 OpenGL 的使用,批处理对于您游戏的能否拥有一个流畅的运行速度是很重要的,越少的批处理(绘制调用)越有利于您游戏的表现力。

3.2、自动剔除

目前,自动剔除功能只在 Sprite 对象中实现。

当 Sprite::draw() 被调用的时候,它将会检查 Sprite 是否超出屏幕,如果是的话,它将不会发送 QuadCommand 命令给 渲染器,因此可以获得一些性能上的提升。

3.3、全局 Z 值

> Node 增加了新的函数 setGlobalZOrder() / getGlobalZOrder() 。

> setZOrder() / getZOrder() 被替代为 setLocalZOrder() / getLocalZOrder() 。

> globalZOrder 是一个float(不是int)的参数。这个值在渲染器中用来给RenderCommand排序。较低的值拥有较高的优先级。这意味着一个globalZorder为-10的节点会比一个globalZOrder为10 的节点优先绘制。

> globalZOrder 为 0 (默认值)的节点将会根据 Scene Graph 顺序绘制。

> 如果 globalZOrder 不变的话,Cocos2d-x v3.0 和 Cocos2d-x v2.2 行为一致。

> globalZOrder() 和 localZOrder():

> globalZOrder 是用于渲染器中用来给“绘制命令”排序的

> localZOrder  是用于父节点的子节点数组中给节点对象排序的

3.4、Sprite 和 SpriteBatchNode

v2.2版本中推荐的优化游戏方式是将 SpriteBatchNode 对象设置为 Sprite 对象的父节点。

虽然使用 SpriteBatchNode 对象仍然是一个非常好的优化游戏的方式。

但是它仍然有一定的限制:

> Sprite对象的孩子只能是Sprite(否则,Cocos2d-x会触发断言)

> Sprite父节点是SpriteBactchNode时,ParticleSystem不能作为Sprite的子节点。

> 这将导致当Sprite父节点是SpriteBatchNode时,不能使用ParallaxNode

> 所有的 Sprite 对象必须共享相同的纹理ID (否则,Cocos2d-x 会触发断言)

> Sprite 对象使用 SpriteBatchNode 的混合函数和着色器。

虽然v3.0仍然支持SpriteBatchNode(与之前版本拥有相同的特效和限制),但我们不鼓励使用它。相反,我们推荐直接使用Sprite,不需要将它作为子节点添加到SpriteBatchNode中。

但是,为了能让v3.0有更好的表现,你必须要确保你的Sprite对象满足以下条件:

> 贡献相同的纹理ID(把它们放在一个spritesheet中,就像使用 SpriteBatchNode 一样)

> 确保它们使用相同的着色器和混合函数(就像使用 SpriteBatchNode 一样)

如果这么做,Sprite将会像使用SpriteBatchNode一样的快...(在旧设备上大概慢了10%,在新设备上基本上察觉不出)

v2.2 和 v3.0 最大的区别在于:

> Sprite 对象可以有不同的纹理ID。

> Sprite 对象可以有不同种类的 Node 作为子节点,包括 ParticleSystem。

> Sprite 对象可以有不同的混合函数和不同的着色器。

但是如果你这么做,渲染器 可能无法对它所有的子节点进行批处理(性能较低)。但是游戏仍然可以正常运行,不会触发任何断言。

总结:

> 保持将所有的精灵放在一张大的 spritesheet 中。

> 使用相同的混合函数(使用默认)

> 使用相同的着色器(使用默认)

> 不要将精灵添加到 SpriteBatchNode


4、优化 LabelTTF / LabelBMFont / LabelAtlas

LabelTTF, LabelBMFont 和 LabelAtlas 将会被新的Label代替。

新的Label 带来的好处有:

> 统一了创建 LabelTTF, LabelBMFont 和 LabelAtlas 的 API 。

> 使用freetype生成labels的纹理,保证了在不同平台下labels有相同的效果。

> 缓存纹理以提高性能。


5、新的事件分发机制

触摸事件,键盘事件,加速器事件和自定义事件等所有事件都由EventDispatcher分发。

TouchDispatcher,KeypadDispatcher,KeyboardDispatcher,AccelerometerDispatcher已被移除。

EventDispatcher 的特性主要有:

> 事件的分发基于渲染顺序

> 所有的事件都由 EventDispatcher 分发

> 可以使用 EventDispatcher 来分发自定义事件

> 可以注册一个 lambda 表达式作为回调函数


6、物理引擎集成

在 v3.0 中,我们把基于 Chipmunk2D 的物理引擎集成到 Cocos2d-x 中,通过这些特性,你可以很容易创建基于物理效果的游戏,而不必去理解物理引擎。


7、其他 API 变更

7.1、ccTypes.h

在 ccType.h 中删除结构命名中的"cc"前缀。

将 全局函数 移至 静态成员函数 ,将 全局常量 移至 静态成员常量 。

| v2.1 struct names       | v3.0 struct names    |

| ccColor3B               | Color3B              |

| ccColor4B               | Color4B              |

| ccColor4F               | Color4F              |

| ccVertex2F              | Vertex2F             |

| ccVertex3F              | Vertex3F             |

| ccTex2F                 | Tex2F                |

| ccPointSprite           | PointSprite          |

| ccQuad2                 | Quad2                |

| ccQuad3                 | Quad3                |

| ccV2F_C4B_T2F           | V2F_C4B_T2F          |

| ccV2F_C4F_T2F           | V2F_C4F_T2F          |

| ccV3F_C4B_T2F           | V3F_C4B_T2F          |

| ccV2F_C4B_T2F_Triangle  | V2F_C4B_T2F_Triangle |

| ccV2F_C4B_T2F_Quad      | V2F_C4B_T2F_Quad     |

| ccV3F_C4B_T2F_Quad      | V3F_C4B_T2F_Quad     |

| ccV2F_C4F_T2F_Quad      | V2F_C4F_T2F_Quad     |

| ccBlendFunc             | BlendFunc            |

| ccT2F_Quad              | T2F_Quad             |

| ccAnimationFrameData    | AnimationFrameData   |

全局函数变更示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//
     // in v2.1
     ccColor3B color3B = ccc3( 0 0 0 );
     ccc3BEqual(color3B, ccc3( 1 1 1 ));
     ccColor4B color4B = ccc4( 0 0 0 0 );
     ccColor4F color4F = ccc4f( 0 0 0 0 );
     color4F = ccc4FFromccc3B(color3B);
     color4F = ccc4FFromccc4B(color4B);
     ccc4FEqual(color4F, ccc4F( 1 1 1 1 ));
     color4B = ccc4BFromccc4F(color4F);
     color3B = ccWHITE;
     
     // in v3.0
     Color3B color3B = Color3B( 0 0 0 );
     color3B.equals(Color3B( 1 1 1 ));
     Color4B color4B = Color4B( 0 0 0 0 );
     Color4F color4F = Color4F( 0 0 0 0 );
     color4F = Color4F(color3B);
     color4F = Color4F(color4B);
     color4F.equals(Color4F( 1 1 1 1 ));
     color4B = Color4B(color4F);
     color3B = Color3B::WHITE;
//

7.2、弃用的函数和全局变量

| v2.1 names          | v3.0 names                |

| ccp                 | Point                     |

| ccpNeg              | Point::-                  |

| ccpAdd              | Point::+                  |

| ccpSub              | Point::-                  |

| ccpMult             | Point::*                  |

| ccpMidpoint         | Point::getMidpoint        |

| ccpDot              | Point::dot                |

| ccpCrosss           | Point::cross              |

| ccpPerp             | Point::getPerp            |

| ccpRPerp            | Point::getRPerp           |

| ccpProject          | Point::project            |

| ccpRotate           | Point::rotate             |

| ccpUnrotate         | Point::unrotate           |

| ccpLengthSQ         | Point::getLengthSq()      |

| ccpDistanceSQ       | Point::getDistanceSq      |

| ccpLength           | Point::getLength          |

| ccpDistance         | Point::getDistance        |

| ccpNormalize        | Point::normalize          |

| ccpForAngle         | Point::forAngle           |

| ccpToAngle          | Point::getAngle           |

| ccpClamp            | Point::getClampPoint      |

| ccpFromSize         | Point::Point              |

| ccpCompOp           | Point::compOp             |

| ccpLerp             | Point::lerp               |

| ccpFuzzyEqual       | Point::fuzzyEqual         |

| ccpCompMult         | Point::Point              |

| ccpAngleSigned      | Point::getAngle           |

| ccpAngle            | Point::getAngle           |

| ccpRotateByAngle    | Point::rotateByAngle      |

| ccpLineInersect     | Point::isLineIntersect    |

| ccpSegmentIntersect | Point::isSegmentIntersect |

| ccpIntersectPoint   | Point::getIntersectPoint  |

| v2.1 names    | v3.0 names   |

| CCPointMake   | Point::Point |

| CCSizeMake    | Size::Size   |

| CCRectMake    | Rect::Rect   |

| PointZero     | Point::ZERO  |

| SizeZero      | Size::ZERO   |

| RectZero      | Rect::ZERO   |

| v2.1 names                      | v3.0 names                         |

| TiledGrid3DAction::tile         | TiledGrid3DAction::getTile         |

| TiledGrid3DAction::originalTile | TiledGrid3DAction::getOriginalTile |

| TiledGrid3D::tile               | TiledGrid3D::getTile               |

| TiledGrid3D::originalTile       | TiledGrid3D::getOriginalTile       |

| Grid3DAction::vertex            | Grid3DAction::getVertex            |

| Grid3DAction::originalVertex    | Grid3DAction::getOriginalVertex    |

| Grid3D::vertex                  | Grid3D::getVertex                  |

| Grid3D::originalVertex          | Grid3D::getOriginalVertex          |

| v2.1 names                                    | v3.0 names                         |

| Configuration::sharedConfiguration            | Configuration::getInstance         |

| Configuration::purgeConfiguration             | Configuration::destroyInstance()   |

| Application::sharedApplication                | Application::getInstance           |

| Director::sharedDirector()                    | Director::getInstance()            |

| FileUtils::sharedFileUtils                    | FileUtils::getInstance             |

| FileUtils::purgeFileUtils                     | FileUtils::destroyInstance         |

| GLView::sharedOpenGLView                      | GLView::getInstance                |

| ShaderCache::sharedShaderCache                | ShaderCache::getInstance           |

| ShaderCache::purgeSharedShaderCache           | ShaderCache::destroyInstance       |

| AnimationCache::sharedAnimationCache          | AnimationCache::getInstance        |

| AnimationCache::purgeSharedAnimationCache     | AnimationCache::destroyInstance    |

| SpriteFrameCache::sharedSpriteFrameCache      | SpriteFrameCache::getInstance      |

| SpriteFrameCache:: purgeSharedSpriteFrameCache| SpriteFrameCache::destroyInstance  |

| NotificationCenter::sharedNotificationCenter  | NotificationCenter::getInstance    |

| NotificationCenter:: purgeNotificationCenter  | NotificationCenter::destroyInstance|

| Profiler::sharedProfiler                      | Profiler::getInstance              |

| UserDefault::sharedUserDefault                | UserDefault::getInstance           |

| UserDefault::purgeSharedUserDefault           | UserDefault::destroyInstance       |

| v2.1 names        | v3.0 names                    |

| ccc3()            | Color3B()                     |

| ccc3BEqual()      | Color3B::equals()             |

| ccc4()            | Color4B()                     |

| ccc4FFromccc3B()  | Color4F()                     |

| ccc4f()           | Color4F()                     |

| ccc4FFromccc4B()  | Color4F()                     |

| ccc4BFromccc4F()  | Color4B()                     |

| ccc4FEqual()      | Color4F::equals()             |

| ccWHITE           | Color3B::WHITE                |

| ccYELLOW          | Color3B::YELLOW               |

| ccBLUE            | Color3B::BLUE                 |

| ccGREEN           | Color3B::GREEN                |

| ccRED             | Color3B::RED                  |

| ccMAGENTA         | Color3B::MAGENTA              |

| ccBLACK           | Color3B::BLACK                |

| ccORANGE          | Color3B::ORANGE               |

| ccGRAY            | Color3B::GRAY                 |

| kBlendFuncDisable | BlendFunc::BLEND_FUNC_DISABLE |


8、新的数据结构

> cocos2d::Map<>    替代了 CCDictionary

> cocos2d::Vector<> 替代了 CCArray

> cocos2d::Value    替代了 CCBool, CCFLoat, CCDouble

cocos2dx-3.x ——2.x 到3.x变化相关推荐

  1. cocos2d-x 3.10 PageView BUG

    cocos2d-x 3.10 PageView 拖动滚动到下一个单元,没事件,3.11有修复. 转载于:https://www.cnblogs.com/qianwang/p/6106324.html

  2. cocos2d-x 音效中断问题

    做跑酷重吃金币播音效时,播放其它音效会使得音效所有中断,最后发现时音效上限的问题,2.2.3默认的似乎是5个音效,改动成50后问题解决. 在java中的org.cocos2dx.lib包下有一个Coc ...

  3. [转]cocos2d-x

    Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,基于Cocos2d-iphone,支持 WOPhone, iOS 4.1, Android 2. ...

  4. 怎样用cocos2d-x做一个基于地图块的游戏(Part One)

    怎样用cocos2d-X做一个基于地图块的游戏 (Part One) 在这个分为上下两部分的教程中,我们将介绍如何使用Cocos2D-X和地图编辑器做一款基于地图块的游戏.在这个简单的地图块游戏里,一 ...

  5. 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题

    笔者今天发现导入cocostudio的ui界面时,会有部分控件出现错位的现象,后来我看了一下源码,发现是部分控件是没有继承 Layout类,导致不能设置控件位置造成,原因可以看看cocos2dx 源码 ...

  6. 如何将cocos2d-x程序分别移植到ios,android,windowsphone三个手机平台上

    作者:方格子 链接:https://www.zhihu.com/question/21505500/answer/22152464 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  7. Adobe源码泄漏?3行代码搞定,Flash动画无缝导入Android/iOS/cocos2dx(二)

    [注] iOS代码已重构,效率提升90%,200层动画不卡.[2016.10.27] 上一篇 点此阅读 简要介绍了FlashToAnimation的功能,也就是将flash动画无缝导入到Android ...

  8. Adobe源码泄漏?3行代码搞定,Flash动画无缝导入Android/iOS/cocos2dx(一)

    [注] iOS代码已重构,效率提升90%,200层动画不卡.[2016.10.27] 项目介绍 项目名称:FlashAnimationToMobile 源码. 使用方法点这里. 这是一个把flash中 ...

  9. 【iOS-cocos2d-X 游戏开发之十四】cocos2dx(c++)中访问object函数

    Cocos2dx系列博文的上一篇详细介绍了如何在Xcode中利用jni调用Android的Java层代码,还没有看过的童鞋,请移步到如下博文: [iOS-cocos2d-X 游戏开发之十三]详细讲解在 ...

  10. Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉虫记之控制场景文件中的骨骼动画

    Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉虫记之控制场景文件中的骨骼动画 引子 这段时间一直努力在把早期版本的拇指接龙游戏(Cocos2d-x 2.2.3+CocoStud ...

最新文章

  1. 电脑耳机声音小怎么调大_录自媒体vlog视频声音小怎么办,看兰哥怎样不花钱就解决...
  2. ubuntu共享文件夹或文件等右下角一把锁的标志【终极解除右下角锁的方法】
  3. SharePoint 入门介绍
  4. tcp实时传输kafka数据_关于Kafka producer管理TCP连接的讨论
  5. c++ const
  6. e.target与e.e.srcElement
  7. 【语音播放】基于matlab GUI MP3设计【含Matlab源码 425期】
  8. 微信公众平台开发(111) 现金红包、裂变红包、企业付款
  9. 请画出使用mapreduce对英文句子_英文写作中有哪些常见的标点符号问题?小心你的essay会被教授diss不专业...
  10. 什么是绝对URL、相对URL
  11. js 流文件下载zip压缩包
  12. Photoshop调出田园照片唯美手绘油画效果
  13. rmmod命令卸载驱动后重启后为什么驱动还在? 安排!
  14. [NACOS HTTP-POST] The maximum number of tolerable server reconnection errors has been reached
  15. 至少12亿元收支差,分析运营商7大数据产品应用
  16. 测试方法——因果图法和判定表法
  17. 采药(洛谷P1048)
  18. 网络爬虫爬取b站励志弹幕并生成词云(精心笔记总结)
  19. 关于死锁你了解多少,通过“让APP随手机壳改变颜色,程序员和产品经理大家”这一事,了解下死锁可好?
  20. web前端与后台数据交互

热门文章

  1. 发布全部开源的Asp.net 2.0 RBAC 权限管理系统了,大家支持下。
  2. error C2679: binary ''
  3. 博图14软件安装顺序_请教关于博途软件中各个部分的安装顺序和注意事项。
  4. 开源微信小程序自助建站系统源码 含精美的多行业模板和搭建教程
  5. 基于MATLAB图像处理的恶劣天气自动车牌识别
  6. PVE 安装群晖转换img镜像引导
  7. 防止刷单杜绝薅羊毛:语音验证码和短信验证码及最新一键登录(秒验点验)解决思路
  8. Poj 1050 c++:To the Max
  9. 高大上的“区块链”离生活有多远?来看国家超算济南中心专家解码!
  10. 分形——自然界的几何学 (转)