トップページ > .CELXスクリプトガイド > .CELXスクリプトについて

.CELXスクリプトについて


.CELXスクリプトとは


.CELXスクリプトは.CELスクリプトと同様、Celestiaを自動的に制御する事ができます。

主な機能 .CELXスクリプトはLuaを基としており、.CELスクリプトよりも複雑でより高機能な事ができます。

.CELスクリプトには無い.CELXスクリプトでできる機能 他にも様々な機能があります。
Luaに関しての詳細はこちら。 Lua 5.0 Reference manual 非公式日本語訳
C、C++、Javaなどと同様の要領で出来ます。以下は一例です。
obs = celestia:getobserver()
while 1 do
    nstars = celestia:getstarcount()
    index = math.floor(nstars * math.random())
    star = celestia:getstar(index)
    celestia:select(star)
    obs:goto(star, 10)
    wait(10)
end
このページのTOPへ

基本


詳細はhttp://www.lua.org/を参考にしてください。
ここでは簡単な例を示します。
行の最後に";"をつける必要は特にありません。
コメントは --(単一行)、--[[ "コメント" ]] (複数行)が使用できます。
なお、.CELスクリプトの様なスクリプトの初めと終わりの中括弧{ }は不要です。

簡単なスクリプト

以下のスクリプトではCelestiaの画面上に"Hello World!"という文字列を10秒間表示します。
celestia:flash("Hello World!", 10)
celestia:flashは画面左下に文字列を表示します。引数として1番目に文字列、2番目に数値を取ります。
"Hello World!"は表示する文字列です。文字列は""で囲んでください。
10 は継続時間です。どれだけの時間指定した文字列を表示するかを決めます。単位は秒です。

テキストエディタで作成できます。拡張子を".celx"にして保存してください。
以上の枠線内の内容を保存して実行すればCelestia画面の左下に"Hello World!"が表示されます。
Celestiaのインストール時に関連づけられていればファイルをダブルクリックして実行できます(Windows版)。
また、メニューバーよりWindows版: File→Open Script...(日本語版:ファイル→スクリプトを開く...)、Mac OSX版: File→Run Script...(日本語版:ファイル→スクリプトを開く...)でスクリプトを選択する事ができます。

変数と型


変数を宣言する必要は無く、型も持ちません。変数の中身が型を持ちます。その為、同じ変数に様々な形態の値を入れる事が可能です。
下記の例では変数aに数値、文字列、ブール代数など様々な値を代入しています。
a = 1 -- 変数の宣言。aの値は1
a = a / 2 -- aの値は0.5
a = "Hello World!" -- aに文字列"Hello World!"を代入
a = a / 2 -- エラーとなります。
a = true -- aにブール代数 true を代入
a = not a -- -- a の値は false
またテーブル(連想配列)を使用する事ができ、各要素に名前を設定する事ができます。
t = {} -- 連想配列の生成
t["key1"] = "value1" -- 要素の指定方法1
t.key2 = "value2" -- 要素の指定方法2
u = { key1="value1", key2="value2" } -- ここでuはtと等価
v = { 1,2,3,4,5 } -- v[1]=1、v[2]=2、...

if文、for文、while文


Luaでは以下の様にif文、for文、while文を使用できます。

この例では1から10まで1ずつ増えながら繰り返します。
for i = 1, 10 do
  ...
end

この例では100から0まで10ずつ減りながら繰り返します。
for i = 100, 0, -10 do
  ...
end

この例ではiが10より大きいときにthen-endの間を実行します。
if i > 10 then
  ...
end

この例ではiが10より大きく100以下の場合にthen-else間、そうでない場合にelse-end間を実行します。
if i > 10 and i <= 100 then
  ...
else
  ...
end
論理演算子はand、or、notが使用できます。
if i > 10 and i <= 100 then -- 10より大きくて100以下
if i < 10 or i >= 100 then -- 10より小さいか100以上
if not i > 10 then -- 10より大きくない(=10以下)

この例ではiが100より大きくなるまでループの中身を実行します。ループの最後にiを1だけ増やしています。
i = 0
while i <= 100 do
  ...
  i = i + 1
end

数学関数


Luaでは以下の数学関数が使えます。
文中のx、y、x1、x2などは数値です。
math.abs(x) -- xの絶対値を返します。
math.acos(x) -- xのアークコサイン返します。
math.asin(x) -- xのアークサインを返します。
math.atan(x) -- xのアークタンジェントを返します。
math.atan2(x, y) -- x、yのアークタンジェントを返します。
math.ceil(x) -- xを小数第1位で切り上げます。
math.cos(x) -- xのコサインを返します。xの単位はラジアンです。
math.deg(x) -- ラジアンで与えられたxを度に変換します。
math.exp(x) -- eのx乗を返します。
math.floor(x) -- xを小数第1位で切り捨てます。
math.log(x) -- xの自然対数(底:e)を返します。
math.log10(x) -- xの常用対数(底:10)を返します。
math.max(x1, x2, ...) -- x1、x2、...の中で最大の値を返します。
math.min(x1, x2, ...) -- x1、x2、...の中で最小の値を返します。
math.mod(x, y) -- xをyで割った余りを返します。
math.pow(x, y) -- xのy乗を返します。
math.rad(x) -- 度で与えられたxをラジアンに変換します。
math.sin(x) -- xのサインを返します。xの単位はラジアンです。
math.tan(x) -- xのタンジェントを返します。xの単位はラジアンです。
math.frexp(x) -- ?
math.ldexp(x) -- ?
math.random() -- 0以上1未満の範囲の擬似乱数の実数を返します。
math.random(x) -- 0以上x未満の範囲の擬似乱数の実数を返します。
math.random(x, y) -- x以上y未満の範囲の擬似乱数の実数を返します。
math.randomseed(x) -- シード値xを与えて擬似乱数を生成します。
math.randomseeddestiny(x)
math.pi -- 円周率π=3.14159...を返します。

使用例:
-- 地球上のある地点(三鷹)に移動し、地平線を正面に
obs = celestia:getobserver() -- observerオブジェクトを取得
earth = celestia:find("Sol/Earth") -- 地球のobjectオブジェクトを取得
celestia:select(earth) -- 地球を選択
obs:synchronous(earth) -- 地球に自転同期で追尾
obs:gotolonglat(earth, math.rad(139.541), math.rad(35.6725), earth:radius()+0.05, 5) -- 三鷹へ移動
wait(6) -- 移動時間の5秒+一息つく1秒
v = celestia:newvector(1, 0, 0) -- vectorオブジェクトを生成
rot = celestia:newrotation(v, -math.pi/2) -- rotationオブジェクトを生成
obs:rotate(rot) -- 地平線が正面(空が上)になるように回転
-- 実行する度にランダムな恒星へ移動
obs = celestia:getobserver() -- observerオブジェクトを取得
s = math.random(celestia:getstarcount()) -- 恒星総数を取得してその範囲内でのランダムな値を設定
obj = (celestia:getstar(s)) -- objectオブジェクトを設定
celestia:select(obj) -- 選択
obs:center(obj, 3)
wait(3)
obs:goto(obj, 3) -- 移動
wait(3)

トップページ > .CELXスクリプトガイド > .CELXスクリプトについて