HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0205
デベロパマルチタッチでトリガータイプキーとして設定するには4解決


デベロパ

リンク

2016/2/5(Fri) 20:17:25|NO.74462

hsp3dishのマルチタッチの質問です。

マルチタッチの場合タッチした情報をタッチしている間ずっと取得していますが、これをstick命令のトリガータイプキーのように一度押したら押し続けても、最初に押した時の情報のみを取得したいです。
簡単に言えば、マルチタッチでボタンのようなものを作りたいです。

なにかアドバイスをいただけませんでしょうか?



この記事に返信する


しまくろねこ

リンク

2016/2/6(Sat) 02:29:28|NO.74468

こんにちは。

例えばキーボードやマウスのボタンをgetkey命令で押されたことを取得しフラグを立て、次のgetkey命令時にフラグからキーを取得するか判別する方法があるように、タッチパネルでマルチタッチを行った際のトリガータイプのような最初のタッチのみを取得する方法も大体ではありますが同様だと思います。

方法としては以下が考えられます。

(A).タッチ情報取得命令の「mtinfo」でマルチタッチされているXY座標が取得できるので、ボタンとして決められた座標範囲でタッチされている場合フラグを立て、フラグが立った状態でボタンの座標範囲内をマルチタッチされているXY座標があり続けている場合は処理を抜けるようにします。
(B).タッチ情報取得命令の「mtinfo」で取得できる要素値[3:タッチ識別用ID]を利用して、現在タッチされている指が何本目かを調べてフラグを立てて行う方法。


これを見ると(A).のXY座標と(B).の[タッチ識別用ID]を両方利用するのがいいのかな?と思いますが、(A).のXY座標を利用する方法だけで大丈夫だと思います。(作るものにもよるかと思いますが)

また、[タッチ識別用ID]はWindowsやAndroidで帰ってくる情報が異なりますので注意が必要です。
どっちがどっちだったかすっかり忘れてしまいましたが、片方は「アプリを起動してからタッチされた回数」が識別用IDとなり、もう片方は「現在タッチされている指の数(値は常に[0]から始まり、離された指の識別IDは他のタッチされている識別IDとして再利用される)」となります。
これだけだとなんだか意味が良く伝わらないかと思いますが、とりあえずXY座標を利用する方法で問題ないと思います。


参考URL
・窓月らら(MiECATSOFT)さん「バーチャル コントローラ VPAD」
http://dev.onionsoft.net/seed/info.ax?id=1110
・しまくろねこ「mod_smart.as」
http://dev.onionsoft.net/seed/info.ax?id=412



デベロパ

リンク

2016/2/6(Sat) 06:03:31|NO.74471

返信ありがとうございます。
例えばシューティングゲームを作るとして、画面内に十字キーのコントローラーと弾を発射するボタン(button命令ではなく座標範囲を指定)を作るとします。
十字キーは非トリガータイプキー、弾はトリガータイプキーとして設定したい場合、どうしたらいいでしょうか?
hspのマルチタッチ命令も正直あまり使いこなせておらずとりあえず適当にコード書いてみたのですが、


#include "hsp3dish.as"

wx = ginfo_sx
wy = ginfo_sy

tama_flg = 0

px = wx/4 : py = wy/2

r = 0 : b = 255

*main
redraw 0

mtinfo key,0
x = key(1)
y = key(2)

if key(0) = 0 : tama_flg = 0 : time = 0 : r = 0 : b = 255

;上下に進むコントローラー
if key(0) = 1 & 0 < x & wx/3 > x & 0 < y & (wy/3)/2 > y : py--
if key(0) = 1 & 0 < x & wx/3 > x & (wy/3)/2 < y & wy/3 > y : py++


;弾が一瞬青から赤に変わるボタン(トリガー)
if tama_flg = 0 & key(0) = 1 & wx-wx/3 < x & wx > x & 0 < y & wy/3 > y : tama_flg = 1
if tama_flg = 1 : r = 255 : b = 0 : tama_flg = 2 : else : r = 0 : b = 255


;ボタンと弾の描画
color 255,255,0: boxf 0,0,wx/3,wy/3
color 0,0,255: boxf wx-wx/3,0,wx,wy/3
pos wx/18,0:color 0,0,0:font"",wy/7:mes "↑"
pos wx/18,wy/5:color 0,0,0:font"",wy/7:mes "↓"
pos wx-wx/3,0:color 255,255,255:font"",wy/20:mes "ボタン"
pos px,py:color r,0,b:font"",wy/3:mes "●"

redraw 1
await 1000/60
goto *main


よくわかんなくなってしまいました。
ボタンが二つ同時に押されている事も想定しなくちゃいけないとなると頭がこんがらがってきますね。



しまくろねこ

リンク

2016/2/6(Sat) 11:24:31|NO.74474

こんにちは。

>ボタンが二つ同時に押されている事も想定しなくちゃいけないとなると頭がこんがらがってきますね。
そうなんです。キーボードやマウスと違って複数の指を同時にタッチされていることを想定して作らないといけないので慣れるまでは頭がこんがらがってきます。


mtinfo命令を使う場合は、セットでmtlist命令を使います。
mtlist命令でタッチされているポイントIDリストを取得し、次にポイントIDリストの数だけmtinfo命令で座標等を取得します。


#include "hsp3dish.as" dim point_id, 1 wx = ginfo_sx wy = ginfo_sy px = wx / 4 py = wy / 2 tama_cnt = 0 *main redraw 0 title "弾ボタンを押した回数:" + tama_cnt x = 0 y = 0 up_key = 0 down_key = 0 tama_flg = 0 r = 0 b = 255 mtlist point_id repeat stat mtinfo key, point_id(cnt) x = key(1) y = key(2) if 0 < x && wx / 3 > x && 0 < y && (wy / 3) / 2 > y : up_key = 1 : continue if 0 < x && wx / 3 > x && (wy / 3) / 2 < y && wy / 3 > y : down_key = 1 : continue if wx - wx / 3 < x && wx > x && 0 < y && wy / 3 > y : tama_flg = 1 : continue loop ;上下に進むコントローラー if up_key == 1 : py-- if down_key == 1 : py++ ;弾が一瞬青から赤に変わるボタン(トリガー) if tama_flg == 0 : tama_trigger_flg = 0 if tama_flg == 1 && tama_trigger_flg == 0 { r = 255 b = 0 tama_trigger_flg = 1 tama_cnt++ } ;ボタンと弾の描画 color 255, 255, 0 : boxf 0, 0, wx / 3, wy / 3 color 0, 0, 255 : boxf wx - wx / 3, 0, wx, wy / 3 pos wx / 18, 0 : color 0, 0, 0 : font"", wy / 7 : mes "↑" pos wx / 18, wy / 5 : color 0, 0, 0 : font"", wy / 7 : mes "↓" pos wx - wx / 3, 0 : color 255, 255, 255 : font"", wy / 20 : mes "ボタン" pos px, py : color r, 0, b : font"", wy / 3 : mes "●" redraw 1 await 1000 / 60 goto *main



デベロパ

リンク

2016/2/6(Sat) 12:33:40|NO.74476

コードを順を追って見てなんとなくですが理解できました。でもやはりかなり難しいですね。
書いていたコード利用させていただきます。ありがとうございました!!



ONION software Copyright 1997-2021(c) All rights reserved.