STDIO
Tìm kiếm gần đây

    Nội dung

    Chipmunk - Phần 6: Tạo Physics Body Cho Các Đối Tượng Có Hình Dạng Phức Tạp

    15/06/2017
    18/06/2017
    Chipmunk - Phần 6: Tạo Physics Body Cho Các Đối Tượng Có Hình Dạng Phức Tạp
    Để 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

    TChipmunk để 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.

    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

    Đăng nhập

    Bài viết liên quan

    Làm Thế Nào Để Tạo Fixtures Cho Vật Có Hình Dạng Phức Tạp?

    Làm Thế Nào Để Tạo Fixtures Cho Vật Có Hình Dạng Phức Tạp?

    Hướng dẫn sử dụng phần mềm Physics Editor dùng để tạo Fixtures cho vật có hình dạng phức tạp: Tạo hình dáng, thông số vật lý, anchor point, kiểu body,... Ví dụ sử dụng ...

    Trương Xuân Đạt

    23/01/2015

    Lập Trình Hướng Đối Tượng Trong Python  - Phần 1: Cơ Bản

    Lập Trình Hướng Đối Tượng Trong Python - Phần 1: Cơ Bản

    Lập trình hướng đối tượng là một kỹ thuật hỗ trợ, cho phép lập trình viên trực tiếp làm việc với các đối tượng mà họ định nghĩa lên. Giúp tăng năng suất, đơn giản hoá độ ...

    Ryan Lê

    29/03/2015

    Làm Sao Để Chia Tách, Cắt Một Đối Tượng Với Box2D?

    Làm Sao Để Chia Tách, Cắt Một Đối Tượng Với Box2D?

    Bạn cần một sự chia tách, cắt một đối tượng trong thế giới games có vật lý của bạn, hoặc có thể hơn bạn cần một một vụ nổ thật sự. Trong bài ...

    Trương Xuân Đạt

    23/01/2015

    Quản Lý Vị Trí Các Đối Tượng Trong Game

    Quản Lý Vị Trí Các Đối Tượng Trong Game

    Thông thường khi khởi tạo một đối tượng trong game, các lập trình viên đều khởi tạo một vị trí nào đó cho chúng. Điều đó có nghĩa là các đối tượng luôn tồn tại trong game ...

    Ryan Lê

    30/03/2015

    Chipmunk - Phần 1: Giới Thiệu

    Chipmunk - Phần 1: Giới Thiệu

    Bài viết này trong loạt bài viết của tôi giới thiệu về thư viện vật lý trò chơi Chipmunk. Trong bài viết này sẽ giới thiệu các khái niệm và thuật ...

    Trương Xuân Đạt

    23/01/2015

    Box2D - Phần 1: Giới Thiệu Và Một Số Thuật Ngữ Và Khái Niệm

    Box2D - Phần 1: Giới Thiệu Và Một Số Thuật Ngữ Và Khái Niệm

    Giới thiệu về engine vật lý sử dụng trong games là Box2D. Giới thiệu Box2D, các khái niệm, cách thành phần liên quan, cách khởi tạo và thao tác với một số thành phần ...

    Trương Xuân Đạt

    23/01/2015

    Toán Tử Khung Xương Trong Ảnh Nhị Phân - Skeleton Binary Morphology

    Toán Tử Khung Xương Trong Ảnh Nhị Phân - Skeleton Binary Morphology

    Toán Tử Khung Xương rút trích thành phần chính đại diện cho hình dạng của đối tượng trong ảnh nhị phân. Được ứng dụng trong nhận dạng mẫu (nhận dạng kí tự), nén ảnh (được ...

    Kim Uyên

    24/05/2016

    Chipmunk - Phần 3: Constraints

    Chipmunk - Phần 3: Constraints

    Tiếp tục loạt bài viết giới thiệu về thư viện vật lý trò chơi Chipmunk. Trong bài viết này tôi sẽ giới thiệu về constraints và các loại constraint ...

    Trương Xuân Đạt

    23/01/2015

    Làm Quen Với Thư Viện Imaging (PIL) -  Phần 1: Cơ bản

    Làm Quen Với Thư Viện Imaging (PIL) - Phần 1: Cơ bản

    Đôi lúc bạn sẽ gặp phải các vấn đề về xử lý hình ảnh trong công việc của mình. Python cho phép bạn thực hiện điều đó dễ dàng thông qua thư viện Imaging (PIL). Thư viện ...

    Ryan Lê

    18/03/2015

    Quản Lý Vị Trí Của Các Đối Tượng Trong Cocos2d-x

    Quản Lý Vị Trí Của Các Đối Tượng Trong Cocos2d-x

    Trong lập trình game, việc xử lý “cứng” các đối tượng là điều nên tránh. Khi đem sản phẩm lên một màn hình có tỉ lệ khác, vị trí các đối tượng có thể sẽ không còn được ...

    Rye Nguyen

    04/08/2015

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    [email protected]

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020