トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

チュートリアル 8: より高度なタッチスクリーン入力

タッチスクリーンでメニューやボタンを使うゲームでは、普通ユーザーがタッチを離すまで動作をしてほしくありません。
これには2つあります。
ユーザーが間違った箇所をタッチしてしまっても、離す前に他の場所までドラッグしてから離せます。
また、ボタンをタッチしても、離す時に同じ位置をタッチしているとは限りません。

これがもしタッチした瞬間に動作をしてしまうなら、スタイラスを離した所のボタンではなく、
スタイラスを押した瞬間の所の動作をしてしまい、意図しない動作をする可能性があります。
この問題は私がはじめて作ったゲーム(Skydiver 1)で発生しました。

私はこれに「タッチしてスタート」ボタンを作りました。
でも、これを押すとゲームが始まってすぐにダイバーが落ちてしまいました。
「タッチしてスタート」を押した瞬間にゲームが始まり、まだ離さないうちにゲーム内でタッチをしたと認識されてしまったからです。
(このゲームは、画面をタッチしてダイバーを落とすゲームなのです)

これを回避する一つの方法として、forループを利用して100 000カウントくらいの空き時間を作ればよいです。
これでスタイラスを離すまでに少しの時間ができ、離さないうちに次のプログラムの動作が始まる事がなくなります。
しかし、ボタンやメニューによってはこの方法が不利になったり使えない場合があります。

だから、スタイラスが画面から離れた時を検出する必要があります。以下のようにします。:

 if Stylus.Down() then
           touchscreenpressed = true
           stylusx = Stylus.X()
           stylusy = Stylus.Y()
           styluslifted = false
 else
           if touchscreenpressed then
                     styluslifted = true
           end
           touchscreenpressed = false
 end
 
 if styluslifted then
           -- Put code here that will find out what stylusx and stylusy are and use them to find out what button the user pushed.
 end 

上のコードをループ内に挿入します。もうちょっと簡単にする方法があるのですが、
それだとスタイラスの検出中にスプライトなどの他の動作ができなくなってしまうので省きます。

さて、コードの説明に入ります。
ユーザーが画面をタッチした時、その場所のX,Y座標がstylusxstylusyに入ります。
(スタイラスを離した後では Stylus.X(),Stylus.Y()では取得できないので、こちらが使えます)

また、touchscreenpressedにtrue値を返します。タッチを離すまでこれは続きます。
スタイラスが画面を離れると、if文はelseの部分へと移ります。
このコードの塊はスタイラスが画面をタッチしていない時に動作します。
だから、ユーザーが画面をタッチしていたかどうかをチェックするためにのif文を追加しました。
こういう理由でtouchscreenpressedを作りました。

さて、もしStylus.Down()がfalseでtouchscreenpressedがtrueなら、ユーザーがスタイラスを離したということです。
そして次はstylusliftedがtrueになります。
stylusliftedがtrueになったら、プログラム例の最後のif文が実行されます。

この次にあなたの好きなコードを追加します。Stylus.X()Stylus.Y()はスタイラスが画面を離れてしっまているので使えません。
例の前の方でセットしたstylusxとstylusy'''を使うようにしてください。
これらを使うと、スタイラスが画面を離れてしまっていても、最後に押していた部分(座標)が分かります。
他の例が必要なら、このサイトのプロジェクトページにあるSkydiver 3.0を参考にしてください。