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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0128
しまくろねこHSP3Dishでのモジュール(#defcfunc)について5解決


しまくろねこ

リンク

2013/1/28(Mon) 23:34:16|NO.52086

どうもお世話になります。
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



この記事に返信する


OK

リンク

2013/1/29(Tue) 00:44:48|NO.52088

考えは重複するかと思われますが。
致命的なエラー、特殊な命令の使い方、
メモリの大量消費によるシステム保護。が考えられます。
しかしエラー箇所が特定されてますので一度外す。
どうしても実装するなら
>途中のパラメーターを省略さえしなければ良いだ けなのでしょうが
の通りだと思います。
あとはLgcatの確認ですね。それと700ミリ以上でも耐久できるのかなー
ちなみにこの間gzoomでwindowsで良くて実機で同じ様に落ちました。
その後工夫次第で良くなりましたが、winと実機では差異があるとの
実感と認識です。



しまくろねこ

リンク

2013/1/29(Tue) 07:54:00|NO.52094

OKさん
>あとはLgcatの確認ですね。それと700ミリ以上でも耐久できるのかなー

ありがとうございます。
後でlgcat確認してみます。どこまで耐久するか試していませんが、倍の1400ミリで実機で動いてます。

落ちる原因としては、省略されたパラメーターの変数(ここではplusminus_dot)を参照しようとすると落ちると判明しました。



しまくろねこ

リンク

2013/1/29(Tue) 18:51:01|NO.52099

残念ながらLogcat使用不可でした



おにたま(管理人)

リンク

2013/1/29(Tue) 21:13:55|NO.52101

ご報告ありがとうございます。
おそらくは、cppへのコンバーターかHSPランタイムの不具合かと思われます。
不自由をおかけしますが、今後修正していきたいと思いますので、
当面はパラメーターの省略を行なわずに使用して頂ければと思います。



しまくろねこ

リンク

2013/1/29(Tue) 22:01:28|NO.52102

お忙しいところありがとうございます。
了解致しました。



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