Home › Category Archives › HSP

HSPで文字を縁取りする

久しぶりにHSP触りました。

txt2exoのプログラムで少しきになるところがあった(プレビューの縁取り)ので、そこをモジュール化してみました。

実際はもう少し違うプログラムですが、ここでは文字の縁取り部分だけです。

#module
#deffunc fuchimes str a , int n, int r , int g , int b
bold = n
color_r = r : color_g = g : color_b = b

;色範囲を0~255に制限
if color_r > 255 : color_r = 255
if color_g > 255 : color_g = 255
if color_b > 255 : color_b = 255
if color_r < 0 : color_r = 0
if color_g < 0 : color_g = 0
if color_b < 0 : color_b = 0

if bold < 0 : bold = 0

;現在のカラーコードを一時保存
ncolor_r = ginfo_r
ncolor_g = ginfo_g
ncolor_b = ginfo_b

redraw 0

;縁描画
color color_r,color_g,color_b
pos ginfo_cx-boid , ginfo_cy-boid
repeat bold*2+1 ;縦移動
	cposy_x = ginfo_cx : cposy_y = ginfo_cy
	repeat bold*2+1 ;横移動
		cposx_x = ginfo_cx : cposx_y = ginfo_cy
		mes a
		pos cposx_x+1 , cposx_y
	loop
	pos cposy_x , cposy_y+1
loop

;中心文字描画
color ncolor_r,ncolor_g,ncolor_b
pos cposy_x+bold , cposx_y-bold
mes a

redraw 1

return
#global

fuchimes "Hello World!",5,100,140,235

fuchimes “文字列”,縁の太さ,カラーコードR,カラーコードG,カラーコードB

文字色は現在の色設定、縁の色はfuchimes命令中で指定した色です。

まぁグーグル先生にかかればこんなの他にいくらでも見つかると思います。

多分これよりも処理が早いものもあると思いますが、頻繁に書き換えないのならこれでいい気もします。

あと、改行を含んでも大丈夫だと思います。

参考になれば。

あらかじめ色を指定(ここでは、255,255,128)しておくとこんな感じになる

HSPで文字に間隔を空けて表示する②

昨日の続きです。

HSP命令リファレンスを眺めていたらsplit命令を見つけたので、字間を空けて表示するモジュールを改良して改行に対応してみました。

#module ;字間で表示命令(改行対応版)
#deffunc jikanmes str a ,int b,int c
_a = a
split _a,"\n",d
cx = ginfo_cx
posx = cx : posy = ginfo_cy
foreach d
	sdim buf,strlen(d(cnt))*2+2
	cnvstow buf,d(cnt)
	repeat
		pos posx,posy
		tmp = wpeek(buf,cnt*2)
		if tmp = 0 : break
		mes cnvwtos(tmp)
		posx = posx+ginfo_mesx+b
	loop
	posx = cx : posy = posy+ginfo_mesy+c
loop
return
#global

jikanmes "あいうえお\nかきくけこ\nさしすせそ",20,30

第2引数が文字間隔、第3引数が行間隔となっています。

改行コードごとに配列に格納し、それぞれ前回と同じ処理をしています。

また、mes命令と同様、あらかじめpos指定しておけば、その点を基準に描画されます。

HSPで文字に間隔を空けて表示する

HSPで文字を表示するときに使うmes命令ですが、文字間隔を空けて表示するには少し不便ですね。

確かにtexoptとtexmesを使って表示することは可能なのですが、結構使いにくいので今回はその命令を作ってみます。

(実は字間設定プレビューでtexmesを使おうとしてテクスチャとかいろいろしてたら面倒くさくなった)

コードは以下のとおりです。

#module ;字間で表示命令
#deffunc jikanmes str a ,int b
sdim buf,strlen(a)*2+2
cnvstow buf,a
posx = ginfo_cx : posy = ginfo_cy
repeat
	pos posx,posy
	tmp = wpeek(buf,cnt*2)
	if tmp = 0 : break
	mes cnvwtos(tmp)
	posx = posx+ginfo_mesx+b
loop
return
#global

jikanmes "あいうえお",10

このようなコードでどうでしょうか。まあ言ってしまえば文字数カウンタの応用ですが。

この場合では、文字間隔が10pxになっていますが、第2引数の値によって間隔が変更できます。

改行コードが入った場合は対応できませんが、少し書き換えれば対応できるのではないでしょうか。

tmpが改行コードのときに分岐したり、改行ごとに配列に格納してループしたり…

私は特に複数行の必要がなかったので書きません。

一助になれば幸いです。

HSPで文字数を数える

HSPのstrlenってバイト数を返すので、日本語と英語が混じってたらうまく文字数数えられないよね。
ってことで、文字数を返す関数を作ってみた。

文字をUnicodeに変換して(全て2バイト文字になる)から1文字ずつ切り出していき、終わりになったらループを抜けるだけですが。

というのもtxt2exoで字間設定作ってる時に必要になったので、メモも兼ねて。

#module ;文字数を数えるモジュール
#defcfunc charalen str a

i=0 ;文字数カウンタ
;全部英字ならUnicode変換で2倍で最大。
sdim buf,strlen(a)*2+2

cnvstow buf,a
repeat
	tmp = wpeek(buf,cnt*2)
	if tmp = 0 : break
	i=i+1
loop

return i

#global

text="HSPでいろんな文字が混じってるときに文字数を返す関数だよ!"
mes charalen(text)

こんな感じで使ってみてください。strlen()と同じ感覚で使えると思います。

例では30と返ってきます。

なんかもっと効率よく書けそうだけど初心者なのでこれくらいしか書けないよ。もっと勉強しないと…

*6/29追記*
64字以上かつ全て英数字の場合にエラーになるのを修正。