※使いやすくしました 前のは消してます
catsさんのスクリプトで、半角文字が入っているとバグるみたいです(strmidは文字数ではなくバイト)
で、改良しました
少しの改良のはずが、気付いたらモジュールを作ってました(謎)
#module text2Ex改
#define global text2setting(%1=1) text2setting_ %1
#deffunc text2setting_ int p10
if p10 <= 0:return 1
dim Buflen,p10
dim cnt_,p10
dim count,p10
sdim temp,64,p10
dim temp_,p10
sdim p2_,256,p10 //最大文字数を256Bに決め打ちしています 適宜変えてください
sdim p3_,256,p10 //最大文字数を256Bに決め打ちしています 適宜変えてください
setflag = 1
setcnt = (p10-1)
return 0
#deffunc text2reset int p20
if setflag = 0:return 1
if p20 < 0:return 2
if p20 > setcnt :return 2
Buflen.p20 = 0
cnt_.p20 = 0
count.p20 = 0
temp_.p20 = 0
p2_.p20 = ""
p3_.p20 = ""
temp.p20 = ""
return 0
#define global text2(%1,%2=10,%3=0) text2_ %1,%2,%3
#deffunc text2_ str p2,int p1 ,int p4
if setflag = 0:return 1
if p4 < 0:return 2
if p4 > setcnt :return 2
if Buflen.p4 = 0 {
Buflen.p4 = strlen(p2)
p2_.p4 = p2
}
cnt_.p4++
if cnt_.p4 \ p1 = 0{
if count.p4 > Buflen.p4{
mes p3_.p4
return 5
} else {
temp_.p4 = peek(p2_.p4,count.p4)
if (0x81 <= temp_.p4 & temp_.p4 <=$9f) | (0xe0 <=temp_.p4 & temp_.p4 <= 0xef){
getstr temp.p4,p2_.p4,count.p4,,2
p3_.p4 += temp.p4
count.p4+=2
} else {
temp.p4 = strf("%c",(peek(p2_.p4,count.p4)))
p3_.p4 += temp.p4
count.p4++
}
}
}
mes p3_.p4
return 0
/* 解説
text2setting int p1(1)
text2を使うループに入る前に、1または同時に複数使う数を指定します(基本的にはスクリプトの最初)
指定した数だけ内部にバッファを作ります
バッファは同時に使うことができます
またバッファは0番から数えます( 3つ作ったら、0,1,2番のバッファが作られる)
作成したバッファを完全に初期化したい時にもtext2settingが使えます
text2reset int p1
text2settingで作成したバッファの(p1)番目を初期化します
text2 str p1,int p1(10),int p3(0)
p1は使うtext表示したい文字列です
p2は表示スピードです これはループの速度によって変わります
p3は使用するバッファです
現在のカレントポジションにp3がtext風に書かれます
共通戻り値
stat = 0
正常終了
stat = 1
text2settingでバッファが作成されてない
stat = 2
引数の値が異常
text2限定戻り値
stat = 5
すべて表示完了
text2Ex module by kanahiron
*/
#global
//以下サンプル
X=0
Buf2="ここに入力したい文字を書くんだよ!\n複数行でも構わないよ!\nキャラを動かしながらでも文字が出る!"
text2setting 2 ;2つ同時に使いたいので2
endflag1 = 0
endflag2 = 0
repeat
redraw 0
color 255,255,255:boxf:color 255
X+=3 :if X > 565:x = 30
pos X,5:mes "キャラ⇒■":color
pos 100,100:text2 "ここに入力したい文字を書く。\n複数行でも良い。\nキャラを動かしながらでも文字が出る。"
//書くのはたったこれだけ バッファや速度を指定しないとき引数は省略できる(バッファ=0,速度=10)
if stat = 5: break //stat = 5は書き終わり
//バッファ0が書き終わったらbreak
pos 100,350:text2 Buf2,3,1 //text2resetでリセットすればbuf2を自由に変えられる
if stat = 5:text2reset 1 //書き終わったらリセット
redraw 1
await 1000/30
loop
wait 100
cls
text2reset 0 //バッファ0を初期化
text2reset 1 //バッファ1を初期化
endflag2 = 0
repeat
redraw 0
color 255,255,255:boxf:color 255
X+=3 :if X > 565:x = 30
pos X,5:mes "キャラ⇒■":color
pos 100,100:text2 "こんにちは。\nkanahironと申します",4
if stat = 5:endflag1=1
pos 100,350:text2 Buf2,6,1
if stat = 5:endflag2=1
if endflag1 & endflag2 :break //バッファ0と1両方が書き終わったらbreak
redraw 1
await 1000/30
loop
endflag1 = 0
endflag2 = 0
stop
若干使い方が難しいかもしれません
でも使えればスクリプトが大幅に短くなるはずです
わからないことがあったらどうぞ質問してください
また上記モジュールは若干のミスがある可能性があります ご了承ください