Cocos2d-x v3.3alpha0 Released!
来源:互联网 发布:java web框架有哪些 编辑:程序博客网 时间:2024/04/30 01:15
We are happy to announce that cocos2d-x v3.3 alpha0 is released.
Download
There is not zip file to download. You should get it from github like this
git clone https://github.com/cocos2d/cocos2d-x.git cd cocos2d-xgit checkout -b v3.3alpha0 cocos2d-x-3.3alpha0./download-deps.py
Highlights of v3.3alpha0
- 3d:
Camera
, 'Reskin', 'Attachment', 'Better support for FBX', 'New fbx-conv',AABB
,OBB
andRay
- ui: added
Scale9Sprite
- FileUitls: added
isDirectoryExist()
,createDirectory()
,removeDirectory()
,removeFile()
,renameFile()
andgetFileSize()
- Device: added
setKeepScreenOn()
on iOS and Android - Added c++11 random support
- RenderTexture: added a call back function for
saveToFile()
- Primitive: Support Points, Lines and Triagles for rendering
- SpriteFrameCache: support loading from plist file content data
- Added a consistent way to set GL context attributes for all platforms
- Only two libraries in cocos2d-x, one for c++ codes, another one for lua-binding codes
- Many other small features added and many bugs fixed
Features in detail
Camera
This version of camera is powerful then previous one. And you can add it as a child anywhere. If you want to let a Node to be visited by a camera, Node's camera mask should include Camera's flag:
// let sprite to be visited by a cameraauto sprite = Sprite::create("myFile.png");sprite->setCameraMask(CameraFlag::USER1);auto camera = Camera::createPerspective(60, winSize.width/winSize.height, 1, 1000);camera->setCameraFlag(CameraFlag::USER1);scene->addChild(camera);
If you have many Nodes that want to be visited by a camera, there is a convenient way:
auto layer = Layer::create();auto sprite1 = Sprite::create();auto sprite2 = Sprite::create();layer->addChild(sprite1);layer->addChild(sprite2);// it will set camera mask for all its childrenlayer->setCameraMask(CameraFlg::USER1); auto camera = Camera::createPerspective();camera->setCameraFlag(CameraFlag::USER1);scene->addChild(camera);
Full test case please refer to tests/cpp-tests/res/Camera3DTest/Camera3DTest.cpp
.
Reskin
It is a powerful feature, all the user change the appearance of character.
For example, there a model named girl.c3b, which has two coats, coat0 and coat1.
The character's coat can be changed like this,
//load the girl from fileauto sprite3d = Sprite3D::create("girl.c3b");//get the mesh named coat0auto mesh0 = sprite3d->getMeshByName("coat0");//you can change texture of this mesh if you likemesh0->setTexture("cloth.png");//you can change visibility for this mesh, toomesh0->setVisible(true);//hide coat1auto mesh1 = sprite3d->getMeshByName("coat1");mesh1->setVisible(false);
Full test case please refer to 'tests/cpp-tests/Classes/Spret3DTest/Sprite3DTest.cpp'
Attachment
Allows to attach a node to a bone
Usage,
auto sprite = Sprite3D::create("girl.c3b");auto weapon = Sprite::create("weapon.c3b");auto attachNode = sprite->getAttachNode("left_hand");attachNode->addChild(weapon);
Full test case please refer to 'tests/cpp-tests/Classes/Spret3DTest/Sprite3DTest.cpp'
Better support for FBX
support multiple mesh
support multiple material
bones bind to each mesh limited to 40. But the FBX model can contain more meshes. So the model can contain much more bones.
New fbx-conv
It can export more complex model, which contains multiple meshes and multiple materials.
AABB, OBB and Ray
AABB means Axis Aligned Bounding Box
OBB means Oriented Bounding Box
Ray has a origin position and direction
Each Sprite3D or Mesh has its own AABB.
AABB and OBB can be picked by Ray.
Usage,
//get ray from cameraVec3 nearP(location.x, location.y, -1.0f), farP(location.x, location.y, 1.0f); auto size = Director::getInstance()->getWinSize();camera->unproject(size, &nearP, &nearP);camera->unproject(size, &farP, &farP);ray._origin = nearP;ray._direction = farP - nearP;ray.intersects(sprite3d->getAABB( ) );
Full test case please refer to 'tests/cpp-tests/Classes/Spret3DTest/Sprite3DTest.cpp'
ui::Scale9Sprite
Now we have implemented a new Scale9Sprite class under ui module. Its internal implementation is concise than the previous one plus more features.
The main reason of reimplementing this class is that the Scale9Sprite is heavily used in ui module. Now the ui module is not dependent from extension module.
By applying the new ui::Scale9Sprite, the code inside many widget classes are more cleaner and elegant.
We could manually toggle "slice 9" feature by one function call:
//ui::Scale9Sprite is slice 9 enabled on defaultauto sprite = ui::Scale9Sprite::create("foo.png");sprite->setScale9Enabled(false);
It also supports Flipping now.
auto sprite = ui::Scale9Sprite::create("bar.png");sprite->setFlippedX(true);sprite->setFlippedY(false);
Since the ui::Scale9Sprite is a Node rather than a Sprite, so you can't add it to a batch node. If you do want to do some actions on the internal sprite,
you could call sprite->getSprite()
to access it.
Full test case please refer to tests/cpp-tests/Classes/UITests/CocostudioGUITest/UIScale9SpriteTest.cpp
.
c++11 random support
Since rand()
is not good(refer to this document25), we use c++11 random library to do generate random number, and provide a function to easily using:
int randInt = cocos2d::random(1, 10);float randFloat = cocos2d::random(1.f, 10.f);
RenderTexture save function
RenderTexture::saveToFile()
will not save rendertexture when the function returns, because it just send render command to renderer. The file will be saved after render command is executed. It is not convenient if you want to use the saved file to do some work. So we added a parameter in RenderTexture::saveToFile()
to set a call back function when the file is saved.
renderTexture->begin();...renderTexture->end();renderTexture->saveToFile("myFile.png", true, callback);
Primitive
Primitive
is added to support Points
,Lines
,Triangles
rendering. Previously, if we want to draw a custom geometry(sphere, line), we can only do this by usingCustomCommand
. Now, what is need is to create a Primitive, set datas, and use the correspondingPrimitiveCommand
to draw the Primitive.
Here is a simple example of rendering a quad in Sprite
.
- create verexBuffer
auto vertexBuffer = VerexBuffer::create(sizeof(V3F_C4B_T2F), 4);vertexBuffer->updateVertices(&_quad, 4, 0);
- create vertexData
auto vertexData = VertexData::create();vertexData->addStream(vertexBuffer, VertexStreamAttribute(0, VERTEX_ATTRIB_POSITION, GL_FLOAT, 3, fasle));vertexData->addStream(vertexBuffer, VertexStreamAttribute(12, VERTEX_ATTRIB_COLOR, GL_UNSIGNED_BTYE, 4, true));vertexData->addStream(vertexBuffer, VertexStreamAttribute(16, VERTEX_ATTRIB_TEX_COORD, GL_FLOAT, 2, fasle));
- create IndexBuffer
auto indexBuffer = IndexBuffer::create(IndexType::INDEX_TYPE_SHORT_16, 6);short indices[6] = {0,1,2,3,2,1};indexBuffer->updateIndices(indices,6, 0);
- create primitive
auto primitve = Primitive::create(vertexData, indexBuffer, GL_TRIANGLES);primitive->setStart(0);primitive->setCount(6);
- add command to renderer
_command->init(globalZorder,textureID, glprogramState, blend, primitve, modelViewMatrix);renderer->addCommand(&_command);
Primitive supports three typs of primitives (POINTS, LINES, TRIANGLES), vertex and index sharing, multiple streams. It has some constrains:
- The size of vertex and index Buffer is fixed, which means data must be pre allocated.
- Batching is not supported.
Consistent way to set GL context attributes
Now you can set GL context attributes by override Application::initGLContextAttrs()
, then set GL context attributes there.
void AppDelegate::initGLContextAttrs(){ // r:8 g:8 a:8 depth:24 stencil:8 GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; GLView::setGLContextAttrs(glContextAttrs);}
Now can only support setting bits of r
, g
, b
,a
, depth buffer
and stencil buffer
. We will support other attributes if needed.
Only two libraries left
Now there are two libraries left: one for all c++ codes and another one for lua-bindings codes.
If you are developing with c++, you only have to link to libcocos2d
.libcocos2d
includes all c++ codes:
- cocos2d(including 2d and 3d)
- network
- cocosstudio
- ui
- cocosbuilder
- spine
- chipmunk
- box2d
- ...
Not used codes will be stripped by linker.
If you are developing with lua, you should link to libcocos2d
andlibluacocos2d
. You can comment codes in lua_module_register.h
if you don't want a module.
int lua_module_register(lua_State* L){ register_cocosdenshion_module(L); // comment this line to remove cocosdenshion register_network_module(L); // comment this line to remove network register_cocosbuilder_module(L); // comment this line to remove cocosbuilder register_cocostudio_module(L); // comment this line to remove cocostudio register_extension_module(L); // comment this line to remove extension register_ui_moudle(L); // comment this line to remove ui register_spine_module(L); // comment this line to remove spine register_cocos3d_module(L); // comment this line to remove 3d return 1;}
More information
For further information please read:
- Release Notes41, with detailed information of the new API.
- Full Changelog43
We would appreciate if you can test this version and report any possible bugs.
Thank you!
- Cocos2d-x v3.3alpha0 Released!
- Cocos2d-x v3.3beta0 Released!b
- cocos2d-x v3.0 pre-alpha0 尝鲜体验!
- Mac搭建Cocos2d-x v3.2alpha0 Android开发环境
- cocos2d-x-3.0alpha0
- 制作飞镖忍者(3) Cocos2d-x 3.0alpha0
- cocos2d-x v3.3 ActionInterval
- cocos2d-x 3.5 RELEASED 探索
- cocos2d-x v3.3 Hide and Show
- Cocos2d-x v3.3的颜色混合BlendFunc
- cocos2d-x v3.3开发环境配置
- Quick-cocos2d-x v3.3 SocketTCP链接
- 如何使用CCRenderTexture创建动态纹理 cocos2d-x-3.0alpha0
- 如何制作一个塔防游戏 Cocos2d-x 3.0alpha0
- 制作飞镖忍者(1) Cocos2d-x 3.0alpha0
- 制作飞镖忍者(2) Cocos2d-x 3.0alpha0
- cocos2d-x-3.2alpha0 如何创建新工程
- 在Windows7上搭建Cocos2d-x 3.2alpha0开发环境
- Cocos2d-x v3.3beta0 Released!b
- IOS中http请求数据的解析以及http状态码的获取
- android 屏幕旋转
- [开发总结]WebView使用中遇到的一些问题&解决
- [Tips]使用 pip v1.5 安装 MySQL Connector/Python
- Cocos2d-x v3.3alpha0 Released!
- 对重构的理解
- Cocos2d-x v3.x官方文档】自动批处理(Auto-batching)
- oracle学习之路(二、存储过程)
- 字符串移位
- 不同数据库中时间类型的总结
- 西门子PLC学习笔记五-(编程语言、数据类型)
- Eclipse/My Eclipse 主题
- Qt 程序在linux下的发布