Cocos2d-x 3.2 Final

Cập nhật lên phiên bản Cocos2d-x 3.2. Bổ sung 3D sprite, 3D animation, game controller, fast Tilemap,..v...v... Cập nhật thường xuyên nhé

Cocos2d-x 3.0 Final

Cocos2d-x là Engine lập trình game đa nền tảng phổ biến nhất trên thế giới. Tính năng mạnh mẽ, dễ sử dụng, miễn phí, mã nguồn mở.

Cocos2d-x V3.0 Final

Hướng dẫn chi tiết, đầy đủ bằng Video, Blog. Cộng đồng hỗ trợ rộng lớn. Sản phẩm phong phú mọi nền tảng

Game Badland

Một trong những game nổi tiếng nhất được tạo ra bởi Engine Cocos2d-x.

Cocos2d-x V3.1

Cập nhật phiên bản Engine Cocos2d-x V3.1 bổ sung thêm nhiều tính năng. Sửa các lỗi nhỏ của các phiên bản trước

Contra Evolution - KONAMI

1 Game rất hay không thể bỏ qua, 1 vé trở về với tuổi thơ.

Monday, May 30, 2016

Body ( Box2D ) Cho Animation SpriteSheet



Hi!

Lâu lâu không vào thăm Blog, vẫn thấy có lượt xem bài viết. Tiếc là không có thời gian để mà viết tiếp thôi.



Trong bài này mình viết nhanh. Nội dung là tạo body cho Animation, loại body bám sát với đối tượng, chứ ko phải body hình vuông, hình tròn nhé




Các bạn mới học Cocos2dx, Physic, sau khi đọc xong các bài viết tạo physicbody cho Sprite đơn giản sẽ luôn có một thắc mắc: Làm sao để tạo Body cho 1 Animation ( dạng SPrite Sheet ). Trước đây mình cũng đã từng vướng vào vấn đề này mà không thể tìm thấy tài liệu ở bất kì đâu. Về sau mình mới biết được rằng ko phải là không có ai làm, hoặc không làm được mà là vì, Cái này có nhiều hạn chế, cuối bài mình sẽ nói

Nhưng giờ đây, mình sẽ trình bày ý tưởng như này

1 Animation có đặc thù là: sau mỗi khoảng thời gian DelayUnit sẽ load 1 ảnh từ Resource để hiển thị lên màn hình. do DelayUnit nhỏ nên ta tưởng như nhân vật đang chuyển động, nhưng thực chất đều là ảnh tĩnh hết.

Vậy làm thế nào để tạo Body => đơn giản thôi, mình sẽ tạo Body đồng bộ với SpriteFrame tại thời điểm DelayUnit thế là xong.

Việc đồng bộ này diễn ra ở hàm Update() nhé. Dùng 1 biến điểm thời gian, khi tới thời điểm DelayUnit thì sẽ load Body vào, đồng thời xóa body của Frame trước đi.

Bạn đã biết cách tạo body chính xác đối tượng. Hãy tìm lại 1 bài trong Blog nhé
Bạn đã biết tạo Animation . Hãy tìm lại trong Blog.

Bắt đầu thôi:

Lúc đầu mình sử dụng Hàm sprite->runAction(Animation); => Vẫn tạo được Body, vẫn khớp nhưng nó bị một hạn chế là KHÔNG ĐỒNG BỘ về THỜI GIAN. Khi kéo khung Window sẽ thể hiện rõ điều này. dần dần Body và Ani sẽ lệch pha nhau.

Do đó, mình sẽ dùng không thèm Action có sẵn nữa mà sẽ chơi kiểu Nhà quê: Tự tạo Animation bằng tay. Nghe có vẻ ghê ghớm, chứ thực ra là thế này.

Tại mỗi 1 DelayUnit mình sẽ load 1 ảnh thay thế cho ảnh trước đó. Vậy là xong Animation

Đồng thời để tạo Body, thì cũng tại DelayUnit bạn nạp Body ( từ file .plist ) file này tạo bằng soft PhysicEditor (Hãy tìm lại 1 bài trong Blog nhé)

Xong phim. Cách này xử lý được vấn đề ĐỒNG BỘ Thời gian


Hàm này tạo Animation theo DELAY Time, quẳng trong update() là sẽ có animation
void HelloWorld::updateAnimation(float dt){

    timer += dt;
    if (timer>=DELAY)
    {

        bear->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(String::createWithFormat("bear%d.png", bear_index)->getCString()));

        //bear->setFlipX(true);

        world->DestroyBody(bearbody);

        createBearB2body(bear_index);

        if (bear_index == 8)
        {
            bear_index = 1;

        }

        timer = 0.0f;
        bear_index++;
    }

}


Hàm này tạo body = cách load file .plist tạo sẵn

void HelloWorld::createBearB2body(int index)
{


    b2BodyDef bodyDef;
    bodyDef.type = b2_staticBody;

    bodyDef.position.Set(bear->getPositionX() / PTM_RATIO, bear->getPositionY() / PTM_RATIO);
    bodyDef.userData = bear;

    bearbody = world->CreateBody(&bodyDef);


    GB2ShapeCache *sc = GB2ShapeCache::sharedGB2ShapeCache();
    sc->addFixturesToBody(bearbody, String::createWithFormat("bear_0%d", index)->getCString());
    bear->setAnchorPoint(sc->anchorPointForShape(String::createWithFormat("bear_0%d", index)->getCString()));

}



Mình chỉ ngắn gọn vậy thôi, và không viết code ra đây nhé, các bạn down CODE về test thôi

FULL CODE đây. Mai up nhé. Trong code mình cũng giải thích, chú thích gì đâu nha

Giờ là tới phần nhược điểm

Về cách tạo body Animation:

Bạn nào học kỹ về Physic + phân tích đặc điểm của ANimation ( đặc biệt là cái DelayUnit ) sẽ có cách làm ngay

Tuy nhiên: có 1 vài nhược điểm

FLIP ANIMATION: OK, flip được, nhưng  bạn ko flip được BODY đâu, mình ko phải chuyên gia về BOX2D nhưng hình như ko có flip Body.

Move ANimation: mình chưa thử nhé, có thể được, vì chỉ cần đặt vị trí body theo Sprite

Rotation: chưa thử, có thể lỗi

Cách tạo khá Amature

Và việc xóa body, tạo body liên thục theo dt không phải là Tốt cho game

Thế nhé mai mình up code tham khảo

Để tạo Body + animation phức tạp và PRO hơn, hãy dùng Spine ( 2D ). 3D thì mình chưa có điều kiện...