マウス入力のスクリプトの質問(質問掲示板

投稿: 000 1  mini naoki 投稿:2011/07/10 14:49:10(最新:2011/07/14 22:23:14)
「一目並べ」などでマウスを一定の所でクリックすると、イベントが起こるという
ノベルゲームを作ろうと思うのですが、方法が分かりません。
wikiの「キーマウス入力」について書かれたものでも、理解できませんでした。
誰か、マウス入力のスクリプトを教えてください!
よろしくお願いします!

コメントする

コメントするには、ログインする必要があります。

コメント一覧

Logo mini hightoller(投稿日:2011/07/14 22:23, 履歴)
何が解らないのか解らない質問に
迅速に細かく回答しても、結果「自己解決」とか。
労いも感謝も無く、「回答は生かしてもらえないんだな、
じゃぁ次回から自分で頑張れ」と、思ってしまったのは
灰虎の心が狭いからですね、きっと。
000 1  mini naoki(投稿日:2011/07/13 16:28, 履歴)
すみません・・・。
自己解決しました。
   mini ___(投稿日:2011/07/10 21:33, 履歴)
既にご覧になってはいるでしょうが、あらためて記述。
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()を使う範囲をしっかりと見極める必要があります。



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

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