Celestia/Celx 脚本/问答/使用 CELX 赋值自定义键功能
使用 CELX,可以轻松创建自定义键功能,并将它们分配到键盘上的不同键位。以下是操作方法。
首先,使用 CELX 创建一个 Lua 函数来实现自定义功能。在本例中,我们将创建一个新的键功能,它可以缩放活动视图,使当前选定的对象充满视图。
zoomToFit= function()
obs = celestia:getobserver()
obsPos = obs:getposition()
sel = celestia:getselection()
if sel == nil or sel:name() == "?" then return end
selPos = sel:getposition()
dist = obsPos:distanceto(selPos)
rad = sel:radius()
appDia = 2*math.atan(rad/dist)
obs:setfov(appDia*1.20)
celestia:flash("Zoom to fit "..sel:name(), 2)
end
接下来,创建一个表,将选定的键映射到新的函数。在本例中,我们将使用“z”键。
keymap = {
z = zoomToFit
}
然后,创建一个键处理函数,当按下所需的键时,调用新的 Lua 函数,并将其作为 Celestia 键盘回调。
celestia_keyboard_callback = function(key)
f = keymap[key]
if f then
f()
return true
end
return false
end
请注意,当输入键存在自定义键定义时,回调将返回 true
,以指示 Celestia 不需要进一步处理该键。否则,它将返回 false
,Celesta 将根据内置键功能分配来处理该键。
最后,告诉 Celestia,您希望在按下键时调用回调,然后等待输入。
celestia:requestkeyboard(true)
repeat
wait(10)
until false
请注意,该脚本有一个无限循环,因此您需要使用 Esc 键来终止它。
一旦您获得了基本脚本,就可以通过定义 Lua 函数来实现它们,并将它们添加到键映射表中,从而轻松地分配其他新的键功能。
试试看!
您可以在下面找到整个脚本(无注释)在一个文本块中。将灰色框中的所有内容复制并粘贴到您喜欢的文本编辑器的文本文件中,并将该文件保存在您的脚本目录中,命名为 zoomtofit.celx。然后在 Celestia 中打开它(文件/打开脚本)以查看脚本的运行效果。
-- Zoom To Fit function script syntaxhighlight lang="text" zoomToFit= function() obs = celestia:getobserver() obsPos = obs:getposition() sel = celestia:getselection() if sel == nil or sel:name() == "?" then return end selPos = sel:getposition() dist = obsPos:distanceto(selPos) rad = sel:radius() appDia = 2*math.atan(rad/dist) obs:setfov(appDia*1.20) celestia:flash("Zoom to fit "..sel:name(), 2) end keymap = { z = zoomToFit } celestia_keyboard_callback = function(key) f = keymap[key] if f then f() return true end return false end celestia:requestkeyboard(true) repeat wait(10) until false
</syntaxhighlight>
不幸的是,上面的示例没有区分输入大写字母和小写字母。
当 Celestia 调用函数 celestia_keyboard_callback 时,函数的参数(在本例中为“key”)包含所输入的字母。一个简单的 IF 语句字符串可以区分它们。
celestia_keyboard_callback = function(key)
if key == "F" then
zoomToFit()
return true
end
return false
end
这种形式的回调将在输入大写 F 时调用函数 zoomToFit,但让 Celestia 处理所有其他字母,包括小写 f。