ボタンだけで色をON/OFFと変化させる – FlyWithLua

2023年6月26日

datarefから色を変えるのは簡単だが、コマンドだけだと1か0を取得できないので色を変える場合、変化を取得するのは難しい。そんなとき下の方法が使える。
この場合は実際のデータを取得している訳ではないので、動作を慎重に確認する必要がある。

論理演算子のnotを使うと条件を逆にすることができる

ここでは16行目と30行目、42行目で使っている。この動作は基本的にトグルになる。
初期設定でfalseにして、not で初期設定を逆にしてtrueにしている。
if文でボタンを押した時falseからtrueに反転されることになる。

3つのボタンをそれぞれ押した時、1つだけしか点灯しないように他の2つをfalseにしている。
これで、点灯しているボタン以外を押すと、点灯ボタンは消灯して、別の押したボタンが点灯することになる。つまり3つのボタンは必ず押したボタン1つしか点灯しないことになる。

demo_wnd = float_wnd_create(150, 100, 1, true)
float_wnd_set_title(demo_wnd, "imgui Demo")
float_wnd_set_imgui_builder(demo_wnd, "build_demo")
float_wnd_set_onclose(demo_wnd, "closed_demo")

makeGreen1 = false --初期はグレー
makeGreen2 = false
makeGreen3 = false

function build_demo(wnd, x, y)
    -- 次の関数はボタンを作成します。注意!ボタン名をそれぞれ違う名前にしないと動作しない!
    if imgui.Button("Push Me1") then
        -- Button関数は、指定されたラベルでボタンを作成します。 ボタンが離された瞬間にtrueを返します。
        --つまり、ifステートメントを使用して、ボタンの背後にあるアクションを実行する必要があるかどうかを確認します。
        --ボタンを変数に切り替えましょう:
        makeGreen1 = not makeGreen1     --falseの否定になるのでtrueを返す(trueとfalseを繰り返す)
        makeGreen2 = false
        makeGreen3 = false
    end

    -- 変数を使用してテキストの色を変更します
    if makeGreen1 then                                            --makeRedはtrueなのでグリーンを表示
        imgui.DrawList_AddCircleFilled(85, 18, 8, 0xFF00FF00)     -- グリーンの円を作成
    else
        imgui.DrawList_AddCircleFilled(85, 18, 8, 0x50FFFFFF)     -- グレーの円を作成
    end

    -- 次の関数はボタンを作成します。
    if imgui.Button("Push Me2") then
        makeGreen2 = not makeGreen2
        makeGreen1 = false
        makeGreen3 = false
    end
    if makeGreen2 then                                            --makeRedはtrueなのでグリーンを表示
        imgui.DrawList_AddCircleFilled(85, 41, 8, 0xFF00FF00)     -- グリーンの円を作成
    else
        imgui.DrawList_AddCircleFilled(85, 41, 8, 0x50FFFFFF)     -- グレーの円を作成
    end

    -- 次の関数はボタンを作成します。
    if imgui.Button("Push Me3") then
        makeGreen3 = not makeGreen3
        makeGreen1 = false
        makeGreen2 = false
    end
    if makeGreen3 then                                            --makeRedはtrueなのでグリーンを表示
        imgui.DrawList_AddCircleFilled(85, 63, 8, 0xFF00FF00)     -- グリーンの円を作成
    else
        imgui.DrawList_AddCircleFilled(85, 63, 8, 0x50FFFFFF)     -- グレーの円を作成
    end
end