有没有办法在没有额外库的情况下使用 LuaJIT 和 SDL2 将文本打印到屏幕上?

Posted

技术标签:

【中文标题】有没有办法在没有额外库的情况下使用 LuaJIT 和 SDL2 将文本打印到屏幕上?【英文标题】:Is there a way to print text to a screen using LuaJIT and SDL2 without an additional library? 【发布时间】:2021-08-29 21:39:33 【问题描述】:

我目前正在为 SDL2 使用 LuaJIT 包装器(请参阅 github 上的“anima”),但不幸的是,SDL_ttf 未包含在 ffi 中,我无法在 Windows 上使用其他库。此外,这个项目的需求已经有变得相当臃肿的风险。

无论如何,我只需要一种将文本打印到窗口表面的方法。有没有一种相对简单的方法?在有人问之前,是的,我确实尝试过 C,但是尝试使用 SDL_ttf 有它自己的噩梦,我更愿意尽可能多地使用 Lua,而不是编译一个非常简单的可执行文件以获得一个干净的前端。

编辑:我想我应该澄清一下,当我尝试在 C 中使用 SDL2 时,SDL2 根本没有工作,但考虑到这不是问题的范围,我离题了 p>

【问题讨论】:

C 的完整 SDL2 故障排除指南(假设您使用 MinGW):***.com/a/64396980/2752075 对不起,我不知道 SDL2。 I just need a way to print text to the window surface - 你能获取表面的 WindowHandle 或 DeviceContext 并使用原始 WinAPI 函数(通过 LuaJIT FFI)在该表面上写入文本吗? @EgorSkriptunoff 这有潜力......有一种方法可以加载 Windows dll 并(我猜)使用来自 LuaJIT 解释器的各自 C 调用。谢谢你的想法 【参考方案1】:

您可以使用位图字体,但您提到的 anima 存储库似乎没有 SDL.ttf,因此 truetype 可能已失效。 'Prolly 使用https://github.com/Tangent128/luasdl2 可以获得更好的结果。在功能上,它们几乎相同,只是语法上有一些不同。此外,您不必必须在脚本中乱扔所有错误测试,但他们建议将它们用于开发反馈。

#! /usr/bin/env luajit
--  luarocks install lua-sdl2
--  apt install fonts-freefont-ttf

local SDL = require( 'SDL' )
local font = require( 'SDL.ttf' )

local function et( this, that )  --  error test
    if not this then error( that ) end
end

local ret, err = SDL .init  SDL .flags .Video  ; et( ret, err )
local ret, err = font .init() ; et( ret, err )

local win, err = SDL .createWindow  title='Font', width=200, height=100  ; et( win, err )
local rdr, err = SDL .createRenderer( win, 0, 0 ) ; et( rdr, err )

local fonts = '/usr/share/fonts/truetype/freefont/'
local mono = fonts ..'FreeMono.ttf'
local sans = fonts ..'FreeSans.ttf'
local serif = fonts ..'FreeSerif.ttf'

local fon, home = font .open( serif, 40 ) ; et( fon, home )

local white =  r = 255,  g = 255,  b = 255 
local surf, err = fon :renderUtf8( 'Gérard!', 'blended', white ) ; et( surf, err )

local texture, err = rdr :createTextureFromSurface( surf ) ; et( texture, err )

rdr :clear()
rdr :copy( texture )
rdr :present()

local seconds = 3
local miliseconds = seconds *1000
SDL .delay( miliseconds )

【讨论】:

我很感激如果我有这个库,这会起作用,但是 luarocks 不会安装在我的系统上。此外,我认为我的系统中存在 luarocks 不会有利于当前项目的可访问性。无论如何,谢谢你的回答......它并没有真正回答这个问题

以上是关于有没有办法在没有额外库的情况下使用 LuaJIT 和 SDL2 将文本打印到屏幕上?的主要内容,如果未能解决你的问题,请参考以下文章

在没有互联网或使用库的情况下配置 IQKeyboardManager?

是否可以在没有标准库的情况下写入控制台? c/c++

如何在没有支持库的情况下将 MaterialToolbar 设置为 ActionBar

解析 JWT 令牌以仅在 C# 或 Blazor 中没有外部库的情况下获取有效负载内容

有没有办法在没有 Fastlane 的相应应用程序的情况下创建捆绑标识符?

没有本地存储库的 github