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

    Nội dung

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

    Rye Nguyen

    04/08/2015
    20/12/2017
    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 như mong muốn. Bài viết giới thiệu đến các bạn một cách quản lý vị trí của các đối tượng hiệu quả trên Cocos2d-x.

    Giới thiệu

    Trong lập trình game nói chung và lập trình game với Cocos2d-x nói riêng, việc xử lý “cứng” các đối tượng (như vị trí, tỉ lệ, góc quay, …) 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 như mong muốn. Do đó, việc quản lý động các đối tượng sẽ tối ưu hơn trong lập trình game đa màn hình. Bài viết sau sẽ giới thiệu các bạn một cách hiện thực đơn giản giải quyết vấn đề trên trong Cocos2d-x.

    Tiền đề bài viết

    Được sự hướng dẫn của các anh La Kiến Vinh, Vũ Quang Huy tôi đã hiện thực thành công lớp PositionManager để lấy dữ liệu vị trí các đối tượng từ file trong games. Bài viết này nhằm chia sẻ kĩ thuật và kinh nghiệm cá nhân của tôi cho mọi người.

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

    Các lập trình viên phát triển game đa nền tảng, đa màn hình. Bài viết sử dụng Cocos2d-x nên người đọc cần có kiến thức cơ bản về Cocos2d-x. Các đối tượng khác vui lòng đọc bài ở mức độ tham khảo.

    Công cụ hỗ trợ

    Bài viết sử dụng công cụ Cocos2d-x v3.4, cùng với Visual Studio 2013 Community. Xem hướng dẫn cài đặt và setup môi trường làm việc trên Cocos2d-x tại Cài Đặt Cocos2d-x Và Khởi Tạo Project Trên Windows. Các phiên bản cũ hơn của Cocos2d-x sẽ có sự khác biệt.

    Lớp Dictionary

    Cocos2d-x đã hiện thực sẵn lớp Dictionary, hỗ trợ lập trình viên đọc file theo cấu trúc của file XML. Các key/value sẽ được lưu trữ trong file dưới dạng tag - Tìm hiểu thêm Cơ Bản Về XML.

    File lưu trữ position phải tuân theo một cấu trúc định sẵn với phần ở rộng mặc định của file là .plist. Bạn nên giữ nguyên để đồng bộ với cộng đồng lập trình viên Cocos2d-x.

    Trong bài viết, tôi hiện thực đơn giản file plist để minh họa với các key/value như sau:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
           "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>title</key>
        <string>540,1250</string>
        
        <key>button_play </key>
        <string>540,800</string>
    
        <key>button_sound</key>
        <string>200,1400</string>
    </dict>
    </plist>

    Các phương thức cần lưu ý khi sử dụng Dictionary:

    createWithContentsOfFile

    Đối số truyền vào là đường dẫn đến file plist của bạn. Nếu đường dẫn không tồn tại sẽ trả về nullptr. Thông qua hàm này, toàn bộ dữ liệu có trong file plist sẽ được xử lý thành các bộ key/value. Các bạn cần tạo sẵn một đối tượng Dictionary để lưu trữ lại các bộ key/value này.

    valueForKey

    Hàm có tác dụng trả về value có dạng const __String* với key tương ứng. Nếu key không tồn tại sẽ trả về một chuỗi rỗng.

    Các kiểu dữ liệu phức tạp cấp cao như array hay dict sẽ không được trình bày trong bài viết này. Dữ liệu ở dạng chuỗi sẽ hiệu quả nhất, ta hoàn toàn có thể thao tác để chuyển từ chuỗi sang các kiểu dữ liệu mong muốn một cách dễ dàng.

    Hiện thực lớp PositionManager

    Lớp PositionManager có các phương thức chính là loadObjectsPosition và getObjectPosition. Tôi sẽ hiện thực hai phương thức này bên dưới. Khai báo lớp PositionManager như sau:

    class PositionManager
    {
    private:
        static PositionManager* m_instance;
    
    private:
        PositionManager();
        ~PositionManager();
    
    public:
        static PositionManager* getInstance();
    
        void    loadObjectsPosition(const char* pListPath);
        Vec2    getObjectPosition(const String* objectPosition);
        
        // Your variable to store object position (Vec2)
        Vec2    m_title;
        Vec2    m_buttonPlay;
        Vec2    m_buttonSound;
    }

    Do chỉ có duy nhất một PositionManager tồn tại trong game nên tôi áp dụng kỹ thuật Singleton để tiện quản lý.

    loadObjectsPosition

    Hàm loadObjectsPosition có tác dụng lưu trữ vị trí của các đối tượng được load vào file plist.

    void PositionManager::loadObjectsPosition(const char* pListPath)
    {
        Dictionary* objectsListPosition = Dictionary::createWithContentsOfFile(pListPath);
    
        // get title position
        const __String* strTitlePosition = objectsListPosition->valueForKey("title");
        PositionManager::getInstance()->m_title = getObjectPosition(strTitlePosition);
        
        // get play button position
        const __String* strButtonPlayPosition = objectsListPosition->valueForKey("button_play");
        PositionManager::getInstance()->m_buttonPlay= getObjectPosition(strButtonPlayPosition);
        
        // get sound button position
        const __String* strButtonSoundPosition = objectsListPosition->valueForKey("button_sound");
        PositionManager::getInstance()->m_buttonSound= getObjectPosition(strButtonSoundPosition);
    }

    Value dạng chuỗi sẽ được lưu trữ lại trong các biến const __String* và được phân tích (parse) để lưu trữ lại vào PositionManager dưới dạng Vec2. Các kiểu dữ liệu int, float, bool, … được lưu trữ trực tiếp qua hàm valueForKey.

    getObjectPosition

    Hàm getObjectPosition sẽ hỗ trợ parse dữ liệu từ dạng const __String* sang Vec2. Việc phân tích dữ liệu chuỗi sang các kiểu dữ liệu khác khá đơn giản và có nhiều cách hiện thực khác nhau. Dưới đây là cách tôi sử dụng trong Project Zero:

    Vec2 PositionManager::getObjectPosition(const __String* strObjectPosition)
    {
        Vec2 objectPosition;
    
        int value = 0;
        for(size_t i = 0; i < strObjectPosition->_string.length(); i++)
        {
            if(strObjectPosition->_string[i] >= '0' && strObjectPosition->_string[i] <= '9')
            {
                value *= 10;
                value += (strObjectPosition->_string[i] - '0');
            }
            else
            {
                objectPosition.x = value;
                value = 0;
            }
        }
    
        objectPosition.y = value;
        return objectPosition;
    }

    Thảo luận

    Đăng nhập

    Bài viết liên quan

    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

    UI - Phần 2: Thiết Kế UI Trong Cocos2d-x 3.x.x

    UI - Phần 2: Thiết Kế UI Trong Cocos2d-x 3.x.x

    Ở bài viết UI Phần I: Khái Niệm Và Một Số Đối Tượng Để Thiết Kế UI Trong Cocos2d-x 3.x.x, tôi đã giới thiệu cho các bạn UI là gì? Các thành phần của UI,… và đối tượng ...

    Trương Xuân Đạt

    23/01/2015

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 3: Thiết Kế Kích Thước Màn Hình, Quản Lý Đối Tượng

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 3: Thiết Kế Kích Thước Màn Hình, Quản Lý Đối Tượng

    Tiếp tục chuỗi bài viết về hướng dẫn làm game, trong bài viết này tôi sẽ hướng dẫn cách tạo kích thước màn hình trong game, hiện thực lại position manager để quản lý các ...

    Ryan Lê

    03/03/2015

    Sử Dụng Auto Layout Sắp Xếp Các Đối Tượng UI

    Sử Dụng Auto Layout Sắp Xếp Các Đối Tượng UI

    Trong một số trường hợp, chúng ta cần tự động hoá việc sắp xếp các đối tượng trong chương trình do số lượng đối tượng quá nhiều, gây hao tốn thời gian nếu quản lý thủ ...

    Rye Nguyen

    08/08/2015

    UI - Phần 1: Khái Niệm Và Một Số Đối Tượng Để Thiết Kế UI Trong Cocos2d-x 3.x.x

    UI - Phần 1: Khái Niệm Và Một Số Đối Tượng Để Thiết Kế UI Trong Cocos2d-x 3.x.x

    UI không chỉ có phục vụ trong ngành công nghiệp game mà còn phục vụ cho rất nhiều ngành công nghiệp khác. Một game có một UI và một ý tưởng tốt sẽ rất hấp dẫn người chơi. ...

    Trương Xuân Đạt

    23/01/2015

    Xử Lý Với File JSON Trong Cocos2d-x 3.x.x

    Xử Lý Với File JSON Trong Cocos2d-x 3.x.x

    JSON đóng góp vai trò quan trọng trong nhiều lĩnh vực cũng như lập trình game trong việc tăng hiệu suất của chương trình, giúp lập trình viên dễ dàng đọc và viết, dễ phân ...

    Lê Viết Duy

    12/06/2017

    Giới Thiệu Về Sprite Trong Cocos2d-x 3.x.x

    Giới Thiệu Về Sprite Trong Cocos2d-x 3.x.x

    Giới thiệu tổng quan về khái niệm cơ bản, một số cách dùng để khởi tạo một sprite, các thuộc tính của sprite và cũng như các thao tác cơ bản với các thuộc tính của sprite ...

    Trương Xuân Đạt

    23/01/2015

    Action Cho Sprite Trong Cocos2d-x 3.x.x

    Action Cho Sprite Trong Cocos2d-x 3.x.x

    Bài viết nằm trong loạt bài viết chương trình Tự Học Cocos2d-x 3.x.x. Bài viết có nội dung giới thiệu về khái niệm những Acction cơ bản của Sprite và các ví dụ minh họa ...

    Trương Xuân Đạt

    23/01/2015

    Xử Lý Sự Kiện Trong Cocos2d-x 3.x.x

    Xử Lý Sự Kiện Trong Cocos2d-x 3.x.x

    Bài viết nằm trong loạt bài viết chương trình Tự Học Cocos2d-x 3.x.x. Trong bài viết sẽ giới thiệu khái niệm các loại sự kiện trong cocos2d-x và các ví dụ hiện thực các ...

    Trương Xuân Đạt

    23/01/2015

    Giới Thiệu Audio Trong Cocos2d-x 3.x.x

    Giới Thiệu Audio Trong Cocos2d-x 3.x.x

    Giới thiệu về đối tượng Simple Audio Engine trong cocos2d-x 3.x.x. Các khái niệm cơ bản về audio trong game với cocos2d-x: back ground music, sound effect. Các thao tác ...

    Trương Xuân Đạt

    23/01/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