跳轉到內容

Celestia/Cel 指令碼

來自華夏公益教科書

CEL 指令碼

[編輯 | 編輯原始碼]

CEL 指令碼是 Celestia 可以讀取的簡短基於文字的程式。它們包含簡單的命令,可以控制 Celestia(一旦啟動)並使指令碼編寫者能夠設計使用者將看到和體驗的特定旅程或場景集。例如,指令碼可能會帶使用者進行太陽系的簡短遊覽,並在所有行星處短暫停留。這樣,CEL 指令碼用於改變 Celestia 視點的 位置。

CEL 指令碼基本上是一系列類似於按鍵的命令,這些命令以特定的時間和速度執行,以便為觀眾提供指令碼編寫者想要展示的視覺體驗。但是,在執行 CEL 指令碼期間,使用者無法與之互動。


指令碼可以將使用者帶到 Celestia 宇宙中的特定位置。例如,可以編寫一個指令碼將使用者帶到金星軌道,或者將使用者帶到銀河系之外,從星系際空間觀察它。當用戶到達那裡時會發生什麼也由指令碼控制。可能會有 30 秒的暫停,然後移動到另一個位置。還可能顯示文字,向用戶教授有關特定地點的一些資訊。

指令碼還具有更改特定 Celestia(渲染)設定的能力。例如,可以開啟/關閉軌道的渲染,或者可以給行星新增標記或替代表面紋理。但是請注意,當 CEL 指令碼結束或被使用者終止時,無法將這些設定重置為執行指令碼之前的值。建議使用者擁有自己的 reset.cel 指令碼,以便在執行其他 CEL 指令碼後可以輕鬆地恢復特定的 Celestia(渲染)設定。


可以透過 Celestia/檔案/開啟指令碼...Celestia/檔案/指令碼 下拉選單啟動指令碼,它將一直執行到完成。同時,使用者可以透過按 [空格鍵] 暫停指令碼,或者可以透過按 [Esc] 鍵隨時停止指令碼。
當指令碼的副檔名“.cel”也與 Celestia 程式正確關聯時,也可以從外部啟動指令碼,例如從超連結或雙擊。


指令碼為 Celestia 使用者提供了幾個關鍵優勢

  1. Celestia 指令碼編寫者可以為沒有經驗的使用者提供特定 Celestia 環境的精美視覺之旅。
  2. 可以透過指令碼控制,為使用者顯示重要的天體事件。例如,一個指令碼可以帶使用者回到 1957 年,觀看第一顆人造衛星史普特尼克 1 號繞地球執行。該指令碼可以將觀眾置於距離史普特尼克 1 號僅 10 米的位置,並使其隨著它飛越蘇聯而移動,然後顯示一段文字解釋史普特尼克 1 號的意義。
  3. 如果沒有指令碼,使用者可能需要花費很多分鐘才能設定 Celestia 以在同一時間去到同一個位置。此外,不會顯示任何文字。
  4. 在 Celestia 程式的特殊 Celestia-ED 版本中,CEL 指令碼被賦予了命令聲音和音樂檔案播放的能力。因此,可以設計指令碼,這些指令碼可以在移動到音樂時,編排行星或航天器的複雜運動。


編寫 Celestia 指令碼命令

[編輯 | 編輯原始碼]

任何人都可以編寫 CEL 指令碼。需要了解一些編寫 CEL 指令碼的知識,這些知識總結如下,但你無需成為經驗豐富的 Celestia 使用者即可編寫 CEL 指令碼。

CEL 指令碼中的第一個字元必須是左花括號“{”。指令碼的最後一個字元必須是右花括號“}”。

因此,一個空的但有效的 Celestia CEL 指令碼檔案如下所示

{ }

你為 Celestia 建立的每個指令碼中都將至少包含一條命令列,這是一行文字,指示 Celestia 設定或執行某些操作。

典型的單行 Celestia 指令碼命令由以下部分組成

  • 一個命令名稱,例如 wait
  • 一個空格(空格鍵)
  • 一個左花括號“{
  • 零個或多個 引數名稱,以及你要將引數設定成的
  • 一個右花括號“}

“#”字元可以用作指令碼行中的第一個字元,以使該行成為註釋行,指令碼引擎將忽略(不執行)該行。


示例

duration 引數的值設定為 5.5,該值是一個 <數字>,在 wait 命令中,該命令告訴 Celestia 暫停你輸入的秒數。

注意: <數字> 值(5.5)周圍沒有雙引號("),因為雙引號僅用於指定 <字串> 值。

wait { duration 5.5 }

object 引數的值設定為“Mars”,該值是一個 <字串>,在 select 命令中

注意:在這裡,雙引號告訴 Celestia 它正在接收一個 <字串> 或文字值(Mars)。當向 Celestia 傳送 <字串> 時,該值 必須用雙引號括起來。

select { object "Mars" }

註釋行的示例。

# This is a comment line

一些 Celestia CEL 指令碼命令,例如 print,傳送多個引數。在這些情況下,將所有引數及其關聯的值包含在命令的左花括號和右花括號之間,例如

注意:每個命令的所有引數都必須包含在命令的花括號內,如上例所示。你可以根據需要包含任意多的空白(空格、空行等),甚至可以在不同的行上指定每個引數及其關聯的值,這一切都是為了清晰起見。

print { text "Hello universe."  row -4  column 1  duration 5 }

-- 或 --

print { text "Hello universe."
        row -4
        column 1
        duration 5 }

當你將 Celestia CEL 指令碼檔案儲存到磁碟時,副檔名必須是“.cel”,這將使你的作業系統能夠識別該檔案屬於 Celestia,並使 Celestia 知道該檔案是它的 CEL 指令碼之一。此外,必須將檔案儲存為 純文字。富文字格式檔案在 Celestia 中不起作用,因為它們還包含嵌入的格式化資訊。

可用 CEL 命令索引

[編輯 | 編輯原始碼]

可以在 CEL 命令索引 部分的 CEL 到 CELX 遷移章節中找到可用 CEL 命令的索引。

透過點選某個特定命令,你將被引導到對該命令功能的解釋。該索引還包含對如何將該 CEL 命令遷移到等效 CELX 物件和方法的解釋。但是,在開始使用 CELX 指令碼之前,你可能需要先具備一些使用 CEL 指令碼的程式設計經驗。

CEL 指令碼與 CELX 指令碼

[編輯 | 編輯原始碼]

CEL 指令碼的主要優點是它比 CELX 指令碼 容易得多。由於命令結構簡單,語法很容易,並且大多數情況下,將鍵盤命令直接轉換為它們的 CEL 對應項非常容易。

使用 CEL 指令碼與 CELX 指令碼相比的主要缺點是它的靈活性有限,它無法響應鍵盤命令,無法將已更改的使用者設定重置為執行 CEL 指令碼之前的值,並且不支援 Celestia 版本 1.6.0 及更高版本中出現的許多 Celestia 功能。


CEL 指令碼和 CELX 指令碼之間的主要區別總結如下

  • CEL 和 CELX 指令碼的副檔名不同
    • CEL 指令碼:.CEL
    • CELX 指令碼:.CELX
  • 更多的詞語和命令使 CELX 指令碼看起來比 CEL 指令碼更復雜,但它也為你的指令碼提供了更多可能性,包括使用 Lua 邏輯(如構建迴圈,根據情況做出決定,計算等)和互動式鍵盤輸入。
    CEL 到 CELX 遷移 部分將幫助你瞭解 CEL 命令的更復雜的 CELX 等效項,這樣你就可以在自己的指令碼中使用這些等效項。除了等效項之外,還包含示例。你可以將等效項複製到自己的指令碼中,並根據自己的意願修改它們。過一段時間後,你將更加熟悉 CELX 指令碼,並且每次複製或輸入一系列 CELX 方法和物件都會變得更容易。
  • CELX 中可以進行鍵盤互動,但在 CEL 指令碼中則不行。在 CELX 中,你可以使用鍵盤輸入的回撥,該回調必須命名為 celestia_keyboard_callback。指令碼透過呼叫 celestia:requestkeyboard(true) 啟用鍵盤輸入處理後,任何按鍵都將導致呼叫此方法。
  • CELX 中的角度以弧度定義,而不是 CEL 中的度數。
    180 度(半圓)等於 π 弧度 = 3.14159265 弧度。
    你可以使用 Lua 的 math.rad()math.deg() 函式將度數轉換為弧度,反之亦然。
    • 弧度 = math.rad( <數字:度數> )
    • 或者你可以自己轉換:弧度 = ( <數字:度數> / 180 * 3.14159265)
    • 或者使用 Lua 的 math.pi:弧度 = ( <數字:度數> / 180 * math.pi)
    • 度數 = math.deg( <數字:弧度> )
    • 或者你可以自己轉換:度數 = ( <數字:弧度> * 180 / 3.14159265)
    • 或者使用 Lua 的 math.pi:度數 = ( <數字:弧度> * 180 / math.pi)
  • CELX 中的位置物件的各個分量的單位是光年百萬分之一。當你擁有以千米(CEL 指令碼)或英里定義的位置分量時,你首先需要將這些分量轉換為光年百萬分之一。
    因此,你可以使用一個常量,該常量必須先在 CELX 指令碼中初始化
    • 從千米轉換為光年百萬分之一,使用常量:uly_to_km = 9460730.4725808。
    • 從英里轉換為光年百萬分之一,使用常量:uly_to_mls = 5912956.5453630。
  • 接下來,您可以將公里或英里轉換為光年的百萬分之一,方法如下:
    • 百萬分之一光年 = <數字:公里> / uly_to_km
    • 百萬分之一光年 = <數字:英里> / uly_to_mls
  • 請注意,與 CEL 指令碼中的等效預設值相比,CELX 中的一些預設引數值已更改。
  • CELX 中的時間以 TDB(質心動力學時間)定義,而不是 UTC 或儒略日,因為 UTC 包含“閏秒”以保持與地球變化的自轉一致。閏秒基本上是隨機發生的,當需要它們時就會發生。雖然 Celestia 包含一個閏秒時間表,但在 Celestia 1.5.0 之前的版本中使用 UTC 會導致與使用 TDB 定義的星曆一起使用時出現問題。
    從版本 1.5.0 開始,雖然它仍然在螢幕上顯示 UTC,但 Celestia 在內部使用 TDB 時間標度來執行其他所有操作。因此,Celestia 比以前更準確地放置物體。
    • 從儒略日和/或 UTC 轉換為 TDB 的說明在以下部分中介紹:CEL: time
  • 標記的透明度在 CELX 中可以為 truefalse(從 Celestia 版本 1.6.0 開始)。在 CEL 指令碼中,無法啟用或停用標記的透明度。Celestia 版本 1.5.0/1.5.1 及更早版本始終顯示標記,但從 Celestia 版本 1.6.0(或 Celestia-ED 版本 1.5.1)開始,預設標記透明度為 true,導致掩星時標記消失,或在天體表面上部分顯示標記。為了克服這一點,有必要在 CELX 中使用 false 引數:object:mark() 方法,這也需要使用 CELX 指令碼,而不是 CEL 指令碼!
  • 有時,CELX 指令碼中的計時可能比 CEL 指令碼更敏感,尤其是在短時間內使用大量 Lua 命令和 Celestia(相關)方法時,且計時器值較高([i]例如[/i]當時間加速時)。在您自己的計算機上解決這些計時問題並不一定會在具有不同 CPU 速度的其他計算機上產生相同的結果。在這些情況下,在您的 CELX 指令碼中使用 CEL 等效部分可能會產生更一致的結果。
  • 可以透過在 CELX 指令碼開頭定義以下函式,在 CELX 指令碼中插入 CEL 指令碼部分。
function CEL(source) 
   local script = celestia:createcelscript(source) 
   while script:tick() do 
      wait(0) 
   end 
end

-- Within the subsequent part of your CELX script you can now use CEL script commands as follows:
CEL([[{ <one or more lines with CEL script commands> }]])
  • CEL 和 CELX 指令碼可以透過按下 [空格鍵] 暫時暫停。再次按下 [空格鍵] 將繼續執行指令碼。
    注意:當在 CELX 指令碼中使用 CEL 指令碼部分和函式內部時,此暫停功能將無法完全正確執行。雖然您正在檢視的場景將直接暫停,但 CEL 指令碼部分和函式將繼續在後臺執行,導致當您再次按下 [空格鍵] 以繼續指令碼時,指令碼的一部分在視覺上被跳過。
[編輯 | 編輯原始碼]

一個略微過時的 .CEL 命令摘要

更多 .CEL 指令碼命令 的列表,以一種略微隱晦的方式組織。

一個示例 .CEL 指令碼

一些對 Celestia 有用的 .CEL 和 .CELX 指令碼可在 Don G 的 Celestia 指令碼資源 上找到。

華夏公益教科書