Celestia/Celx 脚本/问答
此页面旨在作为 CELX 脚本实践问题和解答 (Q&A) 的存储库。有两种方法可以将内容列在这里
- 只需在下面的 Q&A 部分列出您的通用问题,就会有人在其中发布答案。请将有关特定答案的讨论(例如澄清请求)发布到该答案的讨论页面。然而不幸的是,很少有 CELX 编程专家定期浏览此维基教科书。
或(首选)
- 在 Celestia 脚本论坛 上发布您的问题。一旦您在那里对答案感到满意,请将问题和最终答案摘要转录到这里,以便我们可以在此维基教科书中建立一个知识库。
以下的疑问和解答已从一个“讨论”页面迁移到这里。那些页面用于讨论与编辑维基教科书页面相关的议题,而不是提供维基教科书的内容。
如果有任何不清楚的地方,请在这里提问。
只需点击上面“编辑此页面”按钮,然后开始输入。或者点击此页面中的一个[编辑]按钮,并在其底部插入一个新的问题或解答。
使用这里第一个非常简单的 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。
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)