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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0220
146セリフの表示について13解決


146

リンク

2012/2/20(Mon) 01:02:40|NO.44984

現在キャラクターにセリフを表示させる時、emes命令を使っているのですが
emes命令を使ってしまうと、一定の間隔で文字が表示されていくだけで
途中にキー入力による文字の加速や、一瞬で文字を表示させる等
文字表示中には操作を受け付けてくれないようですorz

文字の表示中にも命令を入れることのできる方法はありますか?
例:1文字づつ文字を表示している間にスペースキーを押すと一瞬で全ての文字を表示する

今のところstrlenを使ったスクリプトを考えているのですが
日本語入力すると失敗してしまい、ほかの方法がどうしても思いつかないのです><

何かいい方法がありますか?



この記事に返信する


GENKI

リンク

2012/2/20(Mon) 01:33:26|NO.44985

そのものズバリやってくれる命令はありません。
これはemesは使わずmes命令で自分で実装するしかありません。


> 日本語入力すると失敗してしまい、ほかの方法がどうしても思いつかないのです><

どういう失敗なのか内容を確認するまで確信は得られませんが、おそらく文字化けしてしまうのではないですか?
もしそうなら2バイト文字を考慮していないのが原因の問題だとおもいます。
文字列についての解説はマニュアルの「HSP3 文字列のひみつ(TIPS)」がいい資料になります。

これらを踏まえた上で、文字列操作の便利なモジュールやら資料はこちら。
http://hspdev-wiki.net/?String
http://hspdev-wiki.net/?String%2F%B2%FE%B9%D4#o681c775



146

リンク

2012/2/20(Mon) 01:44:06|NO.44986

>>GENKIさん
やっぱり単体では無理ですよね・・・

日本語の表示ができないのはおそらく文字化けによるものだと思うので、
資料の方をしっかりと勉強しておきたいと思います><

一応明日の夜12時ごろまで引き続き方法を募集します。



暇人

リンク

2012/2/20(Mon) 02:29:22|NO.44987

>やっぱり単体では無理ですよね・・・
emesも複数の命令スクリプトを使ってhsp3util.as内に新規命令で登録されてるだけだけど・・・

>途中にキー入力による文字の加速や、一瞬で文字を表示させる等
本当にこれだけの機能追加で良いなら
emes命令を改造しちゃうのが手っ取り早いかも・・・



pizza

リンク

2012/2/20(Mon) 03:02:07|NO.44988

onkey gosubのラベルでキーを判定してtext 0にするのはどうですか?



fortunehill

リンク

2012/2/20(Mon) 04:25:53|NO.44989


/*一度ユニコードに変換して切り分ける方法*/ #include "kernel32.as" os = {"現在キャラクターにセリフを表示させる時、emes命令を使っているのですが emes命令を使ってしまうと、一定の間隔で文字が表示されていくだけで 途中にキー入力による文字の加速や、一瞬で文字を表示させる等 文字表示中には操作を受け付けてくれないようですorz"} tt = 50 sdim us,strlen(os)*2 cnvstow us,os lstrlenW varptr(us) nn = stat sdim cs,nn repeat nn wpoke cs(cnt),0,wpeek(us,cnt*2) ss = cnvwtos(cs(cnt)) cc = wpeek(ss) if (cc == 13) {ii = 0 :jj++} else:if (cc == 10) {} else {pos ii,jj*16 :mes ss :if (cc <= 255) {ii+=8} else {ii+=16}} await tt stick kk,8+2 :if (kk & 16) {tt = 0} :if (kk & 2) {tt+= 5 :tt = limit(tt,0,200)} :if (kk & 8) {tt-= 5 :tt = limit(tt,0,200)} loop



ひじき

リンク

2012/2/20(Mon) 14:40:28|NO.44993

emes命令が定義されているモジュールファイル(hsp3util.as)を開き、
87行目から始まるemes命令の内容を見て何が行われているかを見れば、
同じものが自分で作れますね?
だったら後はそれを改造しちゃうだけです。頑張ってください。

わからない命令があればヘルプを見たりgoogleで検索するなりすれば、
だいたいその命令が何をしているのかも分かるはずです。



146

リンク

2012/2/20(Mon) 20:53:38|NO.44997

emes命令の改造…
なるほどです!
そこには気づきませんでした…

多くの回答ありがとうございます><
またどうしてもわからないことがあったら聞くかもなのでよろしくです



TMKL

リンク

2012/2/21(Tue) 00:51:48|NO.45016

解決になっていますが、
emesの改造は文字のスタイルなども絡んでいて難しそうだったので、
新しくtmes命令を追加するモジュールサンプルを作ってみました

スペースキーでのスキップに対応です
どうしてもわからなくなったら参考にして下さい

elseとか使ったらもっとスマートに出来そうですが気にしないでください


一度に255文字以上表示しようとすると待ち時間が0になるのは仕様です
改行のときは待たないのも仕様です

#module #deffunc tmes str p1,int p2 ;待ち時間0 または 文字数0 または 文字数255以上なら ;通常のmesをして終了 if p2<=0 or strlen(p1)<=0 or strlen(p1)>=255:mes p1:return string=p1;文字列 string_index=0;切り出し線の位置 string_length=strlen(string);文字列の長さ y=ginfo(23);カレントポジションのy座標 sdim temp,255;書置きスペースを255文字確保 repeat stick key;キー取得 if key&16{;もしスぺースが押されたら temp=string;書置きに全部代入 string_index=string_length;切り出し線を最後に移動 goto *表示 } if wpeek(string,string_index)=2573 {;もし改行なら poke temp,string_index,"\n";書置きに\nを入力 string_index+=2;切り出し線を2文字移動 goto *表示 } code=peek(string,string_index);文字コードゲット ;半角なら1、全角なら2をstepに代入 step=((code >= 129 & code <= 159) | (code >= 224 & code <= 252))+1 ;半角なら1文字、全角なら2文字切り取って、 ;書置きに入力 poke temp,string_index,strmid(string,string_index,step) ;切り出し線を半角なら1文字、全角なら2文字移動 string_index+=step await p2 *表示 pos ,y:mes temp;書置きの文字を表示 ;切り出し線が文字列の最後まで来たら終了 if string_index >= string_length:break loop return #global pos 40,40 ;tmes "表示する文字列",待ち時間 tmes "alphabetALPHABETひらがなカタカナ漢字\nなんでも表示\n\n●▲■\\\n改行もOK記号もOK",60 stop



TMKL

リンク

2012/2/21(Tue) 00:52:10|NO.45017

#moduleから#globalまでをプログラムの先頭にコピペすると使用できます



146

リンク

2012/2/21(Tue) 01:14:01|NO.45018

なんとスクリプトまで…ありがとうございます><

一応自分で作ってみてある程度は出来たのですが、ちょっと満足いかないところもあったので
参考にさせていただきますね!
本当にありがとうございましたm(`;ω;´)m



暇人

リンク

2012/2/21(Tue) 02:53:51|NO.45020

hsp3util.asの134行ぐらいにある
> await stwait


t1=gettime(7) repeat -1*(emesEnd=0) await 15 getkey emesFast,90 //[Z]押してる間早送り getkey emesEnd,88 //[X]全表示 t2=gettime(7) if ((t2-t1+(t2<t1)*1000) >= stwait) or emesFast or emesEnd {break} //await 100とかになるとまともな入力検出が出来ないのでawait 15を回して時間計測 loop //emesEndが押されてもカーソルがスタート位置に戻るまでノーウェイトで*emes_aftを回してから全表示 if emesEnd and (orgx = ginfo_cx) {messg=strmid(mestmp,mescur,mesmax) :gosub *emes_aft :mescur=mesmax :emesEnd=0 :break}
に置き換え


まぁ、文字表示中にキャラをアニメーションさせたり出来ないから(割り込み使う手もあるが・・・)
ゲームに使うなら一文字表示したらメインループに戻るように改造した方が良いんだけどね・・・



暇人

リンク

2012/2/21(Tue) 07:46:09|NO.45021

なんかバグがある気がしたけど、やっぱりあったw

hsp3util.as(改変前)の121行辺りの
> if peek(mestmp,mescur)=10 : mescur++
> mes "":pos orgx ←121行目
これの下に

//emesEndが押されてもカーソルがスタート位置に戻るまでノーウェイトで*emes_aftを回してから全表示(これが実行されたらemesEndを2にして無駄な改行を防ぐ判定に) if emesEnd {x=ginfo_cx:y=ginfo_cy:messg=strmid(mestmp,mescur,mesmax-mescur) :gosub *emes_aft :emesEnd=2 :break }
これを追加

134行ぐらいにある
> await stwait


t1=gettime(7) repeat -1*(emesEnd=0) await 15 getkey emesFast,90 //[Z]押してる間早送り getkey emesEnd,88 //[X]全表示 t2=gettime(7) if ((t2-t1+(t2<t1)*1000) >= stwait) or emesFast or emesEnd {break} //await 100とかになるとまともな入力検出が出来ないのでawait 15を回して時間計測 loop
に置き換え

137行目辺りの
> mes "":pos orgx


if emesEnd=2 {pos orgx}else{mes "":pos orgx} emesEnd=0
  に置き換え



TMKL

リンク

2012/2/22(Wed) 15:46:26|NO.45030

たびたびすみません
よく考えたらこれでいくらでも一度に表示出来ました

#module #deffunc tmes str p1,int p2 ;待ち時間0 または 文字数0 なら ;通常のmesをして終了 if p2<=0 or strlen(p1)<=0:mes p1:return string=p1;文字列 string_index=0;切り出し線の位置 string_length=strlen(string);文字列の長さ sdim temp,string_length+1;書置きスペースを文字列の長さ分確保 y=ginfo(23);カレントポジションのy座標 repeat stick key;キー取得 if key&16{;もしスぺースが押されたら temp=string;書置きに全部代入 string_index=string_length;切り出し線を最後に移動 goto *表示 } if wpeek(string,string_index)=2573 {;もし改行なら poke temp,string_index,"\n";書置きに\nを入力 string_index+=2;切り出し線を2文字移動 goto *表示 } code=peek(string,string_index);文字コードゲット ;半角なら1、全角なら2をstepに代入 step=((code >= 129 & code <= 159) | (code >= 224 & code <= 252))+1 ;半角なら1文字、全角なら2文字切り取って、 ;書置きに入力 poke temp,string_index,strmid(string,string_index,step) ;切り出し線を半角なら1文字、全角なら2文字移動 string_index+=step await p2 *表示 pos ,y:mes temp;書置きの文字を表示 ;切り出し線が文字列の最後まで来たら終了 if string_index >= string_length:break loop return #global pos 40,40 ;tmes "表示する文字列",待ち時間 tmes "alphabetALPHABETひらがなカタカナ漢字\nなんでも表示\n\n●▲■\\\n改行もOK記号もOK",60 stop



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