時間の遅延設定os.clock()が使える – FlyWithLua

2023年7月30日

時間を使う方法もいくつかある。

os.clock()を使う

簡単に実行してみる。以下はABCという文字をX-Plane内の下のほうに表示し、5秒たったら消す。

local starting_time = os.clock()
function Text_draw()
	if os.clock() < starting_time + 5 then --os.clock()がstarting_timeより小さい間は以下を実行
		draw_string( 100, 100, "ABC", 0, 1, 0)
    end
end
do_every_draw("Text_draw()")

逆に5秒たったら表示する場合は「<」を「>」にすればいいことになる。遅延表示になる。

時間で消えるQNHバブル表示

更にQNHの設定がおかしい場合は、下の画像以外にもう一つバブルが表示されそのバブルをクリックするとQNHをちゃんと設定するようになっている。そのバブルはQNHが問題ないなら表示されない。これはクリックするまで消えない。

以下は上のQNH設定の上にバブルウインドウが表示され、これが時間(ここでは10秒)が来たら消えるという仕掛けになっている。

チョット複雑だが時間の遅延というのは結構使う可能性が高い。

DataRef("QNH_Pilot", "sim/cockpit2/gauges/actuators/barometer_setting_in_hg_pilot", "writable")
DataRef("QNH_CoPilot", "sim/cockpit2/gauges/actuators/barometer_setting_in_hg_copilot", "writable")
DataRef("QNH", "sim/weather/barometer_sealevel_inhg")

local starting_time = os.clock()
local QNH_y1
local QNH_y2
local QNH_x
local QNH_problem = false
---------------------------------------------------------------------------------------------
function Steffi_says()
	local pos = 0
	if math.abs(QNH-QNH_Pilot) > 0.01 then
		QNH_y1 = pos
		pos, QNH_x = big_bubble(20, pos, "Please check the barometer setting!", "Your altimeter is showing wrong values.", string.format("The right QNH is %2.2f in/Hg or %.1f hPa.", QNH, QNH * 33.8637526), "Or just click on this bubble and I'll fix it for you.")
		QNH_y2 = pos
		QNH_problem = true
	else
		QNH_problem = false
	end
	if os.clock() < starting_time + 10 then
		pos = big_bubble(20, pos, "Steffi says:", "Hi!", "My name is Steffi, and I'm your virtual copilot.", "Let's enjoy our flight.")
	end
end

do_every_draw("Steffi_says()")
---------------------------------------------------------------------------------------------
function Steffi_does_on_clicks()
	if QNH_problem and MOUSE_X > 10 and MOUSE_X < QNH_x and MOUSE_Y > QNH_y1 and MOUSE_Y < QNH_y2 then
		QNH_Pilot = QNH
		QNH_CoPilot = QNH
		RESUME_MOUSE_CLICK = true
	end
end

do_on_mouse_click("Steffi_does_on_clicks()")
---------------------------------------------------------------------------------------------

バブルの中の英語の翻訳:

時間が来たら消えるバブルの内容。

os.clock()を使った点滅表示

ここではos.clock()で取得した秒数を、剰余で取得した値に変換、if分で切り替えて交互に表示させている。
どんな整数でも3でわると,剰余(%)のあまりは0,1,2のいずれかになる。意味はまったく不明なので以下のサイトで計算してくれるので参考に。

計算をやってくれるサイト:https://keisan.casio.jp/exec/system/1510710795

1÷3の余りは1、2÷3の余りは2、3÷3の余りは0、最後の0は分かりやすい。この剰余で計算して出てきた値を使用している。0、1、2を繰り返している。この剰余を使うと秒数を変換して繰り返すことができるようだ。

以下がその結果になる。1秒毎に以下の画面を繰り返す。

function Steffi_says()
	local starting_time = os.clock()
	local msgtime	
	msgtime = starting_time % 3	
	--秒数を増やすには%3を%6にして2秒に1回点滅させるようにすることができるかも

	--上のmsgtimeを数値にして見てみる(0、1、2と3つの値が繰り返し表示される)
	-- %d=整数、
	local info_to_print = string.format("msgtime = %d", msgtime)
	draw_string_Helvetica_18(200, 320, info_to_print)
		
	--1秒より小さい場合、以下を表示(つまり10秒間表示)
	if msgtime < 1.0  then --1より小さい「0」のときは赤文字
		 draw_string( 200, 350, "Please", "red" )
	end
	if msgtime >= 1.0 and msgtime < 2.0 then --1以上、2以下のつまり「1」のとき
		 draw_string(200, 350, "Please", "green" )
	end
  	--それ以外は何も表示しない。
end
do_every_draw("Steffi_says()")

datarefのtimeを使った時間設定

テキストの点滅と移動

これはFlyWithLuaを導入する一番最初に表示される点滅のテキストがこれになる。
DataRef( “sim_time”, “sim/network/misc/network_time_sec”) これで時間を取得しているようだ。

%3とは上の取得したデータの余りの数値(剰余)を使っている。「3」という数値は3つの点滅を作成することができる。2つでいい場合は2として、下のif文を2つつくると良い。
3のまま2つのif文を作成すると2つめが長く表示されることになる。トンツーという感じ。datarefの「sim_time」をそのまま取得すると秒単位でカウントしていく。
%2で値を取得すると余りの数値が0と1の2種類の繰り返しになる。%3にすると0、1、2の3種類の繰り返しになる。

下のスクリプトはタイムを%3で演算したらどのような数値が出てくるのかをテストしている。

DataRef("sim_time", "sim/network/misc/network_time_sec")

function MyHelloWorld()
	local msgtime
	msgtime = sim_time % 3
	---------------------------------------------------------------------------------------
	if msgtime < 1.0 then --1より小さい場合
		draw_string(50, 300, "Please", "red")
	end
	---------------------------------------------------------------------------------------
	if msgtime >= 1.0 and msgtime < 2.0 then --1.0より大きいか等しい
		draw_string(50, 300, "read", "green")
	end
	---------------------------------------------------------------------------------------
	if msgtime >= 2.0 then --2.0より大きいか等しい
		draw_string(50, 300, "the manual!", "blue")
	end
	---------------------------------------------------------------------------------------
	--テキストが右に移動しながら点滅しながら色が変化する
	draw_string(
	--以下のテキストを画面左50の位置から高さ350の位置に表示
	-- + sim_time * 30 % 400は横に位置を時間を読んでプラスして右に移動している。
		50 + sim_time * 30 % 400, 350,
		--50, 350, --止まって表示する場合はこれ
		"If you want this message to disappear you will have to follow the bubble's instruction!",
		-- math.floor(x)	小数点以下を切り捨てて整数にします
		sim_time - math.floor(sim_time),          --これを外すと白色で止まる
		sim_time - math.floor(sim_time + 0.6) + 0.6, --色が変わる
		sim_time - math.floor(sim_time + 1.2) + 1.2 --外すとエラーになる
	)
	---------------------------------------------------------------------------------------
end
do_every_draw('MyHelloWorld()')

下の画面で、上の長い文字が右へ移動して行き、ある程度移動したら元の位置に戻って移動を繰り返す。さの間、テキストの色も交互に赤、緑、青と点滅する

下にある短いテキストは止まったまま赤、緑、青と点滅する。

時間を測る

do_sometimes()

フライトタイム:sim/time/total_flight_time_sec
秒で計る、X-Planeを起動している間ずっとカウントアップする。
sim/time/total_running_time_sec
sim/time/zulu_time_sec

下のスクリプトは時間になったら雲の中の色を白くすることができる。
どのくらいたったらというように時間を設定するには、他の方法もある。

雲の中を白くする、止まっていた機体でやってみたので雲が白くなるのがわからない。

--used dadatef
--フライトタイムはずっと時間が増えるだけのなので、これは1回しか見ることが出来ない。
dataref("flighttime", "sim/time/total_flight_time_sec", "readonly")                --フライト時間を計る
dataref("sky_woic", "sim/private/controls/skyc/white_out_in_clouds", "writable")   --雲の中の色を白くする

--時間依存セット0の関数
function set_woic()
    if (flighttime > 50) then --50秒以上になったら以下を実行
        sky_woic = 1
    end
end

do_sometimes("set_woic()")