トップページ > 記事閲覧
離す処理の検出
名前:task 日時: 2020/10/06 18:19

こんにちは。お忙しい中失礼します。 例えば、左手の親指で画面をタップ(ID0)している状態で、 その指を離します、と同時に右手の親指で画面をタップします。 すると、右手の親指のタップのIDが1にならず、0になります。 それも、左手の親指のタップをそのまま、右手の親指のタップに引き継いだような挙動をします。 (例えば、タップした位置から左右に動かした分だけ移動するキャラクターなら、 キャラクターが左手の親指の位置から右手の親指の位置の距離分を瞬間移動する。) 当然、同時で無ければ、左手の親指を離し、その後に右手の親指をタップすれば、IDは0になりますが、 キャラクターは瞬間移動することはありません。 本当は、左手の親指を離し、同時であっても右手の親指をタップした時、 キャラクターが移動せずにいてほしいのですが・・・ 離す、と、タップ、を同時に行った場合は、 「瞬間的にタップした位置まで指を動かした」 という判定になっているのでしょうか? もし、そうであれば、どのようにしたら回避出来るのでしょうか? わかりにくい文章で本当に申し訳有りません。 どうか、よろしくお願いいたします。
メンテ

Page: 1 |

Re: 一方を離す、と、もう一方をタップ、を同時に行った場合 ( No.1 )
名前:管理人 日時:2020/09/30 22:51

そのような場合は非公開関数の GetTouchInputLogNum と GetTouchInputLogOne を使用して、 タッチが一瞬でも離されたかを検出するという方法があります // ストックされているタッチ情報の数を取得する int GetTouchInputLogNum( void ) ; // ストックされているタッチ情報をクリアする int ClearTouchInputLog( void ) ; // ストックされているタッチ情報から一番古い情報をひとつ取得する // PeekFlag : 取得した情報をストックから削除しないかどうか( TRUE : 削除しない  FALSE : 削除する( デフォルト ) ) TOUCHINPUTDATA GetTouchInputLogOne( int PeekFlag = FALSE ) ; DXライブラリは内部で、タッチした場合、タッチ位置が移動した場合、タッチが離された場合の情報を ストックしているのですが、この関数はそのストックされている情報を取得する為のものです GetTouchInputLogOne で戻り値として返ってくる TOUCHINPUTDATA 構造体は以下のようになっています // タッチパネルのタッチの情報 struct TOUCHINPUTDATA { // 情報の時間 LONGLONG Time ; // 有効なタッチ情報の数 int PointNum ; // タッチ情報 TOUCHINPUTPOINT Point[ TOUCHINPUTPOINT_MAX ] ; } ; Time は構造体の情報が記録された時間です、PointNum はタッチされている数で、こちらが 0 の場合は 画面はタッチされていない、ということを意味しています 因みに Point はタッチ情報の配列で、構造体 TOUCHINPUTPOINT は以下のようになっていて、 こちらは GetTouchInput で取得できる情報そのままです // タッチパネルの1箇所分のタッチの情報 struct TOUCHINPUTPOINT { // タッチされたデバイス DWORD Device ; // タッチを判別するためのID DWORD ID ; // タッチされた座標X int PositionX ; // タッチされた座標Y int PositionY ; } ; これらの関数を使用して毎フレーム GetTouchInputLogNum の戻り値の分だけ GetTouchInputLogOne を実行して、戻り値の TOUCHINPUTDATA 構造体のメンバー変数 PointNum が 0 の場合があれば、仮に現状では 時間 ↓ ↓ 画面をタッチ ↓ ↓ プログラムが GetTouchInput で ID 0 のタッチを検出 ↓ ↓ 画面からタッチを離す ↓ ↓ 直ぐに再度タッチ ↓ ↓ プログラムが GetTouchInput で ID 0 のタッチを検出( タッチが離されたことが検出できない ) ↓ このような↑状況でも、GetTouchInputLogNum、GetTouchInputLogOne を使ったタッチ離し検出処理を加えれば 時間 ↓ ↓ 画面をタッチ ↓ ↓ プログラムが GetTouchInput で ID 0 のタッチを検出 ↓ ↓ 画面からタッチを離す ↓ ↓ 直ぐに再度タッチ ↓ ↓ GetTouchInputLogNum + GetTouchInputLogOne でタッチが一度離されたことを検出 ↓ ↓ プログラムが GetTouchInput で ID 0 のタッチを検出( 前回検出した ID 0 のタッチとは別と判別可能 ) ↓ と、ID は 0 のままですが、一度タッチが離されたことを判断できるようになります よろしければお試しください m(_ _)m
メンテ
Re: 一方を離す、と、もう一方をタップ、を同時に行った場合 ( No.2 )
名前:task(解決) 日時:2020/10/04 21:37

返信が遅れ、大変申し訳有りません。 非公開関数にあったのですね、なるほどです。 試してみます、有難うございました!
メンテ
Re: 一方を離す、と、もう一方をタップ、を同時に行った場合 ( No.3 )
名前:task 日時:2020/10/05 00:51

ごめんなさい、解決としたのですが、上手く行かなかったのでここで再度質問させてください… タッチ離し検出処理を加え、実行してみたのですが、どうも上手く行っていないらしく、 どのような値が入っているのかをまず確かめようと考え、 GetTouchInputLogNumをprintfDxで試しに表示してみた所、68427075という値が現れ、(まだ何もタップ入力していない状態で) おかしいと思い、ClearTouchInputLog()でクリアしてから表示しようとしたところ、68424077という値が現れ、(こちらもタップ入力していない状態で) 更に、強制終了してしまいました。 何度繰り返してもこのような結果となり、どうしてよいものか・・・ ご教授お願いできませんでしょうか?
メンテ
Re: 一方を離す、と、もう一方をタップ、を同時に行った場合 ( No.4 )
名前:管理人 日時:2020/10/05 22:54

うーん、おかしいですね… すみません、taskさんの環境は何でしょうか?( Windows, Android, iOS など )
メンテ
Re: 一方を離す、と、もう一方をタップ、を同時に行った場合 ( No.5 )
名前:task 日時:2020/10/05 23:24

Windowsです。
メンテ
Re: 一方を離す、と、もう一方をタップ、を同時に行った場合 ( No.6 )
名前:task 日時:2020/10/05 23:38

すみません、GetTouchInputLogNumの()を抜かして記述していたようです… GetTouchInputLogNum()としたところ、正常に表示されました。 もう一度検出処理を見直してみます。。
メンテ
Re: 一方を離す、と、もう一方をタップ、を同時に行った場合 ( No.7 )
名前:task(解決) 日時:2020/10/06 18:22

上手く動作させることに成功しました! 本当に有難うございます! (この度は私の単純な見落としにより、管理人様に無駄にお手数をお掛けしてしまい、大変申し訳有りませんでした。。orz)
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存