2014-08-21 14:11:43 +08:00
# cocos2d-x v3.3alpha0 Release Notes #
2014-01-07 08:33:14 +08:00
2014-01-07 08:26:48 +08:00
**Table of Contents** *generated with [DocToc](http://doctoc.herokuapp.com/)*
2014-08-25 10:56:22 +08:00
- [cocos2d-x v3.3alpha0 Release Notes ](#user-content-cocos2d-x-v33alpha0-release-notes )
2014-05-20 08:02:30 +08:00
- [Misc Information ](#user-content-misc-information )
- [Requirements ](#user-content-requirements )
- [Runtime Requirements ](#user-content-runtime-requirements )
- [Compiler Requirements ](#user-content-compiler-requirements )
- [How to run tests ](#user-content-how-to-run-tests )
2014-06-17 21:18:08 +08:00
- [Mac OSX & iOS ](#user-content-mac-osx--ios )
- [Android ](#user-content-android )
- [Windows ](#user-content-windows )
- [Linux ](#user-content-linux )
2014-05-20 08:02:30 +08:00
- [How to start a new game ](#user-content-how-to-start-a-new-game )
2014-08-25 10:56:22 +08:00
- [Highlights of v3.3alpha0 ](#user-content-highlights-of-v33alpha0 )
2014-05-20 08:02:30 +08:00
- [Features in detail ](#user-content-features-in-detail )
2014-08-25 10:56:22 +08:00
- [Camera ](#user-content-camera )
- [Reskin ](#user-content-reskin )
- [Attachment ](#user-content-attachment )
- [Better support for FBX ](#user-content-better-support-for-fbx )
- [New fbx-conv ](#user-content-new-fbx-conv )
- [AABB, OBB and Ray ](#user-content-aabb-obb-and-ray )
- [ui::Scale9Sprite ](#user-content-uiscale9sprite )
- [c++11 random support ](#user-content-c11-random-support )
- [RenderTexture save function ](#user-content-rendertexture-save-function )
- [Primitive ](#user-content-primitive )
- [Consistent way to set GL context attributes ](#user-content-consistent-way-to-set-gl-context-attributes )
2014-08-27 14:09:06 +08:00
- [Only two libraries left ](#user-content-only-two-libraries-left )
2014-05-20 08:02:30 +08:00
2014-01-07 08:23:06 +08:00
# Misc Information
2014-08-21 14:11:43 +08:00
* Full Changelog: https://github.com/cocos2d/cocos2d-x/blob/cocos2d-x-3.3alpha0/CHANGELOG
2014-05-20 07:56:33 +08:00
* v3.0 Release Notes can be found here: [v3.0 Release Notes ](https://github.com/cocos2d/cocos2d-x/blob/cocos2d-x-3.0/docs/RELEASE_NOTES.md )
2014-01-07 08:23:06 +08:00
# Requirements
## Runtime Requirements
* Android 2.3 or newer
* iOS 5.0 or newer
* OS X 10.7 or newer
* Windows 7 or newer
2014-05-20 07:56:33 +08:00
* Windows Phone 8 or newer
2014-07-06 20:53:17 +08:00
* Linux Ubuntu 14.04 or newer
2014-01-07 08:23:06 +08:00
* ~~Browsers via Emscripten~~ N/A for the moment
## Compiler Requirements
2014-07-16 11:26:21 +08:00
* Xcode 5.1 or newer for iOS or Mac
2014-07-06 20:53:17 +08:00
* gcc 4.9 or newer for Linux
2014-08-21 14:11:43 +08:00
* ndk-r9d for Android
2014-05-20 07:56:33 +08:00
* Visual Studio 2012 or newer for Windows (win32)
* Visual Studio 2012 or newer for Windows Phone 8
2014-01-07 08:23:06 +08:00
2014-04-21 14:50:27 +08:00
## How to run tests
2014-03-04 18:15:30 +08:00
### Mac OSX & iOS
* Enter `cocos2d-x/build` folder, open `cocos2d_test.xcodeproj`
* Select `iOS` or `OS X` target in scheme toolbar
* Click `run` button
### Android
2014-03-07 08:37:33 +08:00
You can run the samples...
2014-03-04 18:15:30 +08:00
2014-03-07 08:37:33 +08:00
**Using command line:**
2014-03-04 18:15:30 +08:00
$ cd cocos2d-x
2014-03-06 14:44:33 +08:00
$ ./setup.py
2014-03-04 18:15:30 +08:00
$ cd build
2014-03-14 15:01:11 +08:00
$ ./android-build.py cpp-empty-test -p 10
$ adb install cocos2d-x/tests/cpp-empty-test/proj.android/bin/CppEmptyTest-debug.apk
2014-03-04 18:15:30 +08:00
Then click item on Android device to run tests. Available value of `-p` is the API level, cocos2d-x supports from level 10.
2014-03-07 08:37:33 +08:00
**Using Eclipse:**
2014-03-04 18:15:30 +08:00
$ cd cocos2d-x
2014-03-06 14:44:33 +08:00
$ ./setup.py
2014-03-04 18:15:30 +08:00
$ cd build
2014-03-14 15:01:11 +08:00
$ ./android-build.py cpp-empty-test -p 10
2014-03-04 18:15:30 +08:00
Then
* Import cocos2d-x Android project into Eclipse, the path used to import is `cocos/2d/platform/android`
2014-03-14 15:01:11 +08:00
* Import `cpp-empty-test` Android project into Eclipse, the path used to import is `tests/cpp-empty-test/proj.android`
* Build `cpp-empty-test` Android project and run
2014-03-04 18:15:30 +08:00
### Windows
* Enter `cocos2d-x/build` , and open `cocos2d-win32.vs2012.sln`
2014-03-14 15:01:11 +08:00
* Select `cpp-empty-test` as running target
2014-03-04 18:15:30 +08:00
* Click run button
### Linux
$ cd cocos2d-x/build
$ ./install-deps-linux.sh
$ cd ../..
Then
$ mkdir build
$ cd build
2014-03-14 15:01:11 +08:00
$ cmake ../cocos2d-x
2014-03-04 18:15:30 +08:00
$ make -j4
Run
2014-03-14 15:01:11 +08:00
$ cd bin/cpp-empty-test
$ ./cpp-empty-test
2014-03-04 18:15:30 +08:00
2014-03-06 14:44:33 +08:00
## How to start a new game
2014-05-20 08:05:05 +08:00
Please refer to this document: [ReadMe ](../README.md )
2014-03-04 18:15:30 +08:00
2014-08-21 14:11:43 +08:00
# Highlights of v3.3alpha0
2014-01-07 08:23:06 +08:00
2014-08-22 18:14:33 +08:00
* 3d: `Camera` , 'Reskin', 'Attachment', 'Better support for FBX', 'New fbx-conv', `AABB` , `OBB` and `Ray`
2014-08-21 14:11:43 +08:00
* ui: added `Scale9Sprite`
* FileUitls: added `isDirectoryExist()` , `createDirectory()` , `removeDirectory()` , `removeFile()` , `renameFile()` and `getFileSize()`
* Device: added `setKeepScreenOn()` on iOS and Android
* Added c++11 random support
* RenderTexture: added a call back function for `saveToFile()`
2014-08-23 15:10:59 +08:00
* Primitive: Support Points, Lines and Triagles for rendering
2014-08-21 14:11:43 +08:00
* SpriteFrameCache: support loading from plist file content data
2014-08-25 10:28:07 +08:00
* Added a consistent way to set GL context attributes for all platforms
2014-08-27 14:06:54 +08:00
* Only two libraries in cocos2d-x, one for c++ codes, another one for lua-binding codes
2014-08-21 14:11:43 +08:00
* Many other small features added and many bugs fixed
2014-01-07 08:23:06 +08:00
2014-07-06 20:53:17 +08:00
# Features in detail
2014-01-07 08:23:06 +08:00
2014-08-21 14:11:43 +08:00
## Camera
2014-01-07 08:23:06 +08:00
2014-08-21 14:11:43 +08:00
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:
2014-01-07 09:04:12 +08:00
2014-08-21 14:11:43 +08:00
```c++
// let sprite to be visited by a camera
auto 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);
2014-01-07 08:23:06 +08:00
```
2014-07-06 20:53:17 +08:00
2014-08-21 14:11:43 +08:00
If you have many Nodes that want to be visited by a camera, there is a convenient way:
2014-07-06 20:53:17 +08:00
2014-07-15 14:43:40 +08:00
```c++
2014-08-21 14:11:43 +08:00
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 children
layer->setCameraMask(CameraFlg::USER1);
auto camera = Camera::createPerspective();
camera->setCameraFlag(CameraFlag::USER1);
scene->addChild(camera);
2014-07-15 14:43:40 +08:00
```
2014-07-06 20:53:17 +08:00
2014-08-21 14:11:43 +08:00
Full test case please refer to `tests/cpp-tests/res/Camera3DTest/Camera3DTest.cpp` .
2014-07-06 20:53:17 +08:00
2014-08-22 18:08:26 +08:00
## 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,
```c++
//load the girl from file
auto sprite3d = Sprite3D::create("girl.c3b");
//get the mesh named coat0
auto mesh0 = sprite3d->getMeshByName("coat0");
//you can change texture of this mesh if you like
mesh0->setTexture("cloth.png");
//you can change visibility for this mesh, too
mesh0->setVisible(true);
//hide coat1
auto 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,
```c++
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.
2014-08-21 14:11:43 +08:00
## AABB, OBB and Ray
2014-07-06 20:53:17 +08:00
2014-08-22 18:08:26 +08:00
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,
```c++
//get ray from camera
Vec3 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'
2014-07-06 20:53:17 +08:00
2014-08-21 14:11:43 +08:00
## ui::Scale9Sprite
2014-05-20 12:07:43 +08:00
2014-08-21 15:03:50 +08:00
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:
```c++
//ui::Scale9Sprite is slice 9 enabled on default
auto sprite = ui::Scale9Sprite::create("foo.png");
sprite->setScale9Enabled(false);
```
It also supports Flipping now.
```c++
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` .
2014-05-20 12:07:43 +08:00
2014-08-21 14:11:43 +08:00
## c++11 random support
2014-07-06 20:53:17 +08:00
2014-08-21 14:11:43 +08:00
Since `rand()` is not good(refer to [this document ](http://c-faq.com/lib/randrange.html )), we use c++11 random library to do generate random number, and provide a function to easily using:
2014-05-20 12:07:43 +08:00
```c++
2014-08-21 14:11:43 +08:00
int randInt = cocos2d::random(1, 10);
float randFloat = cocos2d::random(1.f, 10.f);
2014-05-20 12:07:43 +08:00
```
2014-01-07 08:23:06 +08:00
2014-08-21 14:11:43 +08:00
## RenderTexture save function
2014-01-07 08:23:06 +08:00
2014-08-21 14:11:43 +08:00
`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.
2014-07-06 20:53:17 +08:00
```c++
2014-08-21 14:11:43 +08:00
renderTexture->begin();
2014-07-06 20:53:17 +08:00
...
2014-08-21 14:11:43 +08:00
renderTexture->end();
2014-07-15 14:43:40 +08:00
2014-08-21 14:11:43 +08:00
renderTexture->saveToFile("myFile.png", true, callback);
2014-07-15 14:43:40 +08:00
```
2014-08-23 15:10:59 +08:00
## 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 using `CustomCommand` . Now, what is need is to create a Primitive, set datas, and use the corresponding `PrimitiveCommand` to draw the Primitive.
Here is a simple example of rendering a quad in `Sprite` .
1. create verexBuffer
```c++
auto vertexBuffer = VerexBuffer::create(sizeof(V3F_C4B_T2F), 4);
vertexBuffer->updateVertices(& _quad, 4, 0);
```
2. create vertexData
```c++
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));
```
3. create IndexBuffer
```c++
auto indexBuffer = IndexBuffer::create(IndexType::INDEX_TYPE_SHORT_16, 6);
short indices[6] = {0,1,2,3,2,1};
indexBuffer->updateIndices(indices,6, 0);
```
4. create primitive
```c++
auto primitve = Primitive::create(vertexData, indexBuffer, GL_TRIANGLES);
primitive->setStart(0);
primitive->setCount(6);
```
5. add command to renderer
```c++
_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:
1. The size of vertex and index Buffer is fixed, which means data must be pre allocated.
2. Batching is not supported.
2014-08-25 10:28:07 +08:00
## Consistent way to set GL context attributes
Now you can set GL context attributes by override `Application::initGLContextAttrs()` , then set GL context attributes there.
```c++
void AppDelegate::initGLContextAttrs()
{
// r:8 g:8 a:8 depth:24 stencil:8
GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8};
GLView::setGLContextAttrs(glContextAttrs);
}
```
2014-08-25 10:56:22 +08:00
Now can only support setting bits of `r` , `g` , `b` , `a` , `depth buffer` and `stencil buffer` . We will support other attributes if needed.
2014-08-27 14:06:54 +08:00
## 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` and `libluacocos2d` . You can comment codes in `lua_module_register.h` if you don't want to some module.
```c++
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;
}
```