gpt4 book ai didi

c - LuaJIT FFI : Uploading Steamworks leaderboards

转载 作者:行者123 更新时间:2023-11-30 16:33:48 30 4
gpt4 key购买 nike

如何通过 LuaJIT FFI 将 SteamAPICall_t 与 SteamLeaderboard_t 句柄结合使用?
我用LÖVE2D框架& Steamworks Lua Integration (SLI)

链接:FindLeaderboard/UploadLeaderboardScore/Typedef

function UploadLeaderboards(score)
local char = ffi.new('const char*', 'Leaderboard name')
local leaderboardFound = steamworks.userstats.FindLeaderboard(char) -- Returns SteamAPICall_t
local leaderboardCurrent = ?? -- Use SteamAPICall_t with typedef SteamLeaderboard_t somehow.
local c = ffi.new("enum SteamWorks_ELeaderboardUploadScoreMethod", "k_ELeaderboardUploadScoreMethodKeepBest")
score = ffi.cast('int',math.round(score))
return steamworks.userstats.UploadLeaderboardScore(leaderboardCurrent, c, score, ffi.cast('int *', 0), 0ULL)
end


leaderboardCurrent = ffi.cast("SteamLeaderboard_t", leaderboardFound) -- No declaration error

最佳答案

SteamAPICall_t 只是一个与您的请求相对应的数字。这意味着在 steam API 中与 CCallback 一起使用。lua 集成错过了 CCallbackSTEAM_CALLBACK

SteamLeaderboard_t 响应是通过调用 FindLeaderboard 生成的。在这种情况下,您向 steam 发出请求,而 steam 需要以异步方式响应。

因此,您需要做的是定义一个 Listener 对象(用 C++ 编写),该对象将监听响应(将以 SteamLeaderboard_t 的形式)并为其编写类似 C 的函数,以便 ffi 可以理解它们。

这意味着您的程序必须能够执行以下操作:

  1. 注册排行榜监听器。
  2. 提交排行榜请求。 (查找排行榜)
  3. 等待消息 (SteamLeaderboard_t)
  4. 使用 SteamLeaderboard_t

简而言之,您需要用 C++ 为事件编写代码,并为它们添加类似 C 的接口(interface),并将其全部编译成 DLL,然后使用 FFI 将该 DLL 链接到 lua。这可能很棘手,所以要小心。

在 C 语言中(ffi.cdef 和 dll):

//YOU have to write a DLL that defines these
typedef struct LeaderboardEvents{
void(*onLeaderboardFound)(SteamLeaderboard_t id);
} LeaderboardEvents;
void MySteamLib_attachListener(LeaderboardEvents* events);

然后在lua中。

local lib = --load your DLL library here
local Handler = ffi.new("LeaderboardEvents")

Handler.onLeaderboardFound = function(id)
-- do your stuff here.
end

lib.MySteamLib_attachListener(Handler)

在编写 DLL 时,我强烈建议您通读 steam api 提供的 SpaceWar 示例,以便了解回调是如何注册的。

关于c - LuaJIT FFI : Uploading Steamworks leaderboards,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49569660/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com