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


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0522
ABATBelieverHSPDishにおけるマルチタッチの解析10未解決


ABATBeliever

リンク

2024/5/22(Wed) 23:51:26|NO.101736

mtlist命令とmtinfo命令で複数のタッチ座標を取得できることはわかっているのですが、
そのタッチ座標がどこなのかを取得できなくて困っています

具体的には、以下の分岐コードをHSPDishで実行していて、IsPress4と5は左右移動、IsPress6はジャンプのフラグになっています。
どうやらこの分岐では、二番目以降に行われたタッチを取得できないようで困っています。


IsPress4="F":IsPress5="F":IsPress6="F" mtlist var repeat length(var) mtinfo tmp,cnt) if 460<tmp(1) and tmp(1)<560 and 320<tmp(2) and tmp(2)<420{IsPress6="T"} if 40<tmp(1) and tmp(1)<140 and 320<tmp(2) and tmp(2)<420{IsPress5="T"} if 160<tmp(1) and tmp(1)<260 and 320<tmp(2) and tmp(2)<420{IsPress4="T"}

そのせい(?)で、
https://atenet.cloudfree.jp/TestPB/
にあるやつで、左右に移動しながらジャンプができないという問題があります。

このコードの何に欠陥があるのでしょうか...?
あるいは、タッチ箇所を比較するよりもいいボタンはありますか?
(button命令のやつは押しっぱなし判定ができないので無理です)

※サンプルにある珠音ジャンプの改造品で、いろいろUIが劣化してますがそこは無視してください
※PCならキーボードで何の問題もなく動きますが、スマホ環境のユーザのためにスマホ操作を実装したい



この記事に返信する


ABATBeliever

リンク

2024/5/22(Wed) 23:53:31|NO.101737

preがいろいろ消し飛んでるので↓

repeat redraw 0 IsPress4="F":IsPress5="F":IsPress6="F" mtlist var repeat length(var) mtinfo tmp,var(cnt) if 460<tmp(1) and tmp(1)<560 and 320<tmp(2) and tmp(2)<420{IsPress6="T"} if 40<tmp(1) and tmp(1)<140 and 320<tmp(2) and tmp(2)<420{IsPress5="T"} if 160<tmp(1) and tmp(1)<260 and 320<tmp(2) and tmp(2)<420{IsPress4="T"} loop mes ""+IsPress4+IsPress5+IsPress6 redraw 1 await 100 loop



ABATBeliever

リンク

2024/5/23(Thu) 00:00:50|NO.101738

要約すると

・HSPDish上でスマホのマルチタッチの座標を取得したい
・1箇所で画面を押されたまま2箇所目が押された場合、2箇所目以降の座標も取得したい

です。

mes命令すると座標は数値としてでているのに、if分岐では反応がないんですよね、、、
多分どこかがおかしいのか



窓月らら

リンク

2024/5/23(Thu) 01:01:42|NO.101739

参考になるかわかりませんが、うちが過去に作った VPAD のソースでも見てください。
マルチタッチに対応しています。
これはバーチャルコントローラですが、考え方は同じです。
https://www.vector.co.jp/soft/winnt/prog/se511595.html

それとフラグは文字列型である必要はないと思います。intでいいのでは・・
テストのためならいいと思いますが。



buhio

リンク

2024/5/23(Thu) 10:01:58|NO.101740

ここは関係ないかな?
違ったらごめんなさい

repeat length(var) ↓ repeat stat //ヘルプより、statにマルチタッチ数が返ります。lengthは押してなくても1になってる?



zrs90(5さい)

リンク

2024/5/23(Thu) 10:41:55|NO.101741

しまくろねこさんの解説とモジュールが
参考にならないでしょうか?

スマホで検索しただけなので
・1箇所で画面を押されたまま2箇所目が押された場合
2箇所目以降の座標も取得したい...と言う内容に
沿っているかは分かりませんが...

後はHSP3同梱のHSP3dishプログラミングマニュアル
13.マルチタッチ情報の取得について
ですかねぇ...

http://hsp.tv/play/pforum.php?mode=pastwch&num=74462



窓月らら

リンク

2024/5/23(Thu) 11:20:12|NO.101742

たまーにですが・・・端末によって挙動が違うことがあるので
可能であれば複数の端末でテストすることをおすすめします。
2点目をタッチすると一旦放した挙動になる端末もあります。

それと、テストする場合はとりあえず文字だけでやることをおすすめします。
変数の中身を表示して確認するのです。



しまくろねこ(本物)

リンク

2024/5/23(Thu) 18:07:19|NO.101743

こんにちは。

汚いソースで申し訳ないです。
もっとソースを短く出来ると思いますが、とりあえず動く形にしました。
上から





の帯をタッチすると"OK"がそれぞれ表示されます。
マルチタッチにしてありますので、赤緑青を同時にタッチすると同時に"OK"が表示されます。

それと、窓月ららさんの「VPAD」、もしくは私の「mod_smart.as」を利用すると簡単にマルチタッチ処理をできると思います。

#include "hsp3dish.as" #const FALSE 0 #const TRUE 1 screen 0, 480, 300 font "", 48 setcls CLSMODE_SOLID, $000000 dim area_a, 4 dim area_b, 4 dim area_c, 4 area_a = 0, 0, 479, 99 //x1, y1, x2, y2の順 area_b = 0, 100, 479, 199 area_c = 0, 200, 479, 299 repeat redraw 0 mtlist touch_id touch_cnt = stat color 255, 0, 0 : boxf area_a(0), area_a(1), area_a(2), area_a(3) color 0, 255, 0 : boxf area_b(0), area_b(1), area_b(2), area_b(3) color 0, 0, 255 : boxf area_c(0), area_c(1), area_c(2), area_c(3) repeat touch_cnt dim t_info, 4 mtinfo t_info, touch_id(cnt) if t_info(0) == TRUE { if (t_info(1) >= area_a(0)) && (t_info(1) <= area_a(2)) && (t_info(2) >= area_a(1)) && (t_info(2) <= area_a(3)) { mes_area_a = "OK" } else { mes_area_a = "" } if (t_info(1) >= area_b(0)) && (t_info(1) <= area_b(2)) && (t_info(2) >= area_b(1)) && (t_info(2) <= area_b(3)) { mes_area_b = "OK" } else { mes_area_b = "" } if (t_info(1) >= area_c(0)) && (t_info(1) <= area_c(2)) && (t_info(2) >= area_c(1)) && (t_info(2) <= area_c(3)) { mes_area_c = "OK" } else { mes_area_c = "" } } color 255, 255, 255 pos area_a(0), area_a(1) : mes mes_area_a pos area_b(0), area_b(1) : mes mes_area_b pos area_c(0), area_c(1) : mes mes_area_c loop redraw 1 await 16 loop
余談ですが、個人的なことで申し訳ないです。
一戸建てを買いました。
快適に暮らしております。



ABATBeliever

リンク

2024/5/23(Thu) 18:25:57|NO.101745

皆様意見ありがとうございます
いろいろ試してみようと思います
ちなみにフラグが文字型なのは、タッチごとにフラグの判定を見たいので画面に描画してるためです



しまくろねこ(本物)

リンク

2024/5/23(Thu) 20:04:52|NO.101746

元のソースがどのような形になるのか不明ですが、動くように修正してみました。

#include "hsp3dish.as" font "", 48 setcls CLSMODE_SOLID, $000000 repeat redraw 0 IsPress4 = "F" : IsPress5 = "F" : IsPress6 = "F" var = 0 mtlist var repeat stat dim tmp, stat mtinfo tmp, var(cnt) if 460 >= tmp(1) and tmp(1) <= 560 and 320 >= tmp(2) and tmp(2) <= 420 { IsPress6 = "T" } if 40 >= tmp(1) and tmp(1) <= 140 and 320 >= tmp(2) and tmp(2) <= 420 { IsPress5 = "T" } if 160 >= tmp(1) and tmp(1) <= 260 and 320 >= tmp(2) and tmp(2) <= 420 { IsPress4 = "T" } loop pos 0, 0 color 255, 255, 255 mes IsPress4 + IsPress5 + IsPress6 redraw 1 await 100 loop



ABATBeliever

リンク

2024/5/24(Fri) 00:22:27|NO.101752

しまくろねこ(本物)さんの101743号を参考にしたところ、マルチタッチは実装出来ました
https://atenet.cloudfree.jp/TESTPB2/

が、どうやら少なくともAndroid13のXperiaとWindows11では同じ点をタッチしても座標の数値が異なるようです。
このせいで、ボタンの判定位置がかなりばらついてしまい、理論上違う構成の環境だと座標はまたずれると予想できます。

環境ごとの座標の誤差を近似する方法や他の判定エリア取得方法など、何か工夫があれば教えてください。

あるいは、Javascriptで仮想キーボードを建ててhtmlに組み込むとか?

(Button命令は使えません。あれは手を離した時しか判定がないためです。)



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101736への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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