トップページ > .CELXスクリプトガイド > コールバック関数

コールバック関数


この関数は外部で起きたイベントに応じて実行されます。
次の2つがあります。
コールバック関数にはいくつか制限事項があります。
まずこの関数は1秒以内に実行を完了させなければなりません。また、wait()は使用できません。

celestia_keyboard_callback


キーボード入力に関するコールバック関数です。
celestia:requestkeyboard(true)でスクリプトによるキーボード入力を許可すると使用できます。
何かキーボード入力があれば関数が呼ばれます。
このメソッドは文字列の引数を1つ取ります。入力されたキーに対応する文字です。
Ctrl+AやEnter、Backspaceなどの特殊なキーは無視されます。
また、カーソルキーやEscキーではコールバック関数そのものが呼ばれません。

コールバック関数はtruefalseのいずれかを返す事ができます。
コールバック関数が呼ばれている間にエラーが起これば、エラーメッセージがコンソールに(~キーで見られます)表示され、暗黙的にfalseが返されます。この時、押されているキーに対する処理は継続されます。

例:
-- Shift+Eキーで地球へ、Shift+Mキーで火星へ
-- 英数字キーを用いた通常のキーボードコマンドは無効になります。
function celestia_keyboard_callback(input)
	obs = celestia:getobserver()
	-- Shift+EキーかShift+Mキーが押された場合
	if input == "E" or input == "M" then -- シフトキーを押さない場合ならば"e"(Caps LockがOFFの場合)
		if input == "E" then -- Shift+Eキーが押された場合
			obj = celestia:find("Sol/Earth")
		else -- Shift+Mキーが押された場合
			obj = celestia:find("Sol/Mars")
		end
		-- 天体に追尾して選択して移動
		obs:follow(obj)
		celestia:select(obj)
		obs:goto(obj)
	end
end

celestia:requestkeyboard(true) -- スクリプトによるキーボード入力を許可
while 1 do -- キーボード入力待ちの状態に
	celestia:flash("Shift+E key to go to the Earth...\nShift+M key to go to the Mars...")
	wait(0.1)
end
このページのトップへ

celestia_cleanup_callback


スクリプトが終了した場合(正常終了、エラーによる異常終了、ユーザによる終了)に呼び出される関数です。
スクリプト開始前の状態に表示などを戻す場合に便利です。
エラーはコンソールにのみ表示されます。
-- オリジナルの状態に回帰
function celestia_cleanup_callback()
	celestia:setrenderflags(original_renderflags)
	celestia:setlabelflags(original_labelflags)
	celestia:setorbitflags(original_orbitflags)
	celestia:setambient(original_ambient)
	celestia:setfaintestvisible(original_faintestvisible)
	celestia:setminorbitsize(original_minorbitsize)
	celestia:setstardistancelimit(original_stardistancelimit)
	celestia:setminfeaturesize(original_minfeaturesize)
	celestia:setstarstyle(original_starstyle)
	celestia:select(original_selection)
	celestia:settime(original_time + (celestia:getscripttime() / 3600 / 24))
	celestia:settimescale(original_timescale)

	celestia:getobserver():setposition(original_position)
	celestia:getobserver():setorientation(original_orientation)
	celestia:getobserver():setspeed(original_speed)
	celestia:getobserver():setsurface(original_surface)
	celestia:getobserver():setlocationflags(original_locationflags)
	celestia:getobserver():setfov(original_fov)
	celestia:getobserver():setframe(original_frame)
end

-- オリジナルの状態を取得
original_renderflags = celestia:getrenderflags()
original_labelflags = celestia:getlabelflags()
original_orbitflags = celestia:getorbitflags()
original_ambient = celestia:getambient()
original_faintestvisible = celestia:getfaintestvisible()
original_minorbitsize = celestia:getminorbitsize()
original_stardistancelimit = celestia:getstardistancelimit()
original_minfeaturesize = celestia:getminfeaturesize()
original_starstyle = celestia:getstarstyle()
original_selection = celestia:getselection()
original_time = celestia:gettime()
original_timescale = celestia:gettimescale()

original_position = celestia:getobserver():getposition()
original_orientation = celestia:getobserver():getorientation()
original_speed = celestia:getobserver():getspeed()
original_surface = celestia:getobserver():getsurface()
original_locationflags = celestia:getobserver():getlocationflags()
original_fov = celestia:getobserver():getfov()
original_frame = celestia:getobserver():getframe()

-- スクリプト開始後30秒で元の状態に戻ります。色々と表示を変えてみてください。
for i = 30, 1, -1 do
	celestia:flash([[
Please change the condition.
It will return back when the script ends.
Left ]] .. i)
	wait(1)
end
celestia:flash("Done.")
このページのトップへ
トップページ > .CELXスクリプトガイド > コールバック関数