Cách sử dụng PhysicsEditor trong cocos2d-x

  1. giớ thiệu về PhysicsEditor

PhysicsEditor là một phần mềm dùng để vẽ hình dạng cho các đối tượng vật lý trong các engine game . Đây là một phần mềm hữu dụng giúp chúng ta xác định hình dạng cho các đối tượng vật lý trong game một cách dễ dàng . Các điểm mạnh của phần mềm này :

  • Vẽ hình cho các đối tượng vật lý trong một khoảng thời gian ngắn nhất ,chưa đến một phút .
  • Nội dung hướng dẫn chi tiết dễ hiểu có source nguồn demo sẵn giúp chúng ta sử dụng dễ dàng. -Hỗ trợ nhiểu engine game như : cocos2d, cocos2d-x, ulity, andengine, Flash/As3 , html5 … Phần mềm này có thể chạy trên nền tảng MacOS từ 10.6 trở lên , windows XP , win 7, win 8 .
  1. cách dùng physicsEditor trong cocos2d-x

https://github.com/AndreasLoew/PhysicsEditor-Cocos2d-x-Box2d/blob/master/Demo/generic-box2d-plist/GB2ShapeCache-x.ccp

hai file dùng để đọc dữ liệu từ file .plist để vẽ hình dạng cho các đối tượng vật lý.

  • Trong hàm khởi tạo game ta thêm dòng code sau để load file .plist lên

// load physics shapes

GB2ShapeCache::sharedGB2ShapeCache()->addShapesWithFile(“filename.plist”);

Trong hàm addNewSpritePhysics thông thường ta phải viết thế này để tạo một đối tượng vật lý

CCSprite *sprite = CCSprite::create(“ninja_attack.png”);this->addChild(sprite, 1000);sprite->setPosition( CCPointMake( p.x, p.y) );
// Define the dynamic body.
//Set up a 1m squared box in the physics

worldb2BodyDef bodyDef;bodyDef.type = b2_dynamicBody;bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);

bodyDef.userData = sprite;

b2Body *body = world->CreateBody(&bodyDef);

// Define another box shape for our dynamic body.

b2PolygonShape dynamicBox;

//dưới đây là mảng toạ độ của các điểm tạo nên đa giác bao quanh đối tượng vật lý mà ta dùng làm hình dạng của nó

b2Vec2 vertices[4];

vertices[0].Set(-1.2f, -1.2f);

vertices[1].Set(1.2f, -1.2f);

vertices[2].Set(1.2f, 1.2f);

vertices[3].Set(-1.2f, 1.2f);

int32 count = 4;

b2PolygonShape polygon;

dynamicBox.Set(vertices, count);

// Define the dynamic body fixture.

b2FixtureDef fixtureDef;

fixtureDef.shape = &dynamicBox;

fixtureDef.density = 4.0f;

fixtureDef.friction = 1.0f;

fixtureDef.restitution = 0;

body->CreateFixture(&fixtureDef);

Nếu dùng PhysicEditor thì ta chỉ cần viết code ngắn gọn thế này :

CCSprite *sprite = CCSprite::create((name+”.png”).c_str());
sprite->setPosition(p);
addChild(sprite);
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
bodyDef.userData = sprite;
b2Body *body = world->CreateBody(&bodyDef);
// add the fixture definitions to the body
GB2ShapeCache *sc = GB2ShapeCache::sharedGB2ShapeCache();
sc->addFixturesToBody(body, name);
sprite->setAnchorPoint(sc->anchorPointForShape(name));

Dưới đây là link source demo và hướng dẫn dùng PhysicsEditor

http://www.codeandweb.com/physicseditor

https://github.com/AndreasLoew/PhysicsEditor-Cocos2d-x-Box2d