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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0309
やまねこ3dish、android上での不具合29未解決


やまねこ

リンク

2015/3/9(Mon) 22:30:50|NO.67779

現在win7PCでandroidアプリを製作しております。

win7上では以下のコードは正常に動きますが、
android上で実行すると”分のボタンに画像が表示されず、空白になってしまいます。


cls
celload "A.png",1
celload "B.png",2
objimage 2,0,0,0,101,0,0
pos 160,1105
objsize 400,100
button " ",*YL
objimage 2,0,0,0,101,0,0
pos 0,0
objsize 400,100
button " ",*YL……

色々と試してみたのですが、原因が分からず困っております。
どなたかご教授お願いいたします。

android:nexus7



この記事に返信する


窓月らら

リンク

2015/3/10(Tue) 23:40:52|NO.67791

うちの環境でも同じ不具合確認しました。Dishはまだ不安定ですね・・。
2枚目以降が描画されないというのは、他の命令でも環境によってはあります。
うまく読み込めてないのかな。
色々不具合が多いので、うちは独自にボタンを作って対処してます。
以下で試しましたが、同じように2個目の画像が反映されませんね。


#include "hsp3dish.as" celload "test1.png",1 celload "test2.png",2 objsize 64,64 objimage 1,0,0,0,32,0,0 pos 32,32 button gosub "TEST1",*btn1 objimage 2,0,0,0,32,0,0 pos 128,32 button gosub "TEST2",*btn2 *main redraw 0 redraw 1 await 1000/60 goto *main *btn1 dialog "BUTTON1" return *btn2 dialog "BUTTON2" return



やまねこ

リンク

2015/3/11(Wed) 00:59:09|NO.67795

お返事ありがとうございます

どうも画像を表示する際に他にも不具合があるみたいです…

実機で動作させる場合は色々と不具合があるのでしょうか



おにたま(管理人)

リンク

2015/3/13(Fri) 21:37:17|NO.67840

不具合のご報告ありがとうございます。
次のβバージョンで修正される予定です。
以下のURLからアーカイブ(Zip書庫のリンク)をダウンロードして、修正を確認することも可能です。
http://dev.onionsoft.net/trac/openhsp/browser/trunk/package/win32/android

アーカイブ内の/trunk/package/win32/androidフォルダを、
HSP3.5β版がインストールされているフォルダ内のandroidに上書きコピーしてください。
以降は、プロジェクトを新規に作成したものから変更が適用されます。(過去に作成されたプロジェクトは更新されません)



窓月らら

リンク

2015/3/15(Sun) 10:24:06|NO.67873

修正ありがとうございます。
以下2点について改善を確認しました。

・mesの後にgcopyなどで描画すると白く塗りつぶされてしまう
・2個目以降のボタンの画像が反映されない(白く塗り潰される)

ただ、特定の環境(当方の手持ちでは TM75A Android 4.0.4 及び Kindle FireHD)で
ボタン2個目のテキストが黒く塗り潰されてしまう不具合がありました。
Nexus7(2012) Android 5.0.2 では正常に表示されています。

以下のコードでテストしました。


#include "hsp3dish.as" celload "test1.png",1 celload "test2.png",2 objsize 64,64 objimage 1,0,0,0,32,0,0 pos 32,32: button gosub "TEST1",*btn1 objimage 2,0,0,0,32,0,0 pos 128,32: button gosub "TEST2",*btn2 *main redraw 0 pos 0,128: gcopy 2,0,0,64,64 pos 0,192+rnd(16): color 255,0,255: mes "テストメッセージだよ!" pos 0,224: gcopy 1,0,0,64,64 redraw 1 await 1000/60 goto *main *btn1 dialog "BUTTON1" return *btn2 dialog "BUTTON2" return



窓月らら

リンク

2015/3/15(Sun) 11:40:01|NO.67879

関連なので、こちらで報告させて頂きますが、
特定の環境(上記不具合2機種)で、mesのテキストが塗り潰されてしまう不具合が出ています。
フレーム毎にテキストの内容を変更すると発現することが多いので
キャッシュの問題ではないかと思っています。

以下のコードでテストしました。


#include "hsp3dish.as" setreq SYSREQ_MESCACHE_MAX, 0 // テストのためキャッシュを無効 font "",32 *main redraw 0 gmode 2: color 0, 0, 64 : boxf color 255,255,255: pos x,240: mes "TEST" x++: if x>360 { x=-90 } redraw 1 await 1000/60 goto *main

白く塗り潰されたり、正常だったりを繰り返します。



窓月らら

リンク

2015/3/15(Sun) 11:46:30|NO.67880

キャッシュの問題と言いますか、描画に失敗したものをキャッシュすると
ずっと塗り潰されたまま表示される、そんな感じです。



なめろう

リンク

2015/4/22(Wed) 21:42:18|NO.68705

同じ症状が出ていて解決法を探してここにたどり着きました。
既に解決されている方もいるようで申し訳ないのですが、ご教授くださいませ。

>不具合のご報告ありがとうございます。
>次のβバージョンで修正される予定です。
>以下のURLからアーカイブ(Zip書庫のリンク)をダウンロードして、修正を確認することも可能です。
>http://dev.onionsoft.net/trac/openhsp/browser/trunk/package/win32/android

とあったので、3.5βのフォルダ内の同名フォルダ内に解凍したファイルを全て上書きしました。
新たなプロジェクトでビルドしなおして、Android上でアプリを起動してもすぐに強制終了されるようになりました。
androidフォルダを丸ごとバックアップしてあったので、そちらに戻して同様の設定でビルドすると問題なく起動します。

修正データの使い方を間違っているのでしょうか?

よろしくお願いいたします。



窓月らら

リンク

2015/4/23(Thu) 09:15:01|NO.68712

なめろうさん>

ビルドは普通に通ってコードも変えてないのに、何かの拍子に起動しなくなる。
こういうケース確かにありますね。

一度、簡単なコードでビルドして実行できるかを試してみてください。
ビルドは通るが、どこかのコードが引っかかってるのだと思いますので
切り分けが必要だと思われます。

ボタンやmesの件は確かに以前よりは改善されたのですが、
特定環境ではまだ別の不具合がでますので、そういう環境があるという事を
認識の上での使用をおすすめします。早く改善されないかなー。



なめろう

リンク

2015/4/23(Thu) 20:02:51|NO.68716

窓月らら さん

ありがとうございます。
文字を表示させるだけのプログラムを走らせて見ました。
結果は上記修正ファイルを上書きしたものでも、上書きする前のものでも両方ちゃんと動きました。

修正ファイルを入れたことで、他の何かしらのコードでエラーが出てしまったということでしょうか・・・
PCだと普通に動作するので、何処でエラーが出て強制終了したのかわかりませんが、正式な次期バージョンが待ち遠しいです。



なめろう

リンク

2015/4/29(Wed) 10:12:35|NO.68874

少しだけ進展しました。
HSP3dish helperのLogcatを使えば何処でエラーが出て強制修了されてるのかわかるのですね。
エラー13となっていて原因は画像ファイルが見つからないとのことでした。(多分)

最初に読み込む画像ファイルをコメントアウトしてビルドすると音ファイルはちゃんと読み込めているが、やはりその後の画像ファイルを読み込むところでエラーになりました。

差分ファイルを上書きする前は正常に画像ファイルを読み込めているのですが・・・

エラー13の後の行に文字化けした文字が表示されてログは終わります。
UTF-8とかJISとかの認識に失敗してる?と思ったけど、ファイル名もアルファベットですし関係ないですかね・・・
難しい・・・



窓月らら

リンク

2015/4/29(Wed) 14:48:54|NO.68881

強制終了されるとの事なので
たぶん違うとは思いますが、読み込める画像の枚数(ファイル数)は
Android実機の機種によって違うんですよね。(以前からの仕様)
ビルドでエラーになったりはしないのですが、3〜4枚程度までの環境があります。
なので、ボタン画像をファイルで分けていたりすると不具合の原因になります。
(失敗する環境では真っ白な画像になってしまいます)

私の場合(ゲーム制作)だと

・キャラクタや背景のパターン 2048x2048
・フォントのパターン 512x512など
・その他の画像(システム関係、うちだと自作バーチャルコントローラのスキン)

くらいに、できるだけまとめるようにしています。
(バーチャルコントローラはモジュール化したので、そのうち公開します。)



窓月らら

リンク

2015/4/29(Wed) 17:22:50|NO.68882

なめろうさん>

もしかして画像はdpmにしてますか?
もしそうなら、assetsフォルダに画像ファイルを置いてビルドしてみてください。
これで動けば、dpm関係の不具合だと思われます。
(なんかうちのほうでも試したらアプリが起動できなかった)



窓月らら

リンク

2015/4/29(Wed) 18:20:54|NO.68884

プロジェクトフォルダ内の jni/Application.mk を
以下のように編集してからビルドしてみてください。

APP_PLATFORM := android-9 APP_ABI := armeabi-v7a


APP_PLATFORM := android-9 APP_ABI := armeabi
これで、いちおう強制終了もなく、dpmから画像も読めてますが…
不具合かな?



zakki

リンク

2015/4/29(Wed) 19:51:15|NO.68888

DPMからよめないとすると
http://dev.onionsoft.net/trac/openhsp/browser/trunk/package/win32/android/hspproj/jni/hsp3/dpmread.cpp#L121

i = *(int *)fname;

memcpy(&i, fname, sizeof(int));
にすると大丈夫だったりしませんか?



窓月らら

リンク

2015/4/29(Wed) 20:25:58|NO.68889

zakkiさん>
変えてみましたが、変化なしです・・。

ビルドして出来たapkの中身を見ると
libフォルダ以下に、armeabi と armeabi-v7aフォルダがあって
dpmファイル(libhsp3dish.so)は armeabiのほうにあるんですが・・
これって正しいんですかね?



なめろう

リンク

2015/4/29(Wed) 21:33:06|NO.68890

>窓月ららさん、zakkiさん

ありがとうございます。
dpmだと読み込みに失敗しているようです。
assetsに画像ファイルも入れてビルドするとちゃんと起動しました。
ボタンが真っ白になる不具合も直っていました。

画像ファイル、1つにまとめて座標で切り取って・・・という風にすればファイル数少なくてすみそうですね。
画像一つ一つを1つのファイルにしているので、ファイ数が数十個にもなっていてdpmでまとめてたのですが。

しばらくはassetsに画像ファイル入れる方法でやってみます。
ありがとうございました。



zakki

リンク

2015/4/29(Wed) 22:49:41|NO.68895

> 窓月ららさん
以前ARM版HSPを作ってる時に詰まったとこと重なってる気がしただけで、Android固有の事情は詳しくなくてよくわかりません。

もうちょい前の方で
static unsigned char buf[0x80] __attribute__ ((aligned (8)));
にすると大丈夫とかもないですか?
でもここで死んでると画像だけじゃなくてdpm自体使えなくなってるはずか…



窓月らら

リンク

2015/4/30(Thu) 14:23:50|NO.68904

zakkiさん>
ありがとうございます。それも試したのですがやはり変わらず・・

で、結論としては、hsp3dhのバグだと思われます。
hsp3dhはHSPで書かれてるので、HSPにソースが同梱されています。

hspsdk/hsp3dh/hsp3dh.hsp ←これがソース

で、このソースの1171行目を
basedir=path_proj+"\\"+and_name+"\\libs\\armeabi\\" から
basedir=path_proj+"\\"+and_name+"\\libs\\armeabi-v7a\\" に変えますと
apk内のarmeabi-v7aにdpm(libhsp3dish.so)もまとまるようになり、
無事Android上で実行できるようになりました。

この件について、おにたまさんにも連絡済みです。

というわけで、自分で上記ソースを修正して実行ファイル(hsp3dh.exe)を作成し
HSPフォルダのhsp3dh.exeを上書きしてからdhでビルドすれば直ります。

なめろうさん>
これで、dpmが使えます♪ やったね。



なめろう

リンク

2015/4/30(Thu) 22:04:41|NO.68914

>窓月ららさん
ありがとうございます、dpmファイル使えるようになりました。

1つ気になった点が・・・
差分ファイルのおかげでobjimageが二個目移行のボタンにも反映されるようになりましたが、ボタンに表示される文字が一瞬だけ各ボタンの一番左に表示されてチラつきませんか?
もしかしたら端末の性能のせいかもしれませんが。
ちょっと古いスマホとmemopad7で動作確認をしています。
どちらも同じような症状がでした。
ボタン画像には透過画像を利用してます。



窓月らら

リンク

2015/4/30(Thu) 22:32:37|NO.68915

なめろうさん>

うちは7インチのタブレット4台で確認しているのですが
> ボタンに表示される文字が一瞬だけ各ボタンの一番左に表示されてチラつきませんか?
こういう現象は無いですね・・透過を使ってないからかもしれませんが。
ただ、文字そのものが塗り潰されてしまうのが2台あります。
これはmesのほうの不具合と同様なので、たぶん共通のどこかの不具合ですね。
mesのほうが直れば、ボタンのほうも直るような気がしています。

なので、現状ではmesやボタンのテキスト表示は使用せずに
ボタンなら画像に文字も描いて対応するほうが確実だと思います。

うちは、標準のボタンもmesもデバッグ用に留めています。



なめろう

リンク

2015/5/1(Fri) 18:31:07|NO.68933

>窓月ららさん
透過画像を使っているからっぽいです。
ボタンを透過画像の物と不透明の画像と二つ混在させてみたら、透過画像の物のみ文字が一瞬チラつきました。
どんな環境でも再現できるかは不明ですが。
素人なのでスクリプト自体に原因がある可能性も否めません^^;


ボタンについては文字もボタン画像に含めて作ってしまった方がよさそうですね。
320*480のサイズでアプリ作っていたのですが、大きいタブレットだと文字も画像もボケボケなので、高解像度端末用に640*960サイズ用も作ってみました。
オブジェクトの文字にfont命令が効かないのか、hsp3dishではmode2とか言うのも対応してないようでデフォルトのフォントサイズにしかならずにボタンの文字が凄い小さくなってしまいました。
そもそもAndroidだと端末依存のフォントになってしまうということで、文字を表示させるような物は画像ファイルにしておいたほうが端末に左右されないから無難でしょうか?
クイズゲームではないのですが、質問が表示されて、それに対応する答えを入力させることを繰り返すアプリなのですが、全ての質問を画像にすると大量になってしまうのでmes周りの改良や入力ボックスの実装などがされると大変助かるのですが〜^^



窓月らら

リンク

2015/5/1(Fri) 21:35:18|NO.68934

長文になってすみません。。(私事多し)

なめろうさん>

透過だと出るんですね・・。
私はボタンも自前で作って対応しています。スライダーも作りました。
キャラクタを表示するのと同様に gcopy gzoom grotate でやってます。

解像度は色々試した結果、いま作ってるゲームは320x480にしました。
個人的にドット絵の雰囲気を出したいというのがあるのでこのサイズに。

ご指摘のとおり、そもそもmesだと端末文字に依存してしまうので
レイアウトやデザイン上の問題になる可能性がありますね。
なので、文字も画像から表示させたほうが無難だと思います。
(色違いが必要になるとちょっと面倒ですが)

やりかたはキャラクタ表示等と同じで、
パターンを作って、対応したメッセージデータを順次読み出して表示します。
まだ自分用にしか作ってませんが、これ用の開発ツールも作成済みです。
(ほぼ出来てるのですが、これから制作中のRPGに組み込みの段階)
iniで簡易スクリプトを書いて、それを専用のデータ(バイナリ)に変換し
同時に対応した文字パターン画像も生成できるというものです。
あとはこのデータのルールに従い解釈・表示するプログラムを組み込むだけ。
基本1文字1バイト+拡張機能なデータなので、コンパクトに作れます。
制作の過程で、モジュール化したいと思っています。

で、自前で文字を表示する場合は gzoom で縮小して表示がおすすめです。
これはちょっとした技なんですが、座標上の解像度が320x480であっても、
実機の解像度を生かした表示は可能なんですよね。
例えば32x32の画像(文字)を表示しようとした場合、コピー元の画像を
64x64とか128x128で用意しておいて、これをgzoomで32x32に縮小します。
こうすると、実行環境の解像度が高ければドット絵みたいにならずに
コピー元の解像度を生かして表示されます。
なので、これを利用して文字だけ高解像度化などが可能になります。
文字だけ gfilter 2 でスムージングするという方法も使えます。
うちは、32x32の文字パターンを作成して、これを16x16以下に縮小して
表示する方法を取りました。小さな文字も潰れず結構綺麗に出ますよ。

とりあえず、いま作ってるゲームの副産物で開発ツールを色々作ってます…
そのうち公開できそうなのは公開するかも。

組み込んでテストしてる段階のもの(ほぼ完成)。
・メッセージデータ&文字画像生成ツール 及びこれの表示ルーチン
・BGM管理モジュール(android環境向け)
・バーチャルコントローラ(アナログスティック+最大32ボタン)

これからたぶん作るもの。
マップエディタ、イベント編集ツール、キャラクタマッピングツール



なめろう

リンク

2015/5/3(Sun) 19:29:20|NO.68958

>窓月ららさん
gzoom使う方法はしらなかったです。
実際にやってみたら、確かに元画像に大きめの物を用意しておいて縮小して表示させるようにしておけば高解像度で表示されました。
objimageでも同じようにできないものでしょうか…
タッチした座標でどのボタン押したか判定させる方法も考えて見たのですが、タッチした後でキャンセルしたくて離れた場所で指を離したり、指を離したときにボタンを押したことにしたりと、、、
どれもこれも工夫すればできることでしょうが、ボタン命令一つでできるので便利ではあるんですよねー



窓月らら

リンク

2015/5/4(Mon) 01:26:12|NO.68959

なめろうさん>

モジュール化したのをそのうち公開するつもりですが、とりあえずサンプル。
標準のボタンと同等の機能があります。
コピペだけで動作するように、描画の部分をboxfとmesに置き換えてありますが
ここをgcopyなどで描画するように書き直せば、画像をボタン化できます。

コメントにもありますが、statで状態を取得でき
0:押していない 1:押した 2:押している 3:離した -1:他の領域が押下中
が返って来ますので、これを利用して判定します。

#include "hsp3dish.as" #module mod_btn // 配列を初期化 #deffunc btninit int _p1 dim p,_p1 return // ボタンで使用する情報をセット(座標、タッチ有無) #deffunc btnst int _x, int _y, int _t tax=_x: tay=_y: tap=_t return // ボタンの判定と描画 #deffunc btndraw int _id, int _x, int _y, int _w, int _h, str _s // 作業変数を初期化(p(id)=p(id)は初回時エラー回避用) i=0: j=0: n=p(_id) // ボタンを離した直後1回をスキップ(これが無いと操作性が悪い) if n=3 { n=0: goto *btndraw_drawbtn } // ボタンの上かどうか判定 if _x<=tax & _x+_w>tax & _y<=tay & _y+_h>tay { i=1 } // ボタンの操作状態を判定 if tap { if i & n!-1 { n+=1-(p(_id)=2): j=1 } else { if n=0 { n=-1 } }} else { if i & n>0 { n=3 } else { n=0 }} *btndraw_drawbtn // 文字がなければボタンを描画しない(当たり判定のみ) if _s="" { goto *btndraw_drawskip } // ボタンを描画 // ↓この2行をgcopy,gzoomなどの描画に置き換える color (p(_id)=2)*255,0,255: boxf _x+j,_y+j,_x+_w+j,_y+_h+j color 255,255,255: pos _x+10+j,_y+4+j: mes _s *btndraw_drawskip p(_id)=n // 判定結果を返す // 0:押していない 1:押した 2:押している 3:離した -1:他の領域が押下中 return n #global setreq SYSREQ_CLSMODE,1 // redraw 0 でクリア setreq SYSREQ_CLSCOLOR,$000000 // クリア色 msg="" // 使用するボタン数をセット(ループ前に1回だけ実行) btninit 4 repeat redraw 0 // タッチ情報を取得 mtlist tid: tap=stat repeat tap: mtinfo tc,tid(cnt): x=tc(1): y=tc(2): loop ;x=mousex: y=mousey: getkey tap,1 // HSP3Dishじゃない場合 // 座標とタッチ状態をセット btnst x,y,tap // ボタンを配置 結果はstatで得られる // btndraw id,x座標,y座標,横サイズ,縦サイズ,テキスト btndraw 0,120,160,90,24,"BUTTON 1": btn1=stat btndraw 1,120,190,90,24,"BUTTON 2": btn2=stat btndraw 2,120,220,90,24,"BUTTON 3": btn3=stat btndraw 3,120,250,90,24," EXIT" : if stat=3 { end } if btn1=1 { msg="ボタン1を押しました。" } if btn2=1 { msg="ボタン2を押しました。" } if btn3=1 { msg="ボタン3を押しました。" } if btn1=3 { msg="ボタン1の上で離しました。" } if btn2=3 { msg="ボタン2の上で離しました。" } if btn3=3 { msg="ボタン3の上で離しました。" } color 0,255,255: pos 0,0 mes "btn1="+btn1+" btn2="+btn2+" btn3="+btn3+" cnt="+cnt mes msg redraw 1 await 1000/60 loop



窓月らら

リンク

2015/5/4(Mon) 01:38:17|NO.68961

あ、ちなみにこれはdishじゃなくても使えるので
その場合はdish固有の部分を削除してお試しください。



窓月らら

リンク

2015/5/4(Mon) 01:55:06|NO.68965

これのほうがエレガントかな・・動作は同じだけど。

// ボタンの判定と描画 #deffunc btndraw int _id, int _x, int _y, int _w, int _h, str _s // 作業変数を初期化(p(id)=p(id)は初回時エラー回避用) i=0: j=0: n=p(_id) // ボタンを離した直後1回をスキップ(これが無いと操作性が悪い) if n=3 { p(_id)=0: return 0 } // ボタンの上かどうか判定 if _x<=tax & _x+_w>tax & _y<=tay & _y+_h>tay { i=1 } // ボタンの操作状態を判定 if tap { if i & n!-1 { n+=1-(p(_id)=2): j=1 } else { if n=0 { n=-1 } }} else { if i & n>0 { n=3 } else { n=0 }} // 文字がなければボタンを描画しない(当たり判定のみ) if _s!"" { // ボタンを描画 // ↓この2行をgcopy,gzoomなどの描画に置き換える color (p(_id)=2)*255,0,255: boxf _x+j,_y+j,_x+_w+j,_y+_h+j color 255,255,255: pos _x+10+j,_y+4+j: mes _s } p(_id)=n // 判定結果を返す // 0:押していない 1:押した 2:押している 3:離した -1:他の領域が押下中 return n



窓月らら

リンク

2015/5/4(Mon) 03:40:08|NO.68968

テキストを使用しない場合は、こうしてください。
呼び出し元は、btndraw id,x座標,y座標,横サイズ,縦サイズ

// ボタンの判定と描画 #deffunc btndraw int _id, int _x, int _y, int _w, int _h // 作業変数を初期化(p(id)=p(id)は初回時エラー回避用) i=0: j=0: n=p(_id) // ボタンを離した直後1回をスキップ(これが無いと操作性が悪い) if n=3 { p(_id)=0: return 0 } // ボタンの上かどうか判定 if _x<=tax & _x+_w>tax & _y<=tay & _y+_h>tay { i=1 } // ボタンの操作状態を判定 if tap { if i & n!-1 { n+=1-(p(_id)=2): j=1 } else { if n=0 { n=-1 } }} else { if i & n>0 { n=3 } else { n=0 }} // ボタンを描画 // ↓この1行をgcopy,gzoomなどの描画に置き換える color (p(_id)=2)*255,0,255: boxf _x+j,_y+j,_x+_w+j,_y+_h+j p(_id)=n // これは次回の判定で使用するため // 判定結果を返す // 0:押していない 1:押した 2:押している 3:離した -1:他の領域が押下中 return n



なめろう

リンク

2015/5/4(Mon) 12:06:52|NO.68976

>窓月ららさん
ありがとうございます。
ボタンもデザインに凝りたいので使わせていただきます〜m(_ _)m



窓月らら

リンク

2015/5/4(Mon) 12:51:40|NO.68977

はい、どうぞ。

よくみたら
> (p(id)=p(id)は初回時エラー回避用)
これは気にしないで下さい、以前のコードのコメントが残ってただけなので・・



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