• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

让Lua自己把文件夹下面的所有文件自动加载起来吧

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

没有想到我也做了一回标题党。其实这里边说的自动还是有夸大其词的部分。其实只是指定文件夹,然后根据指定文件夹数据,加载目录下边的内容而已。

怎么来进行Lua文件的加载

一般情况下,相关的功能需要给他创建一个相关的目录,然后直接通过我写的一个组件指定这个目录的加载位置就行了。不同的目录之间需要明确他们的加载顺序。

为什么要这么做?

  1. 加载的条理性。一般情况下,Lua文件会在需要的时候进行内存加载,这样比较混乱。说比较混乱的原因是没有明确的地方来控制加载的顺序,所以文件加载的顺序比较看脸。
  2. 加载内容的安全性。这里提到的安全性并不是说的什么高深的东西。而是这个东西究竟有没有加载成功。如果使用了,我所说的加载方式进行加载,文件内容加载只要存在相关的文件夹中就会自动加载,一般不会漏下。
  3. 明确同一个文件夹下的文件加载顺序。一般情况下init.lua会首先加载,然后加载其他文件。最后加载loadend.lua文件。在编写软件的时候可以根据这些文件的加加载顺序来进行内容加载的顺序控制。
  4. 实现位置的无关性。配合工厂模式,可以在完全不关心实现位置的情况下,实现相关功能。
  5. 文件位置的条理性。具体的实现位置可以在不记位置的情况下推理出他应该在什么地方实现。(个人觉得这个非常重要)

实际引用

 

总结

其实是一个非常简单的功能,但是用处却非常大。可能我不是很会总结这个东西。哈哈。总之分享一下吧

文件

-- local lfs = require("lfs")

local AutoRequire = class("AutoRequire")

local instance = nil

function AutoRequire:getInstance()
    return instance
end

function AutoRequire:init(dir)
    instance.OriginalPath = dir or lfs.currentdir()
    print("instance.OriginalPath", instance.OriginalPath)
end

function AutoRequire:getTag()
    return self._tag
end

function AutoRequire:getRequirePath()
    return self._require_path
end

function AutoRequire:require(path, data)
    local loadpath = self.OriginalPath..'/'..path
    assert(lfs.symlinkattributes(loadpath), "Error AutoRequire path not find "..path)
    lfs.chdir(loadpath)

    self._tag = data
    self._require_path = path

    local initfile = path..'/'.."init.lua"
    if cc.FileUtils:getInstance():isFileExist(initfile) then
        -- print("require("..initfile..")")
        local loadf = path..'/'.."init"
        -- print("require "..loadf)
        require(loadf)
    end

    for file in lfs.dir(loadpath) do
        if file ~= "." and file ~= ".." and file ~= "init.lua" and file ~= "loadend.lua" then
            local f = loadpath ..'/'..file
            local attr = lfs.attributes(f)
            local filename = string.gsub(file, ".lua$", "")
            if attr.mode == "file" and file ~= filename then
                -- print("require("..path..'/'..file..")")
                local loadf = path..'/'..filename
                -- print("require "..loadf)
                require(loadf)
            end
        end
    end

    local initfile = path..'/'.."loadend.lua"
    if cc.FileUtils:getInstance():isFileExist(initfile) then
        -- print("require("..initfile..")")
        local loadf = path..'/'.."loadend"
        -- print("require "..loadf)
        require(loadf)
    end

    self._tag = nil
    self._require_path = nil

    lfs.chdir(self.OriginalPath)
end

instance = AutoRequire.new()
cc.exports.AutoRequire = AutoRequire

return AutoRequire

2016-09-30 11:36:10 后记

突然间想起来一个好处,现在补充上来。

一次性加载所有的代码。可以让很多语法错误在启动阶段暴露出来,而不是在真正的运行阶段暴露,这样比较方便。

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua学习笔记(1)——语法发布时间:2022-07-22
下一篇:
cocos3.3 lua sprite 精灵 修改 图片发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap