Lua Love2D - 如何使其下载文件?

4

标题。只允许保存到特定目录,但是否有办法使用它制作的可执行文件更新自身?我已经有了检查是否过期的代码(HttpGet),但不确定如何安装更新。

主要原因是人们抱怨不断重新下载我的RPG。将其与C#自动更新程序打包并运行会更容易吗?

2个回答

9
您不能让 .love 文件“自我更新”。除非您使用操作系统的软件包管理器或类似工具(如 Ubuntu 中的 apt-get、Mac 上的应用商店以及 Microsoft 使用的任何东西),否则不可能实现该功能。如果您不想这样做,那么使您的 love2d 可执行文件成为一个“shell”是使其正常工作的第二种最好方法;一个“空游戏”,它只是从互联网上下载一些内容,然后执行某个函数来初始化所有内容,包括适当的游戏。就像 jpjacobs 所说,您可以使用 LuaSocket(已经包含在 LÖVE 0.7 中)从 Web 上下载内容。例如,以下是下载 png 文件的代码示例(我从此处复制了代码:here):
if not love.filesystem.exists("expo.png") then
  local http = require("socket.http")
  local b, c, h = http.request("http://love2d.org/w/images/e/e3/Resource-AnalExplosion.png")
  love.filesystem.write("expo.png", b)
end

还有一种使用纯lua使用GNU解压算法解压缩数据的方法。这是由Kadoba's Advanced TileLoader中的/AdvTiledLoader/external/gunzip.lua文件实现的。
所以我猜你可以制作一个游戏:
1. 通过读取名为version.lua的文件,并将其与服务器上的文件进行比较(http://www.your-server.com/latest-version-number)。那个文件只包含一个数字,例如 "48"。 2. 如果没有文件且无法联系服务器,则出错“无法下载游戏”。 3. 如果没有文件或当前版本小于服务器上的最新版本,则从服务器下载zip文件(http://www.your-server.com/latest.zip)。 4. 如果成功下载latest.zip,则删除/latest目录中的所有内容并在新的latest上解压缩latest.zip。使用新版本更新version.lua(返回48)。 5. 检测是否正在离线工作-如果无法下载latest.zip或version,但已经存在version.lua和latest文件夹,则仅发出警告,而不是错误。 6. 要求包含真正游戏的文件;可能类似于require 'latest.main' 注意:
- 我不熟悉luasocket。有可能有一种方法可以从http://www.your-server.com/latest.zip获取“最后更新”日期,因此您可以简单地摆脱最新版本号的东西。 - 我自己没有使用过gunzip.lua。我不知道它如何处理多个文件或目录。

1
实际上,你可以让它自更新而不必成为“shell”。你不能更改 .love 文件,但是任何使用 love.filesystem 保存的内容(这些将进入游戏分配的保存文件夹)应该会覆盖您游戏的 .love 文件的内容。我不确定这是否适用于代码文件,但至少对其他资源有效。 - nkorth
只要在首次被 require 加载之前更新代码文件,我认为它应该可以工作。 - Xeozim

1

我的第一個猜測會是使用LuaSocket。您可以有一個包含當前版本號的小文件,在啟動時下載該文件,然後決定是否需要升級。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接