2017-04-05 65 views
0

我正在爲大型應用程序製作預加載器。今天發生錯誤「沒有這樣的文件或目錄」。此錯誤僅在Android設備上發生。在電腦上(在模擬器中)工作正常。所有文件名和目錄都要小寫。「預加載器中沒有這樣的文件或目錄」

代碼:

--------------------------------------------- 
---------------- Прелоадер ------------------ 
-- Сервис по загрузке текстур, звука -------- 
--------------------------------------------- 

TEXTURES = {} -- место в оперативной памяти для текстур 
SOUNDS = {} -- место в оперативной памяти для звука 

local Preloader = {} 
local path = { 
    animations = "assets/images/animations/", 
    army_run = "assets/images/animations/army_run/", 
    area = "assets/images/area/", 
    access = "assets/images/area/access/", 
    artefacts = "assets/images/artefacts/", 
    castles = "assets/images/building/castles/", 
    mining = "assets/images/building/mining/", 
    flags = "assets/images/flags/", 
    interface = "assets/images/interface/", 
    marker = "assets/images/interface/marker/", 
    items = "assets/images/items/", 
    raw = "assets/images/raw/", 
} 

-- Место для путей к текстурам 
Preloader.texture = {} 

-- Место для путей к звуку 
Preloader.sound = {} 

-- Загрузка текстур в оперативную память 
Preloader.loadingTextures = function(arr) 
    TEXTURES[arr.id] = {} 
    for i = 1, #arr do 
     local name = string.gsub(arr[i], '.*(.*)/', '') 
     TEXTURES[arr.id][name] = graphics.newTexture({ type="image", filename = arr[i] }) 
     TEXTURES[arr.id][name]:preload() 
    end 
end 

-- Загрузка звука в оперативную память 
Preloader.loadingSounds = function() 
    for i = 1, #Preloader.sound do 
     sounds[Preloader.sound[i]] = audio.loadSound("snd/"..Preloader.sound[i]) 
    end 
end 

-- Таймер 
Preloader.getTimer = function() 
    return system.getTimer() 
end 

-- Окно загрузки 
Preloader.screenLoader = nil 
Preloader.loaderShow = function() 
    if(Preloader.screenLoader)then 
     return false 
    end 

    Preloader.screenLoader = display.newGroup() 
    Preloader.screenLoader.x = _W/2 
    Preloader.screenLoader.y = _H/2 

    local screen = display.newRect(0, 0, _W, _H) 
    screen:setFillColor(0, 0, 0) 
    Preloader.screenLoader:insert(screen) 

    local imgLoad = "assets/images/animations/army_run/150.png" 
    local sheetLoad = graphics.newImageSheet(imgLoad, { width = 224, height = 224, numFrames = 8 }) 

    local animLoad = display.newSprite(Preloader.screenLoader, sheetLoad, { start = 1, count = 8, time = 800, loopCount=0 }) 
    animLoad.xScale, animLoad.yScale = _H*.001, _H*.001 
    animLoad.x, animLoad.y = 0, _H*-.07 
    animLoad:play() 

    -- Загрузка в процентах 
    tfLoader = display.newText(TEXTS.Preloader.loading..": 0%", 0, _H*.08, font, _H*.035) 
    tfLoader:setTextColor(1,1,1) 
    Preloader.screenLoader:insert(tfLoader) 
    Preloader.screenLoader.tf = tfLoader 

    -- Загрузка в этапах 
    stepLoader = display.newText(TEXTS.Preloader.start_load, 0, _H*.125, font, _H*.022) 
    stepLoader:setTextColor(160/255, 160/255, 160/255) 
    Preloader.screenLoader:insert(stepLoader) 
    Preloader.screenLoader.step = stepLoader 
end 

-- Создание массивов с путями 
Preloader.createPath = function() 
    for k, v in pairs(path) do 
     local i = 0 
     Preloader.texture[k] = { id = k } 
     for l in lfs.dir(v) do 
      if (l ~= "." and l ~= ".." and l ~= "...") then 
       i = i + 1 
       Preloader.texture[k][i] = v..l 
      end 
     end 
    end 
end 

-- Запуск прелоадера и контроль процесса загрузки 
Preloader.start = function() 
    -- Создаём шаги для загрузки 
    local loading_steps = {} 

    -- Шаг 1 - Загрузка путей 
    table.insert(loading_steps, function() 
     Preloader.createPath() 
     Preloader.screenLoader.step.text = TEXTS.Preloader.path_load..'...' 
    end) 

    -- Шаг 2 - Загрузка текстур интерфейса 
    table.insert(loading_steps, function() 
     Preloader.loadingTextures(Preloader.texture.interface) 
     Preloader.loadingTextures(Preloader.texture.marker) 
     Preloader.screenLoader.step.text = TEXTS.Preloader.interface_load..'...' 
    end) 

    -- Шаг 3 - Загрузка анимаций 
    table.insert(loading_steps, function() 
     Preloader.loadingTextures(Preloader.texture.animations) 
     Preloader.loadingTextures(Preloader.texture.army_run) 
     Preloader.screenLoader.step.text = TEXTS.Preloader.animations_load..'...' 
    end) 

    -- Шаг 4 - Создание карты 
    table.insert(loading_steps, function() 
     Preloader.loadingTextures(Preloader.texture.area) 
     Preloader.loadingTextures(Preloader.texture.access) 
     Preloader.loadingTextures(Preloader.texture.castles) 
     Preloader.loadingTextures(Preloader.texture.mining) 
     Preloader.screenLoader.step.text = TEXTS.Preloader.map_load..'...' 
    end) 

    -- Шаг 5 - Загрузка ресурсов 
    table.insert(loading_steps, function() 
     Preloader.loadingTextures(Preloader.texture.raw) 
     Preloader.loadingTextures(Preloader.texture.items) 
     Preloader.loadingTextures(Preloader.texture.artefacts) 
     Preloader.screenLoader.step.text = TEXTS.Preloader.res_load..'...' 
    end) 

    -- Шаг 6 - Загрузка параметров игрока 
    table.insert(loading_steps, function() 
     Preloader.loadingTextures(Preloader.texture.flags) 
     Preloader.screenLoader.step.text = TEXTS.Preloader.res_load..'...' 
    end) 

    local loading_steps_max = #loading_steps+1 
    local st = Preloader.getTimer() 
    Preloader.loaderShow() 

    local function mainHandler(e) 
     if(#loading_steps>0)then 
      loading_steps[1]() 
      table.remove(loading_steps, 1) 

      if(Preloader.screenLoader)then 
       local loading_p = math.floor((loading_steps_max - #loading_steps)*100/loading_steps_max) 
       Preloader.screenLoader.tf.text = TEXTS.Preloader.loading..': '..loading_p..'%' 
      end 
      return true 
     end 
     Preloader.loaderClose() 
     print('Time load: '..(Preloader.getTimer()-st)..'ms') 

     Runtime:removeEventListener("enterFrame", mainHandler) 
    end 
    Runtime:addEventListener("enterFrame", mainHandler) 
end 

-- Окончание загрузки 
Preloader.loaderClose = function() 
    if(Preloader.screenLoader)then 
     if(Preloader.screenLoader.removeSelf)then 
      Preloader.screenLoader:removeSelf() 
     end 
    end 
    Preloader.screenLoader = nil 

    -- Переход на стартовую сцену 
    composer.gotoScene(start_scene, "fade", 0) 
end 

-- Сборщик мусора 
Preloader.garbage_collector = function() 
    for key in pairs(TEXTURES) do 
     for i=1, #TEXTURES[key] do 
      TEXTURES[key][i]:releaseSelf() 
     end 
    end 
    TEXTURES = {} 
end 

return Preloader 

這就是我如何展示在舞臺上的圖像:

M.dial = display.newImageRect(M.gr, TEXTURES.interface["btn_compas_comp.png"].filename, TEXTURES.interface["btn_compas_comp.png"].baseDir, 272, 272) 
M.dial.x, M.dial.y = X, Y 

在此先感謝朋友。

回答

0

1)All file names and directories to lowercase - 我建議仔細檢查一下,因爲Android文件系統區分大小寫。

2)另外,請檢查您的build.settings以確保excludeFiles部分不包含任何目錄從您的代碼

編輯:基於corona lfs doc另一個想法 - 試裝之前以下:

local resourcesPath = system.pathForFile("", system.ResourceDirectory) 

-- Change current working directory 
local success = lfs.chdir(resourcesPath) --returns true on success 

我猜這個lfs默認不會指向資源目錄。您的所有資產都在這個目錄中,但不要試圖對其進行修改 - For security reasons, this directory is read-only and enforced by the operating system, not by Corona.

編輯2:解決方案不依賴於當前目錄

Preloader.createPath = function() 
    for k, v in pairs(path) do 
    local i = 0 
    local pathForDirectory = system.pathForFile(v, system.ResourceDirectory) 
    Preloader.texture[k] = { id = k } 
    for l in lfs.dir(pathForDirectory) do 
     if (l ~= "." and l ~= ".." and l ~= "...") then 
      i = i + 1 
      Preloader.texture[k][i] = v..l 
     end 
    end 
    end 
end 
+0

複查一堆倍。猜測:也許lfs模塊不適用於設備上的應用程序目錄。 –

+0

@ВладиславВыпадко看到我編輯的答案 - 可能'chdir'可能有幫助 –

+0

我有下一個錯誤:「糟糕的參數#1到'dir'(字符串exprcted,得到零)」 –

相關問題