跳转到内容

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

请注意,该脚本有一个无限循环,因此您需要使用 Escape 键来终止它。

获得基本脚本后,只需定义 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。


华夏公益教科书