跳转到内容

Celestia/Celx 脚本/问答

来自维基教科书,开放世界中的开放书籍

此页面旨在作为 CELX 脚本实践问题和解答 (Q&A) 的存储库。有两种方法可以将内容列在这里

- 只需在下面的 Q&A 部分列出您的通用问题,就会有人在其中发布答案。请将有关特定答案的讨论(例如澄清请求)发布到该答案的讨论页面。然而不幸的是,很少有 CELX 编程专家定期浏览此维基教科书。

或(首选)

- 在 Celestia 脚本论坛 上发布您的问题。一旦您在那里对答案感到满意,请将问题和最终答案摘要转录到这里,以便我们可以在此维基教科书中建立一个知识库。

如何计算两个物体之间的角度?

[编辑 | 编辑源代码]

回答

如何将 CELX 函数分配给键盘上的特定键?

[编辑 | 编辑源代码]

回答


以下的疑问和解答已从一个“讨论”页面迁移到这里。那些页面用于讨论与编辑维基教科书页面相关的议题,而不是提供维基教科书的内容。

如果有任何不清楚的地方,请在这里提问。

只需点击上面“编辑此页面”按钮,然后开始输入。或者点击此页面中的一个[编辑]按钮,并在其底部插入一个新的问题或解答。


测试脚本和问题

[编辑 | 编辑源代码]

使用这里第一个非常简单的 CELX 示例脚本,即

celestia:flash("Hello, Universe!")
wait(2.0)

"flash" 函数在 "Celestia" 对象中定义。当此脚本执行时,我希望它除了显示文本 "Hello Universe!" 外不做任何事情。

在执行此脚本之前,我已经将地球居中在我的 Celestia 窗口中,并且处于“跟随”模式。当我执行此脚本时,视点会发生变化,使地球在看到 "Hello Universe!" 消息之前被移动到一边或另一边。

我是否正确地认为这种移动是由 Celestia 对 "flash" 函数的定义引起的?换句话说,Celestia 本身中的 "flash" 函数可能包括一些要执行的移动函数。是的?

不,当我尝试这个时,我没有看到地球移动。你是如何运行脚本的?



在研究了 Celestia 中的 "flash" 和 "print" 函数的属性之后,我尝试了以下脚本将消息居中在我的显示屏上。这也导致了地球的移动,即使我认为我将所有内容居中在屏幕上,因为我在参数列表中使用了 0(零)。有人能解释一下这里发生了什么吗?

celestia:print("Hello Universe!", 5, 0, 0, 0, 0)
wait (5)

我也没有看到这个。可能与上面的问题一样。
谜团解开...打开脚本对话框,双击 celx 脚本以打开它。如果我只是使用 Celestia 提供的对话框打开脚本,则不会出现移动。谢谢。
换句话说,不要双击文件名。只需点击打开对话框。
还有一点...如果我使用 CEL 脚本这样做,则对 CEL 脚本没有明显的影响。

如何在 Debian GNU/Linux(celestia 1.6.1)上执行 celx 脚本?我尝试使用 $ celestia --url test.celx,并收到无效选项 "--" 的提示。

Linux 上的 Celestia 目前不支持 --url 参数。Celx 脚本可以使用参数 "-f /path/to/script.celx" 执行。请注意,脚本路径必须是完全显式的路径,而不是相对路径。请参阅 Debian 错误 #682258

来自 BrainDead 的测试脚本

[编辑 | 编辑源代码]
  flashRadius = function (bodyName)
  body = celestia:find(bodyName) -- finds object 
  radius = body:radius() -- gets radius
  celestia:flash("The radius of " .. body:name() .. " is " .. radius .. " km.")
  wait(2.0)
  end
     
  flashRadius("Mercury")
  flashRadius("Venus")
  flashRadius("Earth")
  flashRadius("Mars")
  flashRadius("Jupiter")
  flashRadius("Saturn")
  flashRadius("Uranus")
  flashRadius("Neptune")
  flashRadius("Pluto")
  flashRadius("Charon")

  function flash(message)
  celestia:flash(message)
  wait(2.0)
  end

  message = "End of this test script"
  flash = celestia:flash(message,5)
上面一个重要的点...变量 "message" 必须在
执行 "flash" 函数之前定义,否则脚本会引发错误,提示
它需要一个字符串。这是有道理的。我仍在学习。
但这一点让我很困惑。如果 "flash" 函数已定义,
这个脚本是如何显示文本 "End of this test script" 的,
但它没有被调用?换句话说,为什么我不需要
调用函数的一行?即 - flash(message)
你没有调用 "flash",但你确实调用了 "celestia:flash"。语句
   flash = celestia:flash(message,5)
调用 "celestia" 对象的 "flash" 方法(这就是赋值右侧的含义),然后将结果 (nil) 赋值给变量 "flash",重新定义它。这可能不是你想要的。只有在定义函数时,你才会对 "flash" 变量进行赋值。请记住
   function flash(message)
   celestia:flash(message)
   wait(2.0)
   end
等同于
 flash =  function (message)
   celestia:flash(message)
   wait(2.0)
   end
函数名 "flash" 只是另一个变量。 HankR 17:59, 2005 年 10 月 18 日 (UTC)
好的,我认为我理解你的意思。感谢你的帮助。--BrainDead 22:45, 2005 年 10 月 18 日 (UTC)

另一个测试脚本

[编辑 | 编辑源代码]
   camera = celestia:getobserver()
   tethys = celestia:find("Sol/Saturn/Tethys") -- finds object named Tethys.
   celestia:select(tethys) 
   camera:center(tethys,5)
   wait(5)
   camera:follow(tethys)
   cameraPosition = camera:getposition() -- gets position of observer.
   tethysPosition = tethys:getposition() -- gets position of Tethys.
   distance = tethysPosition:distanceto(cameraPosition) -- gets distance from position of Tethys to observer.
   celestia:flash("Current distance to Tethys is "..distance.. " km",5)
   wait(5)
   celestia:flash("Let's have a look...",5)
   wait(5)
   obs=celestia:getobserver()
   obs:gotodistance(tethys,10000,5)
   wait(5)
   celestia:flash("Here it is!",5)
   wait(5)
   newPosition = obs:getposition() -- gets NEW position of the observer.
   newdistance = tethysPosition:distanceto(newPosition) -- gets distance from position of Tethys to new observer position.
   celestia:flash("Current distance to Tethys is "..newdistance.. " km",5)
   wait(5)
好的,这个可以运行,但我还有问题...首先,感谢 Malenfant 的这个想法。
如何对 tethysPosition 和 newdistance 显示的值进行舍入?
使用 <"Current distance to Tethys is "..string.format("%i",newdistance).." km"
为什么 newdistance 值既没有显示 10000km,也没有显示 Celestia 显示屏上的值?
Celestia 的显示屏显示的是到表面的距离,你计算的是中心到中心的距离。此外,土卫六在你获取其位置的时间后已经移动了。你计算的是到其旧位置的距离,而不是到其当前位置的距离。你需要再次获取位置。每当调用 wait() 时,时间都会过去,事物也会移动。 HankR 03:31, 2005 年 10 月 24 日 (UTC)
我还在努力。--BrainDead
再次感谢你的帮助,Hank。我现在理解了这一点。--BrainDead 10:46, 2005 年 10 月 24 日 (UTC)

修正的脚本

[编辑 | 编辑源代码]
   myobject = celestia:find("Sol/Saturn/Tethys") -- finds object named Tethys.
   celestia:select(myobject) 
   celestia:center(myobject,5)
   wait(5)
   celestia:follow(myobject)
   camera = celestia:getobserver()
   cameraPosition = camera:getposition() -- gets position of observer.
   tethysPosition = myobject:getposition() -- gets position of Tethys.
   distance = tethysPosition:distanceto(cameraPosition) -- gets distance from  position of Tethys to observer.
   celestia:flash("Current distance to Tethys is "..string.format("%i",distance).." km",5)
   wait(5)
   celestia:flash("Let's have a look...",5)
   wait(5)
   celestia:gotodistance(tethys,10000,5)
   wait(5)
   celestia:flash("Here it is!",5)
   wait(5)
   obs=celestia:getobserver()
   newPosition = obs:getposition() -- gets NEW position of the observer.
   newdistance = tethysPosition:distanceto(newPosition) -- gets distance from position of Tethys to   new observer position.
   celestia:flash("Current distance to Tethys is "..string.format("%i",newdistance).." km",5)
   wait(5)
此脚本修订版纠正了我之前犯的错误,并反映了一个整数值。
不过,我想请问您,您是如何知道需要更正为整数值的?我在任何
我拥有的文档中都找不到。
在 Lua 5.0 参考手册中。
您在哪里找到 "..string.format("%i")..",我可以用它来显示两位小数吗?也许
使用 "..string.format("%2")???? --BrainDead 00:33, 2005年10月25日(UTC)
string.format 使用 C 风格的输出格式控制字符串。使用 "%.2f" 来显示两位小数。
PS - 我这里使用的格式可以吗?我是否不应该发布这么多脚本?我应该使用不同的
标题吗?抱歉,只是我… 困惑的鲍勃
如果将这些内容重新格式化为 CELX 的常见问题解答页面,可能会很有帮助。将每个问题放在一个单独的部分中,并将问题作为部分标题。这样会使它对其他人更有用。HankR 01:05, 2005年10月25日(UTC)



华夏公益教科书