2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Kuin マウス入力の「押しっぱなし」を無効にする処理

Last updated at Posted at 2017-10-08

#マウスの押しっぱなしを無効にする
##kuina.ch公式の「入力関係」を確認
プログラミング言語Kuin:ドキュメント
上記サイトの中にある「Kuinドキュメント301 wndライブラリ」の中に、マウス入力関係の機能が載っています。該当の箇所は「wnd@Draw」です。この中にマウスの処理に関するものが見つかりますが、ドキュメントには細かい使い方が載っていません。

##kuin.exe同梱のサンプルプログラムを確認
2017/10/8現在、プログラミング言語Kuinを導入すると付属しているサンプルプログラムの中に、マウス入力関係の使用法が示されています。
その中でマウス入力を受け付ける準備と、その処理は以下のようになっています。
kuina.ch公式のサンプルプログラムを参考にしつつお読みください。
変数や関数名はそのままです。
まずグローバルで「マウスが押されている判定」の変数を宣言。

main.kn
var mouseDownL: bool

次にmain()内でマウスが押された時に発生するイベントを設定します。
この中で「@drawMainOnMouseDownL」とは自分で用意する関数です。
[...]は中略です。

main.kn
func main()
    ...
    do @drawmain.onMouseDownL :: @drawMainOnMouseDownL
    ...

このようにしておくと、マウスの左ボタンが押された時に@drawMainOnMouseDownLが呼び出されるということになるようです。
以下はその@drawMainOnMouseDownLの中身です。

main.kn
func drawMainOnMouseDownL(wnd: wnd@Draw, x: int, y: int)
    do @mouseDownL :: true {左ボタンが押された}
end func

引数は現段階で無視してください。私もよくわかりません。
最初に用意したグローバル変数 @mouseDownL に true を設定します。
この @mouseDownL を読むことで、プログラム実行中「マウスボタンが押されているか否か」を判定するという形です。サンプルプログラムとしてはこれ以上の内容は示されていません。
サンプルプログラムを実行すると「マウス左ボタンを押している間、色が変わる円が描画される」というものになります。
20171008-1.png
A)ボタンを押していない

20171008-2.png
B)ボタンを押している

##ボタンを押した瞬間だけ処理する
まずグローバル変数に「@mouseLLock」のようなロック用の変数を用意します。

main.kn
var mouseDownL: bool
var mouseLLock: bool {←追加分}

メイン関数の中に記述するイベント取得はそのまま利用できます。
同じ内容です。

main.kn
func main()
    ...
    do @drawmain.onMouseDownL :: @drawMainOnMouseDownL
    ...

次に「@drawMainOnMouseDownL」関数の内容をいじります。

main.kn
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 として実装されていたものを、以下のように変更します。

main.kn
func drawMainOnMouseUpL(wnd: wnd@Draw, x: int, y: int)
	do @mouseDownL :: false {左ボタン離された}
	do @mouseLLock :: false {←追加分。マウスロック解除}
end func

マウスが離された場合、ロック機構は不要なので無条件で @mouseLLock も false にします。
最後にプログラム中で「マウスを押したときに処理する部分」に、@mouseLLock を false とする処理を追加すれば「マウスを押している最初の瞬間だけ処理する」という形になり、押しっぱなし問題は解決します。
例)

main.kn
    {マウス判定ループ}
        if(@mouseDownL = true){マウス左が押されたなら}
            do @mouseDownL :: false
            ... {以下マウスを押された時の処理}

これは今回の修正で「マウスを離さない限り、マウスを押し続けていたとしても @mouseDownL が true にならない」という状況にした為です。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?