Celestia/Celx 脚本/CELX Lua 方法/回调
boolean celestia_keyboard_callback(string:char)
键盘输入的回调函数必须命名为“celestia_keyboard_callback”。当脚本通过调用 celestia:requestkeyboard(true)(参见 celestia:requestkeyboard())激活键盘输入处理后,任何按键都会导致对该名称的函数调用。
回调函数可以返回 true 或 false,分别表示它处理了按键或 Celestia 应该继续处理该按键。不返回值与返回 true 相同。
参数
- char
- 该函数应该接受一个参数,一个字符串,其中包含被按下的键的字符。
- 带重音的字符(如 ä 或 é)将作为 UTF-8 序列传递,即作为多字节序列 - 如果你只想要处理 ASCII 字符,可以安全地忽略这一点。
- 像 CTRL-A 这样的键作为包含 ASCII 码小于 32 的字符的字符串传递,Enter (13) 或 Backspace (8) 也是如此。
备注
- 一些特殊按键,如光标键或 [Esc] 键,不会触发回调。
- 如果在处理回调时发生错误,错误消息将被写入控制台日志(通过键盘上的波浪号 [~] 键显示,或者在某些系统上使用 [~] + [空格键] 显示),并且隐式返回 false,即 Celestia 将继续处理该按键。
示例
以下示例代码可以用于在用户按下键盘上的 [1] 或 [2] 键时运行一些特定的 CELX 代码。
-- Initialize variable to have no content:
last_pressed_key = nil
-- Define functions section:
function celestia_keyboard_callback(key)
last_pressed_key = key
return true
end
function get_pressed_key()
last_pressed_key = nil
celestia:requestkeyboard(true)
while true do
if last_pressed_key ~= nil then
key = last_pressed_key
last_pressed_key = nil
celestia:requestkeyboard(false)
return key
end
wait(0.1)
end
end
-- Main CELX script section:
-- Section within your script, where you want to handle keyboard input:
key = get_pressed_key()
if key == "1" then
valid_key = true
celestia:print("Pressed the [1] key", 5.0, -1, -1, 2, 4)
wait(5.0)
-- You can add more CELX code here, specific to the [1] key
elseif key == "2" then
valid_key = true
celestia:print("Pressed the [2] key", 5.0, -1, -1, 2, 4)
wait(5.0)
-- You can add more CELX code here, specific to the [2] key
else
valid_key = false
celestia:print("Pressed invalid key", 5.0, -1, -1, 2, 4)
wait(0.1)
end
if valid_key then
celestia:print("The [1] and [2] keys are valid keys", 5.0, -1, -1, 2, 4)
wait(5.0)
-- You can add more CELX code here, specific to both the [1] and [2] keys
end
function celestia_cleanup_callback()
每当 Lua 脚本终止(因为脚本结束,用户通过按下 [Esc] 键终止脚本,或者发生错误),Celestia 将尝试执行名为“celestia_cleanup_callback”的函数。
这个函数可以用来执行任何清理操作,特别是将设置恢复到脚本启动之前的使用值。在一个 CELX 脚本中,许多 Celestia 选项可能设置得与用户的标准设置不同。通过使用这个清理回调函数,可以将设置重置到运行脚本之前的状态。
使用这个清理函数对编写用户友好的 CELX 脚本至关重要!
备注
- 错误只会报告到控制台日志中(通过键盘上的波浪号 [~] 键显示,或者在某些系统上使用 [~] + [空格键] 显示)。
示例
以下示例代码可以标准地插入到任何 CELX 脚本的开头(使用 Celestia 版本 1.6.1 或更高版本),以将 Celestia 设置恢复到运行脚本之前的状态,并在 CELX 脚本中将这些设置初始化为你喜欢的状态。
注意:当使用旧版本的 Celestia 时,请注意示例中的注释,以删除一些代码,这样示例也能在 Celestia 版本 1.5.0、版本 1.5.1 和版本 1.6.0 中使用。
-- Define Cleanup function to restore the settings
-- to the way they before running the script.
function celestia_cleanup_callback()
celestia:setrenderflags(orig_renderflags)
celestia:setlabelflags(orig_labelflags)
celestia:setorbitflags(orig_orbitflags)
celestia:setambient(orig_amb)
celestia:setfaintestvisible(orig_faintest)
celestia:setminorbitsize(orig_minorbit)
celestia:setstardistancelimit(orig_stardistance)
celestia:setminfeaturesize(orig_minfeature)
celestia:setstarstyle(orig_starstyle)
celestia:settime(orig_time + (celestia:getscripttime() / 24 / 3600) )
celestia:settimescale(orig_timescale)
celestia:setgalaxylightgain(orig_galaxylight)
celestia:getobserver():setfov(orig_fov)
celestia:getobserver():setlocationflags(orig_locationflags)
celestia:getobserver():singleview()
celestia:setoverlayelements(orig_overlay)
celestia:setaltazimuthmode(orig_altazimuthmode)
-- Comment next line if NOT using Celestia v1.6.0 or later
celestia:settextureresolution(orig_textres)
-- Comment next line if NOT using Celestia v1.6.1 or later
celestia:settextcolor(orig_txt_r,orig_txt_g,orig_txt_b)
end
-- immidiatily followed by the following code to obtain the
-- current user settings and save them during the script.
orig_renderflags = celestia:getrenderflags()
orig_labelflags = celestia:getlabelflags()
orig_orbitflags = celestia:getorbitflags()
orig_amb = celestia:getambient()
orig_faintest = celestia:getfaintestvisible()
orig_minorbit = celestia:getminorbitsize()
orig_stardistance = celestia:getstardistancelimit()
orig_minfeature = celestia:getminfeaturesize()
orig_starstyle = celestia:getstarstyle()
orig_time = celestia:gettime()
orig_timescale = celestia:gettimescale()
orig_galaxylight = celestia:getgalaxylightgain()
orig_fov = celestia:getobserver():getfov()
orig_locationflags = celestia:getobserver():getlocationflags()
orig_overlay = celestia:getoverlayelements()
orig_altazimuthmode = celestia:getaltazimuthmode()
-- Comment next line if NOT using Celestia v1.6.0 or later
orig_textres = celestia:gettextureresolution()
-- Comment next line if NOT using Celestia v1.6.1 or later
orig_txt_r,orig_txt_g,orig_txt_b = celestia:gettextcolor()
-- The following initialization part can be customized
-- by the wishes of the CELX writer to the way he/she
-- wants the settings to be during the script.
celestia:setorbitflags{Planet = true,
Moon = false,
Asteroid = false,
Comet = false,
Spacecraft = false,
Invisible = false,
Unknown = false,
DwarfPlanet = false, -- Comment line if NOT using Celestia v1.6.0 or later
MinorMoon = false, -- Comment line if NOT using Celestia v1.6.0 or later
Star = false -- Comment line if NOT using Celestia v1.6.0 or later
}
celestia:setrenderflags{atmospheres = true,
automag = true,
boundaries = false,
cloudmaps = true,
cloudshadows = true,
comettails = true,
constellations = false,
eclipseshadows = true,
galaxies = true,
grid = false,
markers = false,
nebulae = false,
nightmaps = true,
orbits = false,
planets = true,
ringshadows = true,
stars = true,
smoothlines = true,
lightdelay = false,
partialtrajectories = false,
ecliptic = false, -- Comment line if NOT using Celestia v1.6.0 or later
equatorialgrid = false, -- Comment line if NOT using Celestia v1.6.0 or later
galacticgrid = false, -- Comment line if NOT using Celestia v1.6.0 or later
eclipticgrid = false, -- Comment line if NOT using Celestia v1.6.0 or later
horizontalgrid = false -- Comment line if NOT using Celestia v1.6.0 or later
}
celestia:setlabelflags{planets = false,
moons = false,
spacecraft = false,
asteroids = false,
comets = false,
stars = false,
galaxies = false,
locations = false,
constellations = false,
i18nconstellations = false,
openclusters = false,
nebulae = false,
dwarfplanets = false, -- Comment line if NOT using Celestia v1.6.0 or later
minormoons = false, -- Comment line if NOT using Celestia v1.6.0 or later
globulars = false -- Comment line if NOT using Celestia v1.6.0 or later
}
celestia:setambient(0.05)
celestia:setfaintestvisible(7)
-- Make your standard Star Style choice below by
-- commenting/uncommenting one of the following lines:
celestia:setstarstyle("point")
-- celestia:setstarstyle("fuzzy")
-- celestia:setstarstyle("disc")
-- End of initialization part of the script