LoginSignup
4
5

More than 5 years have passed since last update.

Cocos2d-x with LuaでAssets Manager Extensionを使う

Last updated at Posted at 2015-06-04

TL;DR

  • Cocos2d-x内の"tests/lua-tests/src/AssetsManagerExTest/"に全て書かれている
  • Manifestファイルは同じく"/tests/cpp-tests/Resources/Manifests/AMTestScene1/project.manifest"を参考にする

背景

Cocos2d-xのAssetsManagerExtensionをLuaProjectで使いたかったけれどWeb上に情報があまりなくて調べた。ちなみにCocos2d-xについては全然詳しくないです。

AssetsManagerとは

要は、アプリをリリースした後にアセット(画像やスクリプト)をサーバから配信して更新するアレです。
細かいことは公式サイトに書いてあります。

AssetsManagerの使い方

AssetsManagerの処理の流れは以下のようになります。

  1. アプリ内にあるManifestファイルを参照し、アセットが配置されているサーバのURLや現在のバージョンを取得する
  2. アセットサーバから新しいManifestファイルを取得する
  3. 新しいManifestファイルに従って、アセットサーバから画像やスクリプトを取得する

TL;DRに書いてあったサンプルコードを改変して以下のようにしました。
※一部画像をCocos2d-xのサンプルから取得し配置しています。

AssetsManagerExLoaderScene.lua
local AssetsManagerExLoaderScene = class("AssetsManagerExLoaderScene", cc.load("mvc").ViewBase)

function AssetsManagerExLoaderScene:onCreate()

    local ttfConfig = {}
    ttfConfig.fontFilePath = "fonts/arial.ttf"
    ttfConfig.fontSize = 40

    local progress = cc.Label:createWithTTF(ttfConfig, "0%", cc.VERTICAL_TEXT_ALIGNMENT_CENTER)
    progress:move(display.cx, display.cy + 200)
    progress:addTo(self)

    local manifestPath = "manifests/project.manifest"
    local storagePath  = cc.FileUtils:getInstance():getWritablePath()

    local am = cc.AssetsManagerEx:create(manifestPath, storagePath)
    am:retain()

    if not am:getLocalManifest():isLoaded() then
        print("Fail to update assets, step skipped.")
        display.newSprite("assetMgrBackground1.jpg")
            :move(display.center)
            :addTo(self)
    else
        local function onUpdateEvent(event)
            local eventCode = event:getEventCode()
            if eventCode == cc.EventAssetsManagerEx.EventCode.ERROR_NO_LOCAL_MANIFEST then
                print("No local manifest file found, skip assets update.")
                display.newSprite("assetMgrBackground1.jpg")
                    :move(display.center)
                    :addTo(self)
            elseif  eventCode == cc.EventAssetsManagerEx.EventCode.UPDATE_PROGRESSION then
                local assetId = event:getAssetId()
                local percent = event:getPercent()
                local strInfo = ""

                if assetId == cc.AssetsManagerExStatic.VERSION_ID then
                    strInfo = string.format("Version file: %d%%", percent)
                elseif assetId == cc.AssetsManagerExStatic.MANIFEST_ID then
                    strInfo = string.format("Manifest file: %d%%", percent)
                else
                    strInfo = string.format("%d%%", percent)
                end
                progress:setString(strInfo)
            elseif eventCode == cc.EventAssetsManagerEx.EventCode.ERROR_DOWNLOAD_MANIFEST or
                    eventCode == cc.EventAssetsManagerEx.EventCode.ERROR_PARSE_MANIFEST then
                print("Fail to download manifest file, update skipped.")
                display.newSprite("assetMgrBackground1.jpg")
                    :move(display.center)
                    :addTo(self)
            elseif eventCode == cc.EventAssetsManagerEx.EventCode.ALREADY_UP_TO_DATE or
                    eventCode == cc.EventAssetsManagerEx.EventCode.UPDATE_FINISHED then
                print("Update finished.")
                display.newSprite("assetMgrBackground1.jpg")
                    :move(display.center)
                    :addTo(self)
            elseif eventCode == cc.EventAssetsManagerEx.EventCode.ERROR_UPDATING then
                print("Asset " .. event:getAssetId() .. ", " .. event:getMessage())
                display.newSprite("assetMgrBackground1.jpg")
                    :move(display.center)
                    :addTo(self)
            end
        end
        local listener = cc.EventListenerAssetsManagerEx:create(am,onUpdateEvent)
        cc.Director:getInstance():getEventDispatcher():addEventListenerWithFixedPriority(listener, 1)

        am:update()
    end
end

return AssetsManagerExLoaderScene

Manifestファイルも引用して以下のようにしています。

res/manifests/project.manifest
{
    "packageUrl" : "http://tools.itharbors.com/assets_manager/AMTestScene1/",
    "remoteManifestUrl" : "http://tools.itharbors.com/assets_manager/AMTestScene1/project_dev.manifest",
    "remoteVersionUrl" : "http://tools.itharbors.com/assets_manager/AMTestScene1/version_dev.manifest",
    "version" : "1.0.0",
    "engineVersion" : "3.0 beta",

    "assets" : {
            "Images/background1.jpg" : {
                    "md5" : "..."
            }
    },

    "searchPaths" : [
    ]
}

これで、このSceneに遷移したと同時にAssetsManagerが起動し、プロジェクトの直下にファイルがダウンロードされます。
参考になれば幸いです。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5