如何在 LuaJIT 和 SDL2 中打印文字到屏幕上,而不使用其他库?

我目前正在使用一个 LuaJIT 的 SDL2 插件 (可以在 Github 上看到名为"anima"),但是,不幸的是,SDL_ttf 没有包含在 ffi 中,我在 Windows 上使用其他库时遇到了麻烦。此外,这个项目的要求已经非常庞大了。

总之,我只需要一种相对简单的方法将文字打印到窗口屏幕上。是否有一种方法实现这一点?在有人问之前,我确实尝试了 C,但是尝试使用 SDL_ttf 非常困难,我更喜欢尽可能地使用 Lua,而不是编译一个非常简单的可执行文件作为看起来干净的前端。

编辑:我想我应该澄清一下,即当我尝试在 C 中使用 SDL2 时,SDL2 简直就是“不工作的”,但考虑到这不是问题的范围,所以我暂且不提。

点赞
用户3342050
用户3342050

你可以使用位图字体,但你提到的 anima 库似乎没有 SDL.ttf,所以 TrueType 字体可能不适用。使用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 )
2021-06-14 18:22:36