ページ送りとページジャンプだけだけど
これの応用で選択肢を選ばれた時の対応ができる
ただし選択肢の表示や判定は色々考える必要が有る
//*ラベル名(必ず行頭に「 * 」)
//[p] クリック待ち改ページ
//[l] クリック待ち改行
txt={"
*start
あいうえお
かきくけこ
[p]
さしすせそ
たちつてと
[p]
*一行毎にクリック
なにぬねの[l]
はひふへほ[l]
まみむめも
[p]
やいゆえよ
らりるれろ
[jmp]*一行毎にクリック
"}
str_jmp="*start" //ジャンプ先指定
jmp_f=1 //ジャンプ先指定があるフラグ=1
cls_f=1 //画面クリアして改ページフラグ=1
mes "左クリックで開始"
onclick gosub *next_mes
stop
*next_mes
if wparam ! 1 {return}//左クリック以外return
if cls_f { //画面クリアして改ページ
cls_f=0
color 255,255,255:boxf:color:pos 0,0
line_cnt=0 //改行用カウンタ
}
if jmp_f {//ジャンプ先指定がある
index_start=0 //ラベル行の次のインデックス用(ページ開始位置)
repeat //ラベル検索ループ
getstr txt_tmp,txt,index_start,'' //一行取り出し
if strsize = 0 {dialog "ラベルが無い",0 :end}
index_start + strsize //取り出したbyte数を加算
if txt_tmp=str_jmp {break} //ラベルが一致したらbreak
loop
index=0 //ページ開始位置からの移動分用インデックス
jmp_f=0
}
repeat
repeat
getstr txt_line,txt,index_start+index,''//一行取り出し
if strsize=0 {dialog "テキスト終了",0 :end}
index+strsize //一行分のbyte数を加算
if instr(txt_line,0,"*") ! 0 {break} //行頭に*が無かったらラベル行ではないのでbreak
str_jmp_save=txt_line //通過したラベルを記録
loop
getstr txt_mes,txt_line,0,'['//タグが有ったらそこまで取り出し、無ければ全部
strsize_getstr=strsize
stat_getstr=stat // getstrで取り出した文字列の終端文字コ−ド('['ならタグ有り)
pos 50,50+line_cnt*24
if stat_getstr = '[' {//タグ有り
getstr txt_tag,txt_line,strsize_getstr,']'//タグ取り出し
strsize_getstr+strsize
switch txt_tag
case "p" //クリック待ち改ページ
cls_f=1
mes txt_mes //タグを除いてあるバッファを表示
line_cnt++ //表示行数加算
break
swbreak
case "l" //クリック待ち改行
cls_f=0
mes txt_mes
line_cnt++
break
swbreak
case "jmp" //クリック待ちジャンプ
getstr str_jmp,txt_line,strsize_getstr,'' //[jmp]の続きをジャンプラベルとして取り出し
if strsize=0 {dialog "ラベルが無い",0 :end}
jmp_f=1
cls_f=1
break
swbreak
default //間違ったタグ指定
mes txt_line //取り出した一行を全て表示(間違ったタグを指定した時用)
line_cnt++
swend
}else{//タグ無し
mes txt_mes //タグを除いてあるバッファを表示
line_cnt++ //表示行数加算
}
loop
title "現在のラベル:"+str_jmp +" index:"+ index+" txt_tag:"+txt_tag+" mousex="+mousex+" mousey="+mousey +" str_jmp_save:" +str_jmp_save
return
選択肢の表示領域とマウスカーソルの判定例
txt={"
1,Aを選ぶ
2,Bを選ぶ"}
getstr m1,txt,idx //notegetのが楽だけど行数が多くなっていくと重くなる記憶が・・・
idx+strsize
getstr m2,txt,idx
m1x=100
m1y=100
m2x=100
m2y=130
repeat
redraw 0
color 255,255,255:boxf
color
pos m1x,m1y
mes m1
m1sx=ginfo(14)
m1sy=ginfo(15)
pos m2x,m2y
mes m2
m2sx=ginfo(14)
m2sy=ginfo(15)
hsvcolor 50+rnd(200),200,200
if mousex>m1x and mousey>m1y and mousex<(m1x+m1sx) and mousey<(m1y+m1sy) {line m1x,m1y+m1sy,m1x+m1sx,m1y+m1sy}
if mousex>m2x and mousey>m2y and mousex<(m2x+m2sx) and mousey<(m2y+m2sy) {line m2x,m2y+m2sy,m2x+m2sx,m2y+m2sy}
redraw 1
await 10
loop