Search…

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

30/09/20205 min read
Giới thiệu những đặc điểm, cách xử lý và ứng dụng của file PLIST trong Cocos2d-x

Trong việc xây dựng, thiết kế project games có nhiều tính toán, kỹ thuật, tính năng 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.

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, bài viết này 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à 1 Sprite Sheet và cách nó được thể hiện trong plist.

Sprite Sheet

PLIST xử lý file trong cocos

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 <key><key/> thể hiện cho 1 phần tử  riêng biệt và luôn có 1 giá trị ở dưới nó.
  • <dict></dict> là 1 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ậsn lý

Tập tin trên 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.
    • 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ị 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 , 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 lấy Sprite ra sử dụng:

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.

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

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.
    • Đọ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ì cần xử lý với kiểu dữ liệu ValueMap:

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

 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.

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.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024