お絵かきの基礎1で、RGBそれぞれの輝度を256段階で設定するcolor命令を説明しましたが、
赤緑青黒白黄紫水色等の原色以外(特に中間色)が人間にとって指定し辛い表現となっていますので、
今回はRGB指定とは別に、HSV表現というものを紹介しましょう。
HSVとはRGBと同じく、それぞれが英単語の頭文字となっており、
Hは色相(Hue)、Sは彩度(Saturation)、Vは明度(Value of Brightness)の3要素を表しています。
何故、「明度」はBrightnessのBではなく、「値」を示すValueのVなのか?
一説によると、BはBlueのBとカブるからVとなったとか。
その程度の理由なので、「フォト●ョップ」や「イ●ストレーター」等では
HSVと同じものだけど呼び名がHSBとなってたりすることもあります。
で、このHSV(HSB)色指定はHSP3から標準命令で指定可能となったもので、
HSP2以前では標準付属の拡張命令で指定するものでした。その説明はコチラでしています。
上記リンク先の設定方法と同じですが、指定方法とその説明は次の通りです。
hsvcolor 色相, 彩度, 明度
色相色の種類(色合い)を指定する。
彩度色の濃さ、淡さを指定する。
明度色の明るさ、暗さを指定する。
第1パラメータの色相は、赤・青・緑など、どんな色にするのか0〜191で指定します。
0は赤、64は緑、128は青、そして191に近づくにつれて赤くなります。
コレだとRGB指定の方がやりやすそうですが、
もう少し細かく考えるとRGB指定の方が色の移り変わり指定が難しくなってきます。
つまり、色の薄さや明るさを変えずに、虹色の様な赤から緑、緑から青への色の移り変わりを指定するのが、
RGB指定だとややこしい式または処理分岐をしなければならないということです。
HSVでは、色の移り変わりを色相値の変化だけで綺麗に変えていけるので楽チンです。
第2パラメータの彩度は、鮮やかさを決めるもので0〜255の256段階で指定し、
0に近いほど淡く(白く)、255に近いほど原色となっていきます。
第3パラメータの明度は、色の明るさを0〜255の256段階で指定し、
0に近いほど暗く(黒く)、255に近いほど色がハッキリ見えるようになります。
さて、RGB指定ではRGBの各輝度が256段階だったので約1600万色を表現できました。
一方のHSV指定では彩度と明度は同じ256段階ですが色相は192パターンしかありませんので
表現できる色の種類は1200万色ほどで、約400万種類ほど少なくなっています。
その色の持つ鮮やかさ・明るさのグラデーション、虹色の様な色の移り変わりを行うには
HSVの方が容易と思われますので、色の指定方法は臨機応変してみてはいかがでしょうか。
 1
 2
 3
 4
 5
 6
 7
 8
 9
	dim point, 4
	redraw 0
	repeat ginfo_winx + ginfo_winy
		hsvcolor cnt / 3, 255, 255 // 色の明るさや鮮やかさは変更せずに色合いだけを変化していく
		if cnt < ginfo_winx : point.0++ : else : point.1++
		if cnt < ginfo_winy : point.3++ : else : point.2++
		line point.0, point.1, point.2, point.3
	loop
	redraw 1
続いて、予め決めておいた色の中から使用するパレット(インデクス)カラーを扱う命令を紹介します。
パレットカラーとは、必要な色だけに通し番号を付けて、各色をRGBではなく番号で管理することによって、
1色3バイト未満を実現し、画像容量を小さくするというものであり、
HSPでは1色を1バイトで管理し、パレット(カラールックアップテーブル)は256種類扱えます。
palcolor パレット番号
パレット番号使用するパレットの通し番号を指定する。
第1パラメータに0〜255いずれかのパレットコードを指定することで、カレントカラーをその色にします。
各パレットには、初めから色が設定されているのですが、
HSP2とHSP3ではデフォルトのパレット内容が異なっており、
HSP3は黒〜白(間は灰)色の256段階グラデーションとなっています(パレットモードウィンドウ時)し、
フルカラーウィンドウでのパレットは、20色分しか設定されていません。
各パレットに色を設定する方法は次の命令で紹介するとして、今回は設定されている色の取り出しだけです。
各パレット色一覧を確認するには、次のサンプルスクリプトを実行してみてください。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
	// パレットモードウィンドウ
	screen 0, , , 1
	// パレット一覧読み込む
	repeat 256
		palcolor cnt
		boxf cnt \ 16 * 40, cnt / 16 * 30, (cnt \ 16 + 1) * 40, (cnt / 16 + 1) * 30
	loop
	// 区切り線を描画
	palcolor 0
	repeat 15, 1
		line cnt * 40, -1, cnt * 40, 480
		line -1, cnt * 30, 640, cnt * 30
	loop
この章は短いですが、最後に紹介するのは、特定のパレットに色を設定する命令です。
palette パレット番号, 赤輝度, 緑輝度, 青輝度, 更新フラグ
パレット番号更新するパレットコード番号を指定する。
赤輝度更新するパレットの赤輝度を指定する。
緑輝度更新するパレットの緑輝度を指定する。
青輝度更新するパレットの青輝度を指定する。
更新フラグ変更したパレットを画面に更新する(=1)か否(=0)かを指定する。
第1パラメータのパレット番号はpalcolor命令で読み出すパレットのコード番号と同じもので、
第2〜4パラメータで指定したRGBとを新たに結び付けます。
第5パラメータを0設定または省略すると、パレットに結びつけるだけで更新はまだ行いません。
1(非ゼロ)を指定することで、指定パレットと同じパレットの色が更新されるつくりになっているのは、
パレット全体が更新されると、画面が更新されるのに時間が掛かるためだそうです。
複数パレットを同じタイミングで更新する場合は、
最後のパレットを更新し終える時に更新フラグをONにするのがよいとされていますが、
更新フラグをONにしてpalette命令を処理しても画面が更新されませんね?
更新したHSPウィンドウの上に別のウィンドウを被せて再度HSPウィンドウを表示する、
または、更新したHSPウィンドウをディスプレイ外に移動させることで色の更新となります。
HSPの命令を用いて即時に反映させるにはredraw命令を使用しましょう。
更新させた色を反映させたい場合に上記処理を行わなければならないのは、
複数回実行する必要がある場合に、処理速度の低下につながってしまうから、
処理単位を必要最小限に留める形を取ったのでしょう。
 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
	screen 0, , , 1
	// パレット一覧読み込む
	repeat 256
		palcolor cnt
		boxf cnt \ 32 * 20, cnt / 32 * 20, (cnt \ 32 + 1) * 20, (cnt / 32 + 1) * 20
	loop
	// 区切り線を描画
	palcolor 0
	repeat 31, 1
		line cnt * 20, -1, cnt * 20, 160
		if cnt \ 4 = 3 : line -1, (cnt / 4 + 1) * 20, 640, (cnt / 4 + 1) * 20
	loop

*main
	wait 1
	stick key.1, 768, 1
	if key.1 & 256 {
		if mousey < 160 : gosub *change : else : gosub *draw
	} else {
		key.0 = 0
		if mousey < 160 & (key.1 & 512) ! 0 : gosub *load
	}
	x = mousex : y = mousey
	goto *main

*change
	no = mousex / 20 + (mousey / 20 * 32)
	palcolor no
	return

*load
	no = mousex / 20 + (mousey / 20 * 32)
	dialog "", 32
	if stat {
		palette no, ginfo_r, ginfo_g, ginfo_b, 1 // 選択パレット変更
		redraw 1
	}
	return

*draw
	line mousex, mousey, x, y
	return