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

    Nội dung

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

    14/06/2017
    21/07/2017
    Xử Lý Với File PLIST Trong Cocos2d-x 3.x.x
    Trong việc xây dựng, thiết kế project games của bạn, có nhiều tính toán, kỹ thuật, tính năng bạn phải sử dụng file để thao tác nhằm 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 tích và phát sinh. Trong bài viết này tôi và các bạn sẽ cùng tìm hiểu những đặc điểm, cách xử lý và ứng dụng của file PLIST trong Cocos2d-x 3.11.

    Giới thiệu

    Trong việc xây dựng, thiết kế project games của bạn, có nhiều tính toán, kỹ thuật, tính năng bạn phải sử dụng file để thao tác nhằm 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 tích và phát sinh. Trong bài viết này tôi và các bạn sẽ cùng tìm hiểu những đặc điểm, cách xử lý và ứng dụng của file PLIST trong Cocos2d-x 3.11.

    PLIST là gì?

    PLIST (viết tắt của Property list) là 1 định dạng được dùng để lưu trữ các thuộc tính và giá trị có cấu trúc chặt chẽ, dễ đọc hiểu và sử dụng linh hoạt. Trong bài viết này tôi hướng dẫn sử dụng plist trên Sprite Sheet.

    Cách thể hiện trong file PLIST

    Các file PLIST có định dạng mở rộng là .plist.

    Dưới đây là một Sprite Sheet và cách nó được thể hiện trong plist.

    Trong Sprite Sheet

    Ss

    Trong File PLIST

    <plist version="1.0">
        <dict>
            <key>frames</key>
            <dict>
                <key>Cocos2dx.png</key>
                <dict>
                    <key>aliases</key>
                    <array/>
                    <key>spriteOffset</key>
                    <string>{0,0}</string>
                    <key>spriteSize</key>
                    <string>{195,270}</string>
                    <key>spriteSourceSize</key>
                    <string>{195,270}</string>
                    <key>textureRect</key>
                    <string>{{0,0},{195,270}}</string>
                    <key>textureRotated</key>
                    <false/>
                </dict>
                <key>STDIO.png</key>
                <dict>
                    <key>aliases</key>
                    <array/>
                    <key>spriteOffset</key>
                    <string>{0,0}</string>
                    <key>spriteSize</key>
                    <string>{256,256}</string>
                    <key>spriteSourceSize</key>
                    <string>{256,256}</string>
                    <key>textureRect</key>
                    <string>{{195,0},{256,256}}</string>
                    <key>textureRotated</key>
                    <false/>
                </dict>
            </dict>
            <key>metadata</key>
            <dict>
                <key>format</key>
                <integer>3</integer>
                <key>pixelFormat</key>
                <string>RGBA8888</string>
                <key>premultiplyAlpha</key>
                <false/>
                <key>realTextureFileName</key>
                <string>SpriteSheet.png</string>
                <key>size</key>
                <string>{451,270}</string>
                <key>textureFileName</key>
                <string>SpriteSheet.png</string>
            </dict>
        </dict>
    </plist>
    

    Phân tích:

    PLIST được cấu trúc bởi các tab có liên hệ chặt chẽ với nhau:

    • Mỗi một <key> <key/> thể hiện cho một phần tử  riêng biệt và luôn có một giá trị ở dưới nó
    • <dict> </dict> là một danh mục chứa nhiều các phần tử 
    • <integer> </integer> thể hiện giá trị kiểu số nguyên, <float> </float> thể hiện giá trị kiểu số thực
    • <string> </string> thể hiện giá trị là một chuỗi ký tự
    • <true/> và  <false/> thể hiện giá trị đúng sai cho phép luận lý

    Ở tập tin trên thì chúng ta có:

    • Dòng 3, 36: ở đây plist chia ra 2 phần tử chính là framesmetadata, trong đó metadata chứa các dữ liệu về các định dạng và đặc tính chung của hình ảnh cũng như cách thức xử lý mà Cocos2dx sẽ ứng dụng với từng loại file plist khác nhau, còn frames chứa các đặc tính, kích thước riêng biệt của từng Sprites trong Sprite Sheet
    • Dòng 38, 39: đây là định dạng để Cocos2dx xác định cách xử lý file plist với các giá trị khác nhau từ 0 đến 3, với mỗi giá trị thì sẽ có một cách trình bày trong plist khác nhau, ở đây giá trị của tôi là 3 với cấu trúc như trên
    • Dòng 5, 20: đây là tên của 2 Sprite trên và ở dưới là các thuộc tính của nó

    Cách sử dụng plist trong Cocos2d-x

    Để sử dụng plist trên cho Sprite Sheet trong Cocos2d-x , ta khởi tạo các dữ liệu của plist cho Sprite Sheet trước:

    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("sprite_sheet.plist", "sprite_sheet.png");

    Sau khi khởi tạo thì ta lấy Sprite ra sử dụng rất đơn giản:

    auto m_Sprite = Sprite::createWithSpriteFrameName("STDIO.png");
    

    Cocos2d-x đã làm hầu hết các công việc nặng nhọc cho chúng ta.

    Chuyên sâu về cách xử lý plist với Cocos2d-x

    Tôi sẽ giải thích chi tiết hơn về cách hoạt động của hàm addSpriteFramesWithFile để có thể ứng dụng linh hoạt hơn trong nhiều vấn đề.

    Hàm này có cấu trúc như sau:

    void SpriteFrameCache::addSpriteFramesWithFile(const std::string& plist, const std::string& textureFileName)
    {  
        const std::string fullPath = FileUtils::getInstance()->fullPathForFilename(plist);
        ValueMap dictionary = FileUtils::getInstance()->getValueMapFromFile(fullPath);
        addSpriteFramesWithDictionary(dictionary, textureFileName);
    }
    
    • Dòng 3: lấy đường dẫn chi tiết đến file plist thực thi
    • Dòng 4: lấy các dữ liệu trong plist ra và lưu vào ValueMap
    • Dòng 5: lấy các dữ liệu có được trong ValueMap để trích các Sprite riêng biệt ra, bắt đầu từ việc đọc metadata trước để lấy cách thức xử lý dữ liệu rồi đến đọc frames sau, cuối cùng lưu nó vào SpriteFrameCache để người dùng lấy ra sử dụng

    Vậy để lấy dữ liệu trong plist ra thì ta cần xử lý với kiểu dữ liệu ValueMap:

    Đây là đoạn chương trình mà tôi sẽ lấy giá trị của format trong metadata ra

     if (dictionary.find("metadata") != dictionary.end())
        {
            ValueMap& metadataDict = dictionary["metadata"].asValueMap();
            integer format = metadataDict["format"].asInt();
        }
    • Dòng 1: tìm phần tử metadata bằng hàm find(string), nếu có sẽ chạy chương trình
    • Dòng 3: dictionary["metadata"] sẽ truy cập vào phần tử metadata, sau đó lấy dữ liệu các phần tử con thuộc trong nó và lưu nó dưới dạng ValueMap
    • Dòng 4: truy cập vào phần tử format và sử dụng hàm asInt() để lấy kiểu dữ liệu số nguyên trả về, đây là giá trị cần tìm của ta

    Ngoài ra, không chỉ có asInt() mà còn có các hàm dành cho các kiểu dữ liệu khác nhau như là asFloat(), asString(), asBool(),....

    Từ đó, để lấy giá trị của các phần tử khác cũng tương tự như trên.

    Tham khảo

    http://cocos2d-x.org/

    Thảo luận

    Đăng nhập

    Bài viết liên quan

    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

    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

    Kỹ Thuật Popup Với Cocos2d-x 3.x.x

    Kỹ Thuật Popup Với Cocos2d-x 3.x.x

    Trong quá trình xây dựng và phát triển lại Sins. Bản thân tôi và nhóm phát triển luôn được học tập và phát triển về kiến thức lập trình game, đặc biệt là với Cocos2d-x ...

    Trương Xuân Đạt

    23/01/2015

    Sprite Sheet Trong Cocos2dx 3.x.x

    Sprite Sheet Trong Cocos2dx 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. Sprite Sheet là một trong những phương pháp tiêu chuẩn trong ngành công nghiệp games nhằm sẽ quản ...

    Trương Xuân Đạt

    23/01/2015

    Lập Trình Hiệu Ứng Trong Cocos2d-x 3.x.x

    Lập Trình Hiệu Ứng Trong Cocos2d-x 3.x.x

    Bài viết nằm trong loạt bài viết của 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 về lập trình hiệu ứng, thuộc tính, và ví dụ về sử dụng ...

    Trương Xuân Đạt

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

    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

    Animation Trong Cocos2d-x 3.x.x

    Animation 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 này sẽ giới thiệu nội dung về khái niệm Animation, các loại Animation hiện có và một ...

    Trương Xuân Đạt

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