〜 グラフィック 〜
任意の領域内をブラッシング

HSPウィンドウ内の画像(色データ)を一括処理するには、VRAM操作を行うと便利です。
VRAM操作は初心者にとって敷居の高いものとなっていますが、
VRAMの説明と扱い方についてコチラを参照の上、下記モジュールを参考に組んでみてください。
	

brushinit 赤輝度, 緑輝度, 青輝度, 左上X, 左上Y, 右下X, 右下Y
赤輝度描画する色の赤輝度を指定する。
緑輝度描画する色の緑輝度を指定する。
青輝度描画する色の青輝度を指定する。
左上X描画可能エリア左上のX座標を指定する。
左上Y描画可能エリア左上のY座標を指定する。
右下X描画可能エリア右下のX座標を指定する。
右下Y描画可能エリア右下のY座標を指定する。

brush 粒子数, サイズ, 中心X, 中心Y
粒子数描画する点の最大数を指定する。
サイズ描画サイズを指定する。
中心X描画する中心X座標を指定する。
中心Y描画する中心Y座標を指定する。

 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
57
58
#module
#deffunc brushinit int, int, int, int, int, int, int
	mref r, 0 : mref g, 1 : mref b, 2 : mref minx, 3 : mref miny, 4 : mref maxx, 5 : mref maxy, 6
	mref vram, 66
	area = minx, maxx, miny, maxy
	col = b, g, r
	return

#deffunc brush int, int, int, int
	mref drops, 0
	mref size, 1
	mref x, 2
	mref y, 3
	ginfo 6 // ウィンドウ初期サイズ取得
	repeat drops
		// 指定座標を中心に描画座標の決定
		rnd rx , size : rx = x + rx - (size / 2)
		rnd ry , size : ry = y + ry - (size / 2)
		// 描画領域外は無視する
		if (area.0 > rx) | (area.1 < rx) | (area.2 > ry) | (area.3 < ry) : continue
		addr = (prmy - 1 - ry) * (prmx * 3 + 3 & 0xFFFFFFFC) + (rx * 3)
		repeat 3
			poke vram , addr + cnt , col.cnt // R:2 G:1 B:0
		loop
	loop
	redraw 1 // 描画を反映
	return
#global

	dim key, 2
	randomize
	rnd back.0, 256 : rnd back.1, 256 : rnd back.2, 256
	box = 50, 50, winx - 50, winy - 50
	color back.0, back.1, back.2 : boxf box.0, box.1, box.2, box.3
	repeat
		stick key, 768, 1
		switch key
		case 256
			// 前回左クリック以外なら初期化
			if key.1 != 256 {
				key.1 = 256
				brushinit 255, 0, 0, box.0, box.1, box.2, box.3
			}
			// 前景色で描画
			brush 300, 80, mousex, mousey
			swbreak
		case 512
			// 前回右クリック以外なら初期化
			if key.1 != 512 {
				key.1 = 512
				brushinit back.0, back.1, back.2, box.0, box.1, box.2, box.3
			}
			// 背景色で描画
			brush 300, 80, mousex, mousey
			swbreak
		swend
		wait 1
	loop

brushinit 赤輝度, 緑輝度, 青輝度, 左上X, 左上Y, 右下X, 右下Y
赤輝度描画する色の赤輝度を指定する。
緑輝度描画する色の緑輝度を指定する。
青輝度描画する色の青輝度を指定する。
左上X描画可能エリア左上のX座標を指定する。
左上Y描画可能エリア左上のY座標を指定する。
右下X描画可能エリア右下のX座標を指定する。
右下Y描画可能エリア右下のY座標を指定する。

brush 粒子数, サイズ, 中心X, 中心Y
粒子数描画する点の最大数を指定する。
サイズ描画サイズを指定する。
中心X描画する中心X座標を指定する。
中心Y描画する中心Y座標を指定する。

 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
#module
#deffunc brushinit int r, int g, int b, int minx, int miny, int maxx, int maxy
	mref vram, 66
	area = minx, maxx, miny, maxy
	col = b, g, r
	return

#deffunc brush int drops, int size, int x, int y
	repeat drops
		// 指定座標を中心に描画座標の決定
		rx = x + rnd(size) - (size / 2)
		ry = y + rnd(size) - (size / 2)
		// 描画領域外は無視する
		if (area.0 > rx) | (area.1 < rx) | (area.2 > ry) | (area.3 < ry) : continue
		addr = (ginfo_sy - 1 - ry) * (ginfo_sx * 3 + 3 & 0xFFFFFFFC) + rx * 3
		repeat 3
			poke vram , addr + cnt , col.cnt // R:2 G:1 B:0
		loop
	loop
	redraw 1 // 描画を反映
	return
#global

	dim key, 2
	randomize
	back = rnd(256), rnd(256), rnd(256)
	box = 50, 50, ginfo_winx - 50, ginfo_winy - 50
	color back.0, back.1, back.2 : boxf box.0, box.1, box.2, box.3
	repeat
		stick key, 768, 1
		switch key
		case 256
			// 前回左クリック以外なら初期化
			if key.1 != 256 {
				key.1 = 256
				brushinit 255, 0, 0, box.0, box.1, box.2, box.3
			}
			// 前景色で描画
			brush 300, 80, mousex, mousey
			swbreak
		case 512
			// 前回右クリック以外なら初期化
			if key.1 != 512 {
				key.1 = 512
				brushinit back.0, back.1, back.2, box.0, box.1, box.2, box.3
			}
			// 背景色で描画
			brush 300, 80, mousex, mousey
			swbreak
		swend
		wait 1
	loop