这几天想玩一下cocos2dx3.9新版本的东西,但是公司电脑配置不够,开个vs2012都卡的不行,更别提高版本的了。因为cocos2dx-3.9中使用了好多c++11的规范,而vs2012有好多C++11规范不支持,所以生成解决方案失败。只需要修改一些代码的写法就可以了,C++11规范的写法只是新奇了一些,编译器不支持,换个写法我们照样可以实现。下面是代码的修改对比。
---------------------------------------------------------------------------------------------------------
第一处:
NavMeshTest.cpp中:
void NavMeshBaseTestDemo::createAgent(const Vec3 &pos)
{
...
AgentUserData *data = new AgentUserData{ 0.0f };
...
}
改成:
void NavMeshBaseTestDemo::createAgent(const Vec3 &pos)
{
...
AgentUserData *data = new AgentUserData; data->time = 0.0f;
...
}
--------------------------------------------------------------------------------------------------------
第二处:
DrawPrimitivesTest.cpp中:
PrimitivesCommandTest::PrimitivesCommandTest()
{
// draws a quad
V3F_C4B_T2F data[] = {
{{0, 0,0}, {255, 0, 0,255}, {0,1}},
{{200, 0,0}, {0, 255,255,255}, {1,1}},
{{200,200,0}, {255,255, 0,255}, {1,0}},
{{0, 200,0}, {255,255,255,255}, {0,0}},
};
...
}
改成:
PrimitivesCommandTest::PrimitivesCommandTest()
{
V3F_C4B_T2F data[4];
data[0].vertices = Vec3(0,0,0); data[0].colors = Color4B(255,0,0,255); data[0].texCoords = Tex2F(0,1);
data[1].vertices = Vec3(200,0,0); data[1].colors = Color4B(0,255,255,255); data[1].texCoords = Tex2F(1,1);
data[2].vertices = Vec3(200,200,0); data[2].colors = Color4B(255,255,0,255); data[2].texCoords = Tex2F(1,0);
data[3].vertices = Vec3(0,200,0); data[3].colors = Color4B(255,255,255,255); data[3].texCoords = Tex2F(0,0);
...
}
上面两处修改中原来的版本用到了C++11中初始化列表(Initializer lists)的部分。这个构想是结构或是数组能够依据成员在该结构内定义的顺序通过给予的一串引数来产生。这些初始化列表是递归的,所以结构的数组或是包含其他结构的结构可以使用它们。这对静态列表或是仅是把结构初始化为某值而言相当有用。C++有构造函数,能够重复对象的初始化。但单单只有那样并不足以取代这项特色的所有机能。在C++03中,只允许在严格遵守POD的定义和限制条件的结构及类型上使用这项机能,非POD的类型不能使用,就连相当有用的STL容器std::vector也不行。C++11将会把初始化列表的概念绑到类型上,称作std::initializer_list。这允许构造函数或其他函数像参数般地使用初始化列表。因为初始化列表是真实类型,除了类型构造式之外还能够被用在其他地方。正规的函数能够使用初始化列表作为引数。vs2013及以上版本支持初始化列表功能,但是vs2012不支持。
--------------------------------------------------------------------------------------------------------
第三处:
ActionManagerTest.h中
class StopActionsByFlagsTest : public ActionManagerTest
{
...
const unsigned int kMoveFlag = 0x01;
const unsigned int kScaleFlag = 0x02;
const unsigned int kRotateFlag = 0x04;
const unsigned int kRepeatForeverFlag = 0x08;
};
改成:
// 并将类成员的初始化放到构造函数初始化列表中
class StopActionsByFlagsTest : public ActionManagerTest
{
StopActionsByFlagsTest::StopActionsByFlagsTest()
: kMoveFlag(0x01)
, kScaleFlag(0x02)
, kRotateFlag(0x04)
, kRepeatForeverFlag(0x08)
{
}
...
const unsigned int kMoveFlag;
const unsigned int kScaleFlag;
const unsigned int kRotateFlag;
const unsigned int kRepeatForeverFlag;
};
这里原来的版本用到了C++11中非静态成员初始化(Non-static data member initializers)的部分,在C++11标准中,类的非静态成员可以在类的定义中声明并直接初始化类的非静态成员初始化。vs2013中支持这个部分,但是vs2012不支持所以将初始化放到构造函数中。