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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1019
ヒビノ氏android実機で強制終了させられます。1文字ずつ表示スクリプト10解決


ヒビノ氏

リンク

2015/10/19(Mon) 22:16:58|NO.72380

こんにちは。

hspで一文字ずつ文字を表示させるスクリプトを自分なりに組んでみて、
それをhsp3dishで動くことも確認して、
hsp3dish helperでもビルド成功して

いざandroidで動かそうとしたら強制終了させられました。


#include "hsp3dish.as" goto *main #deffunc printchar pos 0,0 : color 255,255,255 : mes ""+s\3 if string(s\3)=="" : return if string(s\3)!=backup : backup=string(s\3) : scnt=0 char=peek(string(s\3),scnt) if char==13 { scnt++ char=peek(string(s\3),scnt) if char==10 : scnt++ } char=peek(string(s\3),scnt) if (char>=129 and char<=159) or (char>=224 and char<=255) { scnt++ } mes strmid(string(s\3),0,scnt+1) skip=0 if scnt<=strlen(string(s\3)) : scnt++ return *main dim string,3 string(0)="てすとてすとてすとてすとてすと" string(1)="testtesttesttest\ntesttesttesttesttesttest" string(2)="" s=2 repeat redraw 0 title ""+s color 0,0,0 : boxf pos 0,0 : printchar redraw 1 stick enter if enter==256 : s++ await 1000/60 loop

簡単に言うとクリック(タップ)するごとに疑似的な文章送りのようなものができるものです。
最初にタップするまでは動くんですがタップすると強制終了します。

タップで文章送りするところを、しばらく放置するように処理を変えても、
次の文章に切り替わるところで強制終了させられるので
stickのせいではなさそうなところまでは確認しました。

このスクリプトのどこが悪いのでしょうか?



この記事に返信する


ヒビノ氏

リンク

2015/10/19(Mon) 22:19:40|NO.72381


dimじゃなくsdimですね。
状況は変わりませんでしたが・・・・



zakki

リンク

2015/10/19(Mon) 22:45:50|NO.72382

クラッシュの原因かは分かりませんが、17行目あたりにSJISを仮定して2バイトまでとした判定がありますが、Windows版以外ではUTF-8で6バイトまでありえます。
adb logcat でログを見るのがいいかと思います。


;https://ja.wikipedia.org/wiki/UTF-8 if (char >= 0xfc) { scnt += 5 } else: if (char >= 0xf8) { scnt += 4 } else: if (char >= 0xf0) { scnt += 3 } else: if (char >= 0xe0) { scnt += 2 } else: if (char >= 0xc2) { scnt += 1 }



kanamaru

リンク

2015/10/19(Mon) 23:46:12|NO.72384

できたら実行してるのかがwindowsかandroidなのか調べて処理を分けるといいですね。
確かsysinfoで調べられたと思う。



窓月らら

リンク

2015/10/20(Tue) 01:52:29|NO.72386

こんな方法もありますよ、というサンプル。
これだと文字コードに関係なく、Windows, Android 共通で動きます。
1文字ずつ表示する場合は、区切り位置を管理してやればいけます。

#include "hsp3dish.as" setreq SYSREQ_CLSMODE,1 setreq SYSREQ_CLSCOLOR,$000000 // 全角の場合'_'を後ろに付けること mesdata="Android と_ Windows(HSP)で_は_\n文_字_コ_ー_ド_が_違_う_ん_だ_よ_ね_…_。_" sdim strmes,1024 // 文字列バッファ(WindowsとAndroidで必要量が異なる) i=0: p=0 // 表示用文字コードの並びを作成 // こうすることで、文字コードの違いを吸収できる repeat p=peek(mesdata,cnt) if p=0 { break } if p!'_' { poke strmes,i,p: i++ } loop // ループで表示 color 255,255,255 repeat redraw 0 pos 32,200: mes strmes redraw 1 wait 17-(cnt\3=0) // 60FPS loop



窓月らら

リンク

2015/10/20(Tue) 02:07:26|NO.72387

間違えてた。

await 17-(cnt\3=0) // 60FPS



窓月らら

リンク

2015/10/20(Tue) 02:36:31|NO.72388

1文字ずつ表示のサンプル。
Windows, Android 共通。iOSは未確認だが、たぶんいけます。

#include "hsp3dish.as" setreq SYSREQ_CLSMODE,1 setreq SYSREQ_CLSCOLOR,$000000 // 全角は'_'を必ず後ろに付けること、半角は1文字とみなす位置 mesdata="An_dr_oi_d _と _Wi_nd_ow_s(_HS_P)_で_は_\n文_字_コ_ー_ド_が_違_う_ん_だ_よ_ね_…_。_" sdim mesbuf,1024 // 文字列バッファ(WindowsとAndroidで必要量が異なる) dim cp,256 // 区切り位置を記録しておく配列 i=0: j=0: p=0 // 表示用文字コードの並びと、区切りデータを作成 // こうすることで、文字コードの違いを吸収できる repeat p=peek(mesdata,cnt) if p=0 { cp(j)=-1: break } if p='_' { cp(j)=i: j++ } else { poke mesbuf,i,p: i++ } loop // ループで表示 i=0 color 255,255,255 repeat redraw 0 if (cnt\180)=0 { i=0 } // 3秒ごとに表示をリセット(test) if (cnt\2)=0 { i++: if cp(i)=-1 { i-- }} pos 32,200: mes strmid(mesbuf,0,cp(i)) redraw 1 await 17-(cnt\3=0) // 60FPS loop



zakki

リンク

2015/10/20(Tue) 08:45:50|NO.72390

'ソ'のダメ文字問題と同じでSJISの2バイト目はASCIIの範囲にかぶってるので、この場合'雲'とか'垣'でクラッシュするようです



kanamaru

リンク

2015/10/20(Tue) 12:24:37|NO.72392

クラッシュの原因は0x5c問題ですか。
hspでも起きるんですね。
対策としては、二バイト目が0x5cの文字の後に\を1つ入れると解決します。



窓月らら

リンク

2015/10/20(Tue) 15:41:36|NO.72393

ぎゃああ。。文字化け;
まぁいいや、考え方のサンプルにしてね♪

うちは独自コードに置き換えて画像で文字表示してますけどね。
これだと完全に環境依存しない。



ヒビノ氏

リンク

2015/10/20(Tue) 23:42:13|NO.72408

な、なるほど、SJISでhspで組んでもUTF-8に変換されてUTF-8として処理されてしまうのですね!
文字の全角判別の時の処理のせいという可能性が出てきました、ありがとうございます。
(データ転送できるケーブルを紛失しているのでlogcatは確認できていませんがその部分の処理を抜いたら動作しました)

区切り文字や画像表示、確かに環境を問いませんね・・・
力づくのような気もしますが無難な方法ですね、参考になります!
画像文字でも分割などして一文字表示するスクリプトが組めたら表現の幅が広がりそうです。

皆さんありがとうございました、実装頑張ります。



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