#マウスの押しっぱなしを無効にする
##kuina.ch公式の「入力関係」を確認
プログラミング言語Kuin:ドキュメント
上記サイトの中にある「Kuinドキュメント301 wndライブラリ」の中に、マウス入力関係の機能が載っています。該当の箇所は「wnd@Draw」です。この中にマウスの処理に関するものが見つかりますが、ドキュメントには細かい使い方が載っていません。
##kuin.exe同梱のサンプルプログラムを確認
2017/10/8現在、プログラミング言語Kuinを導入すると付属しているサンプルプログラムの中に、マウス入力関係の使用法が示されています。
その中でマウス入力を受け付ける準備と、その処理は以下のようになっています。
kuina.ch公式のサンプルプログラムを参考にしつつお読みください。
変数や関数名はそのままです。
まずグローバルで「マウスが押されている判定」の変数を宣言。
var mouseDownL: bool
次にmain()内でマウスが押された時に発生するイベントを設定します。
この中で「@drawMainOnMouseDownL
」とは自分で用意する関数です。
[...]は中略です。
func main()
...
do @drawmain.onMouseDownL :: @drawMainOnMouseDownL
...
このようにしておくと、マウスの左ボタンが押された時に@drawMainOnMouseDownL
が呼び出されるということになるようです。
以下はその@drawMainOnMouseDownL
の中身です。
func drawMainOnMouseDownL(wnd: wnd@Draw, x: int, y: int)
do @mouseDownL :: true {左ボタンが押された}
end func
引数は現段階で無視してください。私もよくわかりません。
最初に用意したグローバル変数 @mouseDownL
に true を設定します。
この @mouseDownL
を読むことで、プログラム実行中「マウスボタンが押されているか否か」を判定するという形です。サンプルプログラムとしてはこれ以上の内容は示されていません。
サンプルプログラムを実行すると「マウス左ボタンを押している間、色が変わる円が描画される」というものになります。
A)ボタンを押していない
##ボタンを押した瞬間だけ処理する
まずグローバル変数に「@mouseLLock
」のようなロック用の変数を用意します。
var mouseDownL: bool
var mouseLLock: bool {←追加分}
メイン関数の中に記述するイベント取得はそのまま利用できます。
同じ内容です。
func main()
...
do @drawmain.onMouseDownL :: @drawMainOnMouseDownL
...
次に「@drawMainOnMouseDownL
」関数の内容をいじります。
func drawMainOnMouseDownL(wnd: wnd@Draw, x: int, y: int)
{ロック判定が true の場合は無視する}
if(@mouseLLock <> true)
{ロック判定が false なら @mouseDownL を true にしマウス入力判定を立てる}
do @MouseDownL :: true
end if
{ロックをかける。}
do @mouseLLock :: true
end func
マウスを押した瞬間に「マウスが押された」「マウスをロックした」処理が起こります。この時、マウスを押しっぱなしにしていると「マウスのロック」判定によって、@mouseDownL
への処理が無視されます。
次に「マウスを離した時」の判定を修正します。これはサンプルプログラム内で @drawMainOnMouseUpL
として実装されていたものを、以下のように変更します。
func drawMainOnMouseUpL(wnd: wnd@Draw, x: int, y: int)
do @mouseDownL :: false {左ボタン離された}
do @mouseLLock :: false {←追加分。マウスロック解除}
end func
マウスが離された場合、ロック機構は不要なので無条件で @mouseLLock
も false にします。
最後にプログラム中で「マウスを押したときに処理する部分」に、@mouseLLock
を false とする処理を追加すれば「マウスを押している最初の瞬間だけ処理する」という形になり、押しっぱなし問題は解決します。
例)
{マウス判定ループ}
if(@mouseDownL = true){マウス左が押されたなら}
do @mouseDownL :: false
... {以下マウスを押された時の処理}
これは今回の修正で「マウスを離さない限り、マウスを押し続けていたとしても @mouseDownL
が true にならない」という状況にした為です。