〜 グラフィック 〜
句読点は更にウェイトを掛け文字毎に表示する

現在の歌詞箇所がわかりやすいように、予め表示させた歌詞を別の文字色に塗り替えていくというのを
カラオケ等でよく見かけますが、この現象を実現させてみましょう。
HSP3からはモジュール命令となりましたが、HSP2までのtext命令を利用することで、
文字色を変更していくことは簡単に実現できますね。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
	sdim txt, 80, 8
	txt.0 = "ゆっくりテキストを表示させてみるテストです。"
	txt.1 = "HSP3では書き方が若干変わっていますので、"
	txt.2 = "実行はHSP2で行ってください。"
	txt.3 = "最初から最後まで一定の速度で色が変わっていくので、"
	txt.4 = "例えば句読点位置等で別途ウェイトを設けたい場合は、"
	txt.5 = "文章を分割して間にウェイトをはさみます。(今回は改行毎にウェイト)"
	txt.6 = "ただ、ウェイト前後のテキストが改行していない場合、"
	txt.7 = "テキスト位置の制御を行う必要もあるので面倒です。"
	pos 50, 50 : repeat 8 : mes txt.cnt : loop
	color 255
	pos 50, 50
	text 50
	repeat 8 : mes txt.cnt : wait 100 : loop
	color
	mes "- 完 -"
	stop
簡単に実現できるものの、上のスクリプト内に書いた様に、 句読点や改行時に通常とは別の長さのウェイトを設けたい場合に面倒となります。 下記に示すサンプルは、対象テキストをモジュール命令に渡すだけで、 内容を解析して自動でウェイトを設定するというものです。 解析して一文字毎に処理する必要があるため、文字の判別モジュールwordchkを流用していますので、 wordchk命令・関数についての説明は、コチラをご覧ください。 尚、等幅フォントの場合は、通常のmes命令やprint命令の描画位置と重ねて表示させられますが、 標準フォント等のプロポーショナルフォントだと、描画位置がズレてしまいます。 サンプルのように、ウェイト時間を指定せず、textmes命令を実行すれば 通常のmes命令による表示同様に一括して表示させることができますので、 プロポーショナルフォントで重ねたい場合は、一旦全部を表示させた後に重ねて表示させるようにしましょう。

wordchk 対象変数, 位置
対象変数判別したい文字列の入った変数を指定する。
statに-1(範囲外)、0(半角)、1(全角)のいずれかがセットされる。
位置指定変数の位置をバイト単位で指定する。

textmes 対象変数, 通常ウェイト, 読点ウェイト, 句点ウェイト
対象変数ウェイトを設けて表示する文字列型変数を指定する。
通常ウェイト通常のテキスト部分のウェイト時間(10ミリ秒単位)を指定する。
読点ウェイト読点部分のウェイト時間(10ミリ秒単位)を指定する。
句点ウェイト句点部分のウェイト時間(10ミリ秒単位)を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#module
#deffunc wordchk val, int
	mref txt, 24 : mref ichi, 1
	mref stt, 64
	peek chk, txt, ichi
	if chk = 0 : stt = -1 : return
	if (chk > 128 & (chk < 160)) | (chk > 223) : stt = 1 : else : stt = 0
	return

#deffunc textmes val, int, int, int
	mref string, 24 : mref speed1, 1 : mref speed2, 2 : mref speed3, 3
	mref bmscr, 67
	strlen len, string
	cx = csrx : cx.1 = cx : cy = csry
	repeat len
		sp = 0
		wordchk string, cnt
		strmid tmps, string, cnt, stat + 1
		// 1バイト
		if stat = 0 {
			// 改行
			if chk = 13 {
			  peek chk, string, cnt + 1
			  cx = cx.1 : cy += bmscr.32 // 文字の高さ分増やす
			  continue cnt + (chk = 10) + 1
			}
			if tmps = "," : sp = speed2 // 読点
			if tmps = "." : sp = speed3 // 句点
		// 2バイト
		} else {
			if tmps = "、" : sp = speed2 // 読点
			if tmps = "。" : sp = speed3 // 句点
		}
		pos cx, cy : mes tmps
		cx += bmscr.32 / (2 - stat) // 文字幅(高さ÷2)を取得しカレントポジションの変更
		memset tmps, , 4
		if speed1 + sp > 0 : wait speed1 + sp
		continue cnt + stat + 1
	loop
	pos cx.1, cy + bmscr.32
	return
#global

	sdim txt, 256
	txt = {"
			    ゆっくりテキストを表示させてみるテストです。
			    読点(テン)では通常以上のウェイトを掛け、
			    句点(マル)ではさらに、さらにウェイトを掛けています。
			    補足ですが、半角のカンマ「,」も読点として、
			    ピリオド「.」を句点として同じ様にウェイトを掛けています。
			  "}
	pos 50, 50 : textmes txt            // 徐々にではなく、ウェイトを掛けず一括表示する
	color 255
	pos 50, 50 : textmes txt, 5, 30, 70 // 通常:50ms 読点:350ms 句点:750ms
	color
	mes "- 完 -"
	stop

結果 = wordchk(対象変数, 位置)
結果-1(範囲外)、0(半角)、1(全角)のいずれかがセットされる。
対象変数判別したい文字列の入った変数を指定する。
位置指定変数の位置をバイト単位で指定する。

textmes 対象変数, 通常ウェイト, 読点ウェイト, 句点ウェイト
対象変数ウェイトを設けて表示する文字列型変数を指定する。
通常ウェイト通常のテキスト部分のウェイト時間(10ミリ秒単位)を指定する。
読点ウェイト読点部分のウェイト時間(10ミリ秒単位)を指定する。
句点ウェイト句点部分のウェイト時間(10ミリ秒単位)を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#module
#defcfunc wordchk var s, int ichi
	if ichi < 0 : return -1
	chk = peek(s, ichi)
	if (chk > 128 & chk < 160) | chk > 223 : return 1
	if chk = 0 : return -1 : else : return 0

#deffunc textmes var string, int speed1, int speed2, int speed3, local cx, local cy, local temps, local sp, local bmscr
	mref bmscr, 67
	cx = ginfo_cx : cx.1 = cx : cy = ginfo_cy
	repeat strlen(string)
		sp = 0
		tmps = strmid(string, cnt, wordchk(string, cnt) + 1)
		// 1バイト
		if wordchk(string, cnt) = 0 {
			// 改行
			if chk = 13 {
			  chk = peek(string, cnt + 1)
			  cx = cx.1 : cy += bmscr.32 // 文字の高さ分増やす
			  continue cnt + (chk = 10) + 1
			}
			if tmps = "," : sp = speed2 // 読点
			if tmps = "." : sp = speed3 // 句点
		// 2バイト
		} else {
			if tmps = "、" : sp = speed2 // 読点
			if tmps = "。" : sp = speed3 // 句点
		}
		pos cx, cy : mes tmps
		cx += bmscr.32 / (2 - wordchk(string, cnt)) // 文字幅(高さ÷2)を取得しカレントポジションの変更
		memset tmps, , 4
		wait speed1 + sp
		continue cnt + wordchk(string, cnt) + 1
	loop
	pos cx.1, cy + bmscr.32
	return
#global

	sdim txt, 256
	txt = {"
			    ゆっくりテキストを表示させてみるテストです。
			    読点(テン)では通常以上のウェイトを掛け、
			    句点(マル)ではさらに、さらにウェイトを掛けています。
			    補足ですが、半角のカンマ「,」も読点として、
			    ピリオド「.」を句点として同じ様にウェイトを掛けています。
			  "}
	pos 50, 50 : textmes txt            // 徐々にではなく、ウェイトを掛けず一括表示する
	color 255
	pos 50, 50 : textmes txt, 5, 30, 70 // 通常:50ms 読点:350ms 句点:750ms
	color
	mes "- 完 -"