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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0208
たぬきオート送りにする方法8解決


たぬき

リンク

2008/2/8(Fri) 00:31:08|NO.13455

はじめまして、たぬきといいます。

今、HSPでゲームを作っているのですが、文字などをオート送りにする方法がわかりません。
どなたか教えていただけないでしょうか?



この記事に返信する


KENTA

リンク

2008/2/8(Fri) 08:37:50|NO.13459

>文字などをオート送りにする方法
こういうことですか?

c=0 *main redraw 0 color 255,255,255 :boxf :color pos c,0 mes "==⇒" c++ redraw wait 1 goto *main



たぬき

リンク

2008/2/8(Fri) 13:48:45|NO.13463

KENTA様、返信有難うございます。

文字などをオート送りにする方法なのですが、Nscripterなんかにオートで、クリックしなく
てもテキストが表示されるというあの機能のことです。
説明不足で申し訳ありません。

宜しくお願い致します。



Megane

リンク

2008/2/8(Fri) 17:35:07|NO.13464

既に読んだ部分をクリックせずともとばしてくれる、
といった機能でしょうか。


とにかく、もともとのメッセージ表示ができるならば、
難しいことではないでしょう。

クリックを待つ代わりに、ループでのシステム変数cntの値で
どれだけ時間がたったか判断し、あらかじめ決めておいた値を超えれば
breakで脱出して次のメッセージ表示に移ればいいわけです。



sin

リンク

2008/2/9(Sat) 00:17:58|NO.13468

似ているのかはわかりませんが、自分も以前に似たようなことを試みたことがあります。

自分のときは、
出力する文字列(全体)を指定
posで出力位置決定
オフセット変数を用意し、その値と文字列からその時に出力する一文字を取得
  (peekで1byteと2byteの文字判別も行う)
で取得した一文字を出力
い能侘呂靴進源のxサイズをginfo_mesxより取得
オフセットをずらす
  (1byte文字なら1,2byte文字なら2ずらす)

というものを関数化し、それをrepeat〜loop間において文字列の表示を行うように
していました。

オート送りは、このrepeat間に置くawaitを0や1として自動にみせかけ、
全ての表示を終えたら入力待ち・・・というように表現していました。


↑つまりこういうことですかね?



D.K

リンク

2008/2/9(Sat) 13:16:18|NO.13469

因みにGetTextExtentPointを使えば出力せずに幅が取得できます。
http://hsp.tv/play/pforum.php?mode=pastwch&num=2122
↑こちらのMizki_Fさんの物を関数にしたものです。

#module; 字幅=strwidth(変数名) #uselib "gdi32.dll" #func GetTextExtentPoint32 "GetTextExtentPoint32A" int,int,int,int #defcfunc strwidth var s_tBuf txtLen=strlen(s_tBuf) dim s_tSize,2 GetTextExtentPoint32 hdc,varptr(s_tBuf),txtLen,varptr(s_tSize) return s_tSize(0) #global



たぬき

リンク

2008/2/9(Sat) 19:45:48|NO.13486

皆さんご丁寧にありがとうございました。

早速やってみます。



D.K

リンク

2008/2/10(Sun) 13:31:54|NO.13493

解決した後でなんですが、以前暇つぶしで作ったものを発見したので投下。
用語等怪しいところがあるかもしれませんが見逃してくださいませ。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;以下のタグを読み出しもとの文字列(変数buf)に書き込むと ;各々の効果を発揮する。 ;因みに改行は通常と同じく\nで行う。 ; $ss…これ以降$se出現まで自動スクロール ; $se…スクロールエンド ; $cl…これ直後の数値(2桁の16進数RGB値)の色に文字色を変える ; 000000: 黒 :R値(赤) 0、G値(緑) 0、B値(青) 0 ; FFFFFF: 白 :R値(赤)255、G値(緑)255、B値(青)255 ; FF0000: 赤 :R値(赤)255、G値(緑) 0、B値(青) 0 ; FFFF00: 黄 :R値(赤)255、G値(緑)255、B値(青) 0 ; 00FF00: 緑 :R値(赤) 0、G値(緑)255、B値(青) 0 ; 00FFFF:水色:R値(赤) 0、G値(緑)255、B値(青)255 ; 0000FF: 青 :R値(赤) 0、G値(緑) 0、B値(青)255 ; FF00FF: 紫 :R値(赤)255、G値(緑) 0、B値(青)255 ; $os…これ以降$oe出現までウェイトなしでいっぺんに表示 ; $oe…ウェイトなし表示エンド ; $mw…これ直後の<>で括ったフレーム数(10進数)にメッセージフレーム数変更 ; $sw…これ直後の<>で括ったフレーム数(10進数)にスクロールフレーム数変更 ; $wt…これ直後の<>で括ったフレーム数(10進数)だけウェイトを入れる ; ※1フレームは16ミリ秒(await 16)としている ; $fn…これ直後の<>で括ったフォント名にフォントを変更 ; $fs…これ直後の<>で括った値(0〜31)にフォントのスタイルを変更 ; $$…半角の$を表示させたい時はこのように表記 ; ※$でも表示されることがあるがこの様に表記した方がバグは回避できるかと ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;以下使用した変数の説明。 ; buf:読み出しもとの文字列 ; slen:文字列サイズ ; fsz:フォントのサイズ。fsz/vsclが割り切れる方がいいと思われる。 ; fnm:フォント名。 ; fst:フォントのスタイル。 ; lnmx:1行に入る最大の文章の幅。単位ドット。 ; idx:今の読み出し元インデックス ; mwt:ウェイト(×16ms) ; tmp1,2:読み出しに使用 ; mesg:代入用文字列 ; mgch:表示するx座標(横) ; mgln:何行目に表示するのか(縦) ; vscl:スクロール速度(ドット単位) ; swt:スクロールの際のウェイト(×16ms) ; ; clrr:赤 ; clrg:緑 ; clrb:青 ; ascflg:自動スクロールフラグ ; oncflg:ウェイトなし表示フラグ ;注釈 ;変数=int( "$"+文字列 ) ; 16進数を10進数に変換する。 ; HSPは冒頭に$の付いた数値は16進数として処理するため、 ; 文字列の先頭に$をつけてintで数字に直すと16進数→10進数が可能。 #module;字幅取得関数strwidth定義。字幅ドット数=strwidth(変数名) #uselib "gdi32.dll" #func GetTextExtentPoint32 "GetTextExtentPoint32A" int,int,int,int #defcfunc strwidth var s_tBuf txtLen=strlen(s_tBuf) dim s_tSize,2 GetTextExtentPoint32 hdc,varptr(s_tBuf),txtLen,varptr(s_tSize) return s_tSize(0) #global *start screen 0,400,150,,0,0;画面初期化 screen 1,,,,0,200;本来はbuffer 1。見た目にわかりやすくするためscreenを使用。 buf="$ss$fs<1>$os$clFF0000HSP3.1$cl000000$oe$fs<0>では、$wt<20>HSP3.0までの資産を継承しながら、$wt<20>$fn<MS 明朝>より広い範囲で活用することができるよう、$wt<20>多くの機能を追加・修正しています。$se\n$wt<40>$ss$fn<MS Pゴシック>$mw<6>ここでは、$wt<20>$fs<1>$os$clFF0000HSP3.1$cl000000$oe$fs<0>で何が変わるのか。$wt<40>何が新しくなるのかを紹介しています。$se$sw<6>\n" slen=strlen(buf) fsz=12 fnm="MS ゴシック";フォント名。プロポーショナルフォントも可。 fst=0 lnmx=30*fsz/2 mwt=3 swt=2 vscl=2 clrr=0 clrg=0 clrb=0 mgch=0 mgln=0 ;フラグ初期化 ascflg=0 oncflg=0 ;フォント設定 font fnm,fsz,fst *main if (idx>=slen) : goto*last tmp1=peek(buf,idx);1byte目読み出し tmp2=peek(buf,idx+1);2byte目読み出し if tmp1=36{;文字列内に半角の$が出現した場合の処理 if tmp2=36{;$$は半角$へと変換 mesg=strmid(buf,idx,1);「$」を表示用文字列へ if mgch+strwidth(mesg)>lnmx {;文字数オーバーの場合 mgch=0;1文字目を読み出し先に mgln+=1;次の1行を読み出し先に if mgln=3{;3行目最後まで行っていたらスクロール gosub*scrl mgln=2;3行目を読み出し先に } } idx+=2;「$$」を読んだのでインデックスを2バイト先へ gosub*disp;文字表示ラベルへ mgch+=strwidth(mesg) goto*main }else{ switch strmid(buf,idx+1,2) case "cl";文字色変更 ;以下で16進数のデータを10進数へ変更 clrr = int( "$"+strmid(buf,idx+1+2,2) );r値 clrg = int( "$"+strmid(buf,idx+1+4,2) );g値 clrb = int( "$"+strmid(buf,idx+1+6,2) );b値 idx+=9 goto*main swbreak case "ss";自動スクロール開始 ascflg=1;フラグを立てる idx+=3 goto*main swbreak case "se";自動スクロール終了 ascflg=0;フラグをオフにする idx+=3 goto*main swbreak case "os";ウェイトなし表示開始 oncflg=1;フラグを立てる idx+=3 goto*main swbreak case "oe";ウェイトなし表示終了 oncflg=0;フラグをオフにする idx+=3 goto*main swbreak case "mw";メッセージフレーム数変更 repeat;「>」を探す if peek(buf,idx+1+2+1+cnt)=62{ mwt = int( strmid(buf,idx+1+2+1,cnt) ) idx+=5+strlen( strmid(buf,idx+1+2+1,cnt) ) break } loop goto*main swbreak case "sw";スクロールフレーム数変更 repeat;「>」を探す if peek(buf,idx+1+2+1+cnt)=62{ swt = int( strmid(buf,idx+1+2+1,cnt) ) idx+=5+strlen( strmid(buf,idx+1+2+1,cnt) ) break } loop goto*main swbreak case "wt";ウェイトを入れる repeat;「>」を探す if peek(buf,idx+1+2+1+cnt)=62{ await 16*int( strmid(buf,idx+1+2+1,cnt) ) idx+=5+strlen( strmid(buf,idx+1+2+1,cnt) ) break } loop goto*main swbreak case "fs";フォントスタイル変更 repeat;「>」を探す if peek(buf,idx+1+2+1+cnt)=62{ fst = int( strmid(buf,idx+1+2+1,cnt) ) idx+=5+strlen( strmid(buf,idx+1+2+1,cnt) ) break } loop font fnm,fsz,fst;フォント定義 goto*main swbreak case "fn";フォント名変更 repeat;「>」を探す if peek(buf,idx+1+2+1+cnt)=62{ fnm = strmid(buf,idx+1+2+1,cnt) break } loop idx+=5+strlen(fnm) font fnm,fsz,fst;フォント定義 goto*main swbreak swend } } if (tmp1 >= 129)&(tmp1 <= 159)|(tmp1 >= 224)&(tmp1 <= 252){ ;コードが全角文字の頭なら全角文字を表示 mesg=strmid(buf,idx,2);全角文字なので2バイト読み出し if mgch+strwidth(mesg)>lnmx {;文字数オーバーの場合 mgch=0;1文字目を読み出し先に mgln+=1;次の1行を読み出し先に if mgln=3{;3行目最後まで行っていたらスクロール gosub*scrl mgln=2;3行目を読み出し先に } } idx+=2 gosub*disp mgch+=strwidth(mesg) goto*main }else{ if (tmp1 == 13)&(tmp2 == 10){;改行コード mgch=0;1文字目を読み出し先に mgln+=1;次の1行を読み出し先に if mgln=3{;3行目最後まで行っていたらスクロール gosub*scrl mgln=2;3行目を読み出し先に } mesg="";改行の場合は文字表示の必要がないので空白 idx+=2 gosub*disp goto*main }else{;半角文字 mesg=strmid(buf,idx,1) if mgch+strwidth(mesg)>lnmx { mgch=0;1文字目を読み出し先に mgln+=1;次の1行を読み出し先 if mgln=3{ gosub*scrl mgln=2;3行目を読み出し先に } } idx+=1 gosub*disp mgch+=strwidth(mesg) goto*main } } *disp gsel 1;仮想画面に文字を出力する color clrr,clrg,clrb pos mgch,fsz*mgln mes mesg gsel 0;仮想画面の内容を実際の画面にコピー redraw 0;描画が終わるまで再描画オフ color 0,0,255 boxf 0,fsz*5-(fsz/2),lnmx-1,fsz*(5+3)+(fsz/2)-1 pos 0,fsz*5 gcopy 1,0,0,lnmx,fsz*3 if oncflg==0 {;ウェイトなし表示がオフの場合 redraw 1 await mwt*16 } gsel 1;return直後のstrwidthでウィンドウID1のフォントサイズを返すためにgsel return *scrl;スクロール gsel 0 if ascflg==0{;自動スクロール(ascflg==1)の場合はクリックを待たない redraw 0;▽マーク描画。ややこしく見えるが単に三角書いてるだけ。 color 255,255,255 line lnmx-1-8,fsz*(5+3)+(fsz/2)-1-4,lnmx-4,fsz*(5+3)+(fsz/2)-1-4 line lnmx-1-8+1,fsz*(5+3)+(fsz/2)-1-4+1,lnmx-4-1,fsz*(5+3)+(fsz/2)-1-4+1 line lnmx-1-8+2,fsz*(5+3)+(fsz/2)-1-4+2,lnmx-4-2,fsz*(5+3)+(fsz/2)-1-4+2 redraw 1 repeat;クリックしたらスクロール getkey key,1 if key&1 : break await 16 loop } repeat fsz/vscl,;スクロール redraw 0 ;青い部分描画 color 0,0,255 boxf 0,fsz*5-(fsz/2),lnmx-1,fsz*(5+3)+(fsz/2)-1 ;仮想画面からコピー pos 0,fsz*5 gcopy 1,0,cnt*vscl,lnmx,fsz*3 redraw 1 await swt*16 loop gsel 1;仮想画面書き換え pos 0,0 gcopy 1,0,fsz,lnmx,fsz*2 color 255,255,255 boxf 0,fsz*2,lnmx-1,fsz*3-1 return *last;単に最後まで表示したことを確認するためのラベル gsel 0 pos 0,fsz*10 mes "END" stop



たぬき

リンク

2008/2/10(Sun) 21:10:01|NO.13504

D.K様有難うございました。
とても参考になります。



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