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...
wow cảm ơn chia sẻ của blog
ReplyDeletehạt điều mật ong
Bài viết khá hay.tks ad
ReplyDeletelắp đặt phòng game
lắp đặt phòng game trọn gói
lap dat phong game
lap dat phong net
lắp đặt phòng game chuyên nghiệp
lắp đặt phòng game giá rẻ
lắp đặt phòng net
lắp đặt phòng net trọn gói
lắp đặt phòng net chuyên nghiệp
lắp đặt phòng net giá rẻ
Lắp đặt phòng game tại Hà Nội
Lắp đặt phòng game tại Nam Định
Lắp đặt phòng game tại Hà Giang
Lắp đặt phòng game tại Quảng Ninh
Lắp đặt phòng game tại Cao Bằng
Lắp đặt phòng game tại Hòa Bình
Lắp đặt phòng game tại Hà Nam
Lắp đặt phòng game tại Thanh Hóa
Lắp đặt phòng game tại Lạng Sơn
Lắp đặt phòng game tại Lại Châu
Mình đang cần tuyển 4 bạn lập trình game bằng cocos2dx. Các bạn nào quan tâm liên hệ gửi CV đến mình qua email: quyetpvk49a1c@gmail.com.
ReplyDeletePhần code này nhìn phức tạp quá....
ReplyDeleteCung cấp quà tặng
Địa chỉ in túi giấy chuyên nghiệp
Bao bì màng Metalize
Công ty chuyên in bao bì