HSP3Dishでゲームを作成中なのですが、今現在モジュール開発をメインとしております。
作っているモジュールの内容ですが、「タッチ(長押し)」の実装です。
一応実装はできたのですが、作ったモジュールをWindows上で試した上で、ビルドしてAndroidで動かしてみたところ、不思議な現象が起きて困っています。
テスト用ソースは[touch_test.hsp]、モジュールソースは[mod_smart.as]としています。
下記の[touch_test.hsp]をAndroidで動かすと、[mod_smart.as]の★★★の行でスマートフォンのメニューに強制的に戻ってしまいます。
ちなみにWindows上では正常に動いています。
色々試してみたところ、途中のパラメーターを省略するとダメなようです。
× i = smart_touch(0, , 700)
○ i = smart_touch(0, 0, 700)
○ i = smart_touch(0)
途中のパラメーターを省略さえしなければ良いだけなのでしょうが、何故なのでしょうか?
(※smart_touch内で日付をまたいだことを考慮してないことは突っ込まないでください(笑))
〜[touch_test.hsp]の中身〜
#cmpopt varinit 1 ;未初期化変数のチェック #include "hsp3dish.as" #include "mod_smart.as" ;スマートフォン用(のつもり)モジュール smart_init ;[mod_smart.as]モジュールの初期処理 repeat redraw 0 color 0, 0, 0 : boxf 0, 0, 320, 480 ;0.7秒間タップされていればタッチ(長押し)されたとする i = smart_touch(0, , 700) ;※[mod_smart.as]の★★★の行でスマートフォンのメニューに強制的に戻ってしまう。Windows上では正常に動く。 ; i = smart_touch(0, 0, 700) ;※スマートフォン上でも★★★の行を正常に処理する。 ; i = smart_touch(0) ;※スマートフォン上でも★★★の行を正常に処理する。 if i = 1 { color 255, 255, 255 : pos 0, 0 : mes "TOUCH TEST OK" redraw 1 wait 1000 } redraw 1 wait 1 loop
〜[mod_smart.as]の中身(一部抜粋)〜
#module mod_smart #const SARCH_TIME_MAX 235959999 #const KEY_MOUSE_LEFT 256 #const KEY_MOUSE_RIGHT 512 ;----------------------------------------------------- ; モジュールの初期処理 ;----------------------------------------------------- #deffunc smart_init dim tv, 2, 2 dim cp, 2 dim moux, 2 dim mouy, 2 return ;----------------------------------------------------- ; タッチ(長押し)を取得 ; ; p1 : タッチ(長押し)を調べるマウスボタン(0 = 左, 1 = 右) ; plusminus_dot : タッチ(長押し)を有効にする+−誤差マウス座標(単位:ドット) 。 ; 省略時はタッチ(長押し)時にマウスカーソルがどこにあってもタッチ(長押し)と認識する。 ; touch_interval : タッチ(長押し)と認識する時間(単位:ミリ秒) ; 省略時は、700ミリ秒とする。 ; ; 戻り値(0 = タッチ(長押し)されていない) ; (1 = タッチ(長押し)されている) ; ;===================================================== ; SAMPLE ; if smart_touch(0, 0, 700) = 1 : dialog "OK" ;----------------------------------------------------- #defcfunc smart_touch int p1, int plusminus_dot, int touch_interval if p1 > 1 : return 0 t_interval = touch_interval if t_interval = 0 : t_interval = 700 key = 0 stick key, KEY_MOUSE_LEFT + KEY_MOUSE_RIGHT if (key & KEY_MOUSE_LEFT) | (key & KEY_MOUSE_RIGHT) { if p1 ! (key / 256 - 1) : return 0 i = cp(p1) hour = gettime(4) * 10000000 minute = gettime(5) * 100000 second = gettime(6) * 1000 tv(p1, i) = hour + minute + second + gettime(7) moux(i) = mousex mouy(i) = mousey if i = 1 { if tv(p1, 0) > tv(p1, 1) : tv(p1, 0) = SARCH_TIME_MAX - tv(p1, 0) + tv(p1, 1) t = tv(p1, 1) - tv(p1, 0) if t <= t_interval : return 0 if plusminus_dot = 0 : return 1 ;★★★ if plusminus_dot > 0 { if moux(0) >= (moux(1) - plusminus_dot) { if moux(0) <= (moux(1) + plusminus_dot) { if mouy(0) >= (mouy(1) - plusminus_dot) { if mouy(0) <= (mouy(1) + plusminus_dot) { return 1 } } } } } } cp(p1) = 1 return 0 } cp(p1) = 0 return 0 #global