コメント

このコメントは、【トピック】マウス入力のスクリプトの質問へのコメントです。

コメントの内容

   mini ___(投稿日:2011/07/10 21:07/10/11)
既にご覧になってはいるでしょうが、あらためて記述。
Wikiに書いてあることが全てですけど、まあ私なりに解説ということで。
憶測強めだとは思うのですがご勘弁を。

startInput()
endInput()
この二つに囲まれている範囲でのみ、以下の関数を
使用することが出来ます。開始スクリプト先頭に
startの方だけ書いておけば確実かもしれませんけど、
ある理由でそういう使い方は出来ませんねぇ。後述します。

hasInput()
takeInput()
startInput()を起動すると、それ以降のキー・マウス入力が、
全てとある記憶領域に順番に記憶され、蓄積していきます。
  # endInput()で未使用分がリセットされるのかどうかは不明

startInput()後に入力があり、それがまだ溜まってい(未使用であ)る、
という条件を判断する関数がhasInput()、
記憶領域から入力を取り出す関数がtakeInput()になります。
入力が残っている間、それを取り出してループさせる、
という方法になりますので、(ここが伝わりにくいかも)
while (hasInput)
 takeInput()

 if(~)
 elsif(~)
 elsif(~)
 end
end
という感じで書きますね。
こうすると入力が無くなった時にループ抜けしてしまいますので、
flag = true
startInput()
while (flag)
 while (hasInput())
  # 省略
 end
end
endInput()
ってな具合で書くのが普通でしょうか。

ああ…書いてるうちにコイツをゲームにしてやりたくなってきた…。

takeInput()で取り出した入力が一体何なのかを判断するのが、
以下に並べる関数となります。
それぞれ取り出した入力に対応していたらtrueを返すため、
条件文にそのまま突っ込んで使えます。
isMouseMove()
isMouseDown() / isMouseUp()
isKeyDown("任意") / isKeyUp("任意")
上から順に「マウスが動いた」
「マウスの左ボタンが押された」「同じく離された」
「キーボードのとあるボタンが押された」「同じく離された」
となります。「今現在押されているか?」という判断は出来ません。

# 【例】
flag = true
startInput()
while (flag)
 while (hasInput())
  takeInput()

  if(isMouseMove())
   a = 1
  elsif(isKeyDown("UP"))
   flag = false
  end  # if終わり
 end  # hasループ終わり
end  # flagループ終わり
endInput()
例えば、マウスを少し動かしてキーボード↑↓を入力したとすると、
while (hasInput())は5回ループすることになります。

・一回目のループ。takeInput()でマウスが動いた入力を取り出します。
 isMouseMove()がtrueになりますので、aに1が代入されます。
・二回目のループ。takeInput()でキー↑が押された入力が取り出され、
 iskeyUP("UP")がtrueとなり、flagがfalseとなります。
・三回目のループ。take(ryでキー↑が離された入力が取り出されます。
 if分の羅列部分に当てはまる条件がないので、スルーされます。
・四回目。キー↓を押した入力が取り出されます。
・五回目。同 離した入力が取り出されます。
 キーが押されたら間違いなくこの入力もありますね。
全入力を取り出したので、hasInput()がfalseを返すようになり、
hasループが終了、flagがfalseなのでflagループも終了して、
入力取り出しが終了します。

入力取り出しを終了させるまで入力を保存し続けるので、
場合によっては誤作動しまくる可能性があります。よって、
start~endInput()を使う範囲をしっかりと見極める必要があります。



ってな具合で作っていくんですけど、如何でしょう。
上手く答えられたとは思えませんので、
分からなかったところはまたこのトピックにでも質問してください。
あるいは他ユーザー様の解説を待つとか。

長文乱文失礼しました。
  # 記憶を頼りに書いているので、関数名は要確認。

コメントの内容(一番最初の投稿)

   mini ___(投稿日:2011/07/10 21:07/10/11)
既にご覧になってはいるでしょうが、あらためて記述。
Wikiに書いてあることが全てですけど、まあ私なりに解説ということで。
憶測強めだとは思うのですがご勘弁を。

startInput()
endInput()
この二つに囲まれている範囲でのみ、以下の関数を
使用することが出来ます。開始スクリプト先頭に
startの方だけ書いておけば確実かもしれませんけど、
ある理由でそういう使い方は出来ませんねぇ。後述します。

hasInput()
takeInput()
startInput()を起動すると、それ以降のキー・マウス入力が、
全てとある記憶領域に順番に記憶され、蓄積していきます。
  # endInput()で未使用分がリセットされるのかどうかは不明

startInput()後に入力があり、それがまだ溜まってい(未使用であ)る、
という条件を判断する関数がhasInput()、
記憶領域から入力を取り出す関数がtakeInput()になります。
入力が残っている間、それを取り出してループさせる、
という方法になりますので、(ここが伝わりにくいかも)
while (hasInput)
 takeInput()

 if(~)
 elsif(~)
 elsif(~)
 end
end
という感じで書きますね。
こうすると入力が無くなった時にループ抜けしてしまいますので、
flag = true
startInput()
while (flag)
 while (hasInput())
  # 省略
 end
end
endInput()
ってな具合で書くのが普通でしょうか。

ああ…書いてるうちにコイツをゲームにしてやりたくなってきた…。

takeInput()で取り出した入力が一体何なのかを判断するのが、
以下に並べる関数となります。
それぞれ取り出した入力に対応していたらtrueを返すため、
条件文にそのまま突っ込んで使えます。
isMouseMove()
isMouseDown() / isMouseUp()
isKeyDown("任意") / isKeyUp("任意")
上から順に「マウスが動いた」
「マウスの左ボタンが押された」「同じく離された」
「キーボードのとあるボタンが押された」「同じく離された」
となります。「今現在押されているか?」という判断は出来ません。

# 【例】
flag = true
startInput()
while (flag)
 while (hasInput())
  takeInput()

  if(isMouseMove())
   a = 1
  elsif(isKeyDown("UP"))
   flag = false
  end  # if終わり
 end  # hasループ終わり
end  # flagループ終わり
endInput()
例えば、マウスを少し動かしてキーボード↑↓を入力したとすると、
while (hasInput())は5回ループすることになります。

・一回目のループ。takeInput()でマウスが動いた入力を取り出します。
 isMouseMove()がtrueになりますので、aに1が代入されます。
・二回目のループ。takeInput()でキー↑が押された入力が取り出され、
 iskeyUP("UP")がtrueとなり、flagがfalseとなります。
・三回目のループ。take(ryでキー↑が離された入力が取り出されます。
 if分の羅列部分に当てはまる条件がないので、スルーされます。
・四回目。キー↓を押した入力が取り出されます。
・五回目。同 離した入力が取り出されます。
 キーが押されたら間違いなくこの入力もありますね。
全入力を取り出したので、hasInput()がfalseを返すようになり、
hasループが終了、flagがfalseなのでflagループも終了して、
入力取り出しが終了します。

入力取り出しを終了させるまで入力を保存し続けるので、
場合によっては誤作動しまくる可能性があります。よって、
start~endInput()を使う範囲をしっかりと見極める必要があります。



ってな具合で作っていくんですけど、如何でしょう。
上手く答えられたとは思えませんので、
分からなかったところはまたこのトピックにでも質問してください。
あるいは他ユーザー様の解説を待つとか。

長文乱文失礼しました。
  # 記憶を頼りに書いているので、関数名は要確認。