Nội dung bài viết
Đăng ký học lập trình C++
Tại STDIO bạn được dạy nền tảng lập trình tốt nhất.
Đăng ký học
Để việc xử lý va chạm được “thật” hơn trong game thì các hình khối đơn giản gần như là chưa đủ. Bài viết này sẽ chia sẻ đến các bạn kĩ thuật tạo Physics Body cho các đối tượng có hình khối phức tạp trong game với Cocos2d-x.

Giới thiệu

Trong chuỗi bài viết Games & Cocos2d-x, tác giả Đạt Trương đã giới thiệu cho chúng ta cách sử dụng Chipmunk để tạo Physics Body đơn giản cho các đối tượng. Tuy nhiên, để việc xử lý va chạm được “thật” hơn trong game thì các hình khối đơn giản gần như là chưa thoả mãn được lập trình viên. Do đó tôi chia sẻ bài viết này với các bạn về kĩ thuật tạo Physics Body cho các đối tượng có hình khối phức tạp trong game với Cocos2d-x.

Tiền đề bài viết

Trong quá trình học làm game bằng Cocos2d-x trước đây, thông qua việc tìm tòi và tích luỹ kinh nghiệm cá nhân, tôi đã thực hiện thành công việc tạo Physics Body cho các object có hình dạng phức tạp. Điều này giúp cho việc xử lý va chạm vật lý trong game sau này được thật hơn. Được anh Kevin La gợi ý, cùng với sự cho phép của tác giả Đạt Trương, bài viết được đưa vào chuỗi bài viết Games & Cocos2d-x và trở thành tư liệu tham khảo cho bạn đọc.

Ngoài ra, đây cũng là một món quà mà tôi dành tặng đến các bạn sinh viên tham gia cuộc thi Game UIT Hackathon 2016. Chúc các bạn sẽ có một cuộc thi đầy thử thách, cam go và gặt hái được nhiều kết quả tốt đẹp.

Đối tượng hướng đến

Bài viết dành riêng cho các bạn sinh viên tham gia cuộc thi Game UIT Hackathon 2016.

Ngoài ra, bài viết còn hướng đến các bạn lập trình viên đã có kiến thức lập trình với Cocos2d-x căn bản, có nhu cầu tạo ra các đối tượng vật lý phức tạp để áp dụng vào game.

Các đối tượng khác vui lòng đọc bài viết ở mức độ tham khảo.

Chuẩn bị

Physics Body Editor (PBE): Chương trình miễn phí giúp chúng ta có thể tạo Physics Body cho đối tượng.

Link download: www.aurelienribon.com/blog/projects/physics-body-editor/

Để thao tác với Physic Body được tạo ra, các bạn download source code được đính kèm ở cuối bài viết. Source code bao gồm 2 file MyBodyParser.h và MyBodyParser.cpp.

Tạo Physics Body

Sau khi các bạn download chương trình Physics Body Editor về, chúng ta tiến hành giải nén. Ở thư mục mà ta thu được sau khi giải nén, các bạn tiến hành chạy file physics-body-editor.jar. Cửa sổ dưới đây sẽ xuất hiện:

Hinh 1

Chúng ta click vào nút New project để bắt đầu tạo project. Tiếp theo các bạn cho nơi lưu trữ project của chúng ta ở thư mục Resource của project mà bạn đã tạo trước đó. Các bạn chú ý đặt tên project có dạng <tên_project>.json và chọn save.

Hinh 2

Tiếp theo đó chúng ta click vào nút New để import hình ảnh cần tạo Physics Body vào. Liền sau đó một cửa sổ với 3 tùy chọn sẽ hiện lên như hình bên dưới. Khi đó các bạn nhập tùy ý vào khung Name.

Chú ý: Tên của đối tượng cần được nhập chính xác và sẽ sử dụng lại sau này. Do đó bạn nên thiết lập giá trị tên mang đủ ý nghĩa của đối tượng để sử dụng lại trong project.

Hinh 3

Sau đó chúng ta click vào nút "Create body from image”. Nếu việc load hình thành công thì hình ảnh của chúng ta sẽ hiện lên trên trục tọa độ Oxy của chương trình. Ở đây chúng ta có 2 cách để detect Physics Body cho đối tượng.

Hinh 4

Cách 1: Sử dụng chế độ Auto-trace

Nếu đối tượng hình ảnh của bạn có kích thước đủ lớn và đủ rõ thì tôi khuyên các bạn nên sử dụng cách này để giúp chúng ta tiết kiệm thời gian. Ở đây tôi sẽ giải thích rõ thêm một chút về hai thanh trượt có trên cửa sổ của chế độ auto-trace.

Hinh 5

-    Hull tolerance: Giải thích đơn giản thì đây là số điểm detect của Physics Body. Các bạn kéo sang phải số điểm sẽ ít hơn và ngược lại.

-    Alpha tolerance: Độ chính xác trong việc detect. Thông số này giúp cho chế độ auto-trace detect Physics Body của chúng ta chính xác đến đâu. Khi các bạn càng kéo về bên phải thì khả năng chính xác càng cao và ngược lại.

-    Tóm lại tùy vào hình ảnh và đối tượng mà chúng ta chỉnh sửa hai thông số trên sao cho phù hợp nhất.

Cách 2: Detect thủ công

Cách này khá đơn giản và đòi hỏi tính tỉ mỉ và cẩn thận. Việc chọn detect vùng đại diện cho đối tượng được xây dựng khá trực quan, các bạn có thể chọn vùng được detect theo ý muốn. Quá trình detect kết thúc khi chọn lại điểm đầu tiên của quá trình, tạo thành 1 bao đóng đại diện cho đối tượng.

Hướng dẫn sử dụng

Cài đặt

Sau quá trình detect, chúng ta sẽ tiến hành cài đặt Physics Body trên vào project. Trước tiên các bạn import thư viện MyBodyParser được cung cấp ở cuối bài viết. Nó sẽ là “mắt thần” để đọc được file json ở trên và tạo Physics Body cho đối tượng. Chi tiết cách hiện thực thư viện này, tôi không giới thiệu ở đây.

Đoạn code dưới đây sẽ giúp chúng ta add một đối tượng có Physics Body phức tạp vào.

Source code

auto spriteTexture = Sprite::create("CC.png");
spriteTexture->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));

MyBodyParser::getInstance()->parseJsonFile("Coco.json");
auto spriteBody = MyBodyParser::getInstance()->bodyFormJson(spriteTexture, "Coconut", PhysicsMaterial(0, 0, 0));
spriteBody->setDynamic(false);
spriteBody->setCategoryBitmask(0x00000000);
spriteBody->setCollisionBitmask(0x00000000);
spriteBody->setContactTestBitmask(0x00000000);
spriteTexture->setPhysicsBody(spriteBody);
this->addChild(spriteTexture);

Giải thích

  • Dòng 1 - 2: Khởi tạo một sprite.
  • Dòng 4: Đọc file detect Physics Body mà ta đã làm ở trên thông qua thư viện MyBodyParser được cung cấp sẵn.
  • Dòng 5: Khởi tạo Physics Body cho đối tượng.
  • Dòng 6 - 9: Cài đặt các thông số cơ bản như cách cài đặt Physics Body cơ bản trước đây.
  • Dòng 10: gắn Physics Body cho sprite.
  • Dòng 11: Thêm sprite sau khi xử lý vào scene để sử dụng.

Lưu ý: tại dòng 3, giá trị truyền vào bao gồm tên của đối tượng đã được tạo ra theo hướng dẫn ở trên. Nếu sử dụng sai, chương trình sẽ crash.

Build và chạy thử chương trình

Sau khi cài đặt, chúng ta tiến hành build thử. Hình dưới đây là kết quả sau khi tôi đã cài đặt thành công.

Ket qua

Tổng kết

Qua bài viết này, tôi đã hướng dẫn các bạn cách detect cũng như cách cài đặt Physics Body cho hình khối phức tạp. Đồng thời tôi cũng đã lưu ý một số điểm quan trọng khi chúng ta thực hiện. Mong các bạn sẽ có thêm kinh nghiệm và sử dụng nó vào công việc một cách hiệu quả.

Download

MyBodyParser.

Tham khảo

http://www.cocos2d-x.org.

THẢO LUẬN