〜 オブジェクト 〜
自前のボタンコントロール

プログラムの基本処理です。
ウィンドウ内のある領域をボタンに見立てて、エリア内をクリックすると処理するというものです。
通常のボタンのままだと、ツール系ソフトはまだしも、ゲーム系ソフトには使いにくいもの。
ボタンに画像を貼るという方法でもある程度はごまかせますが、
ココではボタンオブジェクト自体を使用せず、領域内クリックを常に監視する方法で実現しています。
内積を使えば複雑な形でも、エリア内がクリックされたかのたり判定が行えますが、
ココでは単純な矩形エリアで、4点をチェックするだけのサンプルになります。
尚、サンプルボタンの挙動として「指定エリア内がクリックされたらボタン押下処理」
「ボタン押下時でも指定エリアから一定距離以上離れたら押下を無効」
という処理を行っています。
もし、ロールオーバー(クリックはしてないがマウスがボタン上に来た)処理で
ボタン画像を変更させたり、説明文を表示させたりしたい場合は、
下記サンプルのボタンチェック手順を「クリックされたか」「クリックエリアが正しいか」から
「クリックエリアが正しいか」「クリックされたか」の順番に変更し、
エリアが正しいとなった場合に画像を変更する処理などを入れるようにすればOKです。
複数のボタンチェックを管理したい場合は、配列変数でボタン個数分チェックすると楽になりますが、
あまり数が多くなると、チェック処理だけで重たくなってしまうので程々にしましょう。
	
 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
	area = 100, 100, 300, 200

*check
	stick key, 256, 1
	if key & 256 {
		mx = mousex : my = mousey
		if mx >= area & (my >= area.1) & (mx < area.2) & (my < area.3) : gosub *click
		if mx + 50 < area | (my + 50 < area.1) | (mx - 50 > area.2) | (my - 50 > area.3) : clicked = 0
	} else {
		clicked = 0
	}
	if clicked = 0 : gosub *unclick
	wait 1
	goto *check

*unclick
	color 240 : boxf area, area.1, area.2, area.3
	clicked = 0
	// 指定領域がクリックされてない時の処理をココに書く
	return

*click
	color , 240 : boxf area, area.1, area.2, area.3
	clicked = 1
	// 指定領域がクリックされた時の処理をココに書く
	return
 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
	area = 100, 100, 300, 200 // ボタンエリアを定義

*check
	stick key, 256, 1
	if key & 256 {
		mx = mousex : my = mousey
		if mx >= area & my >= area.1 & mx < area.2 & my < area.3 : gosub *click
		if mx + 50 < area | my + 50 < area.1 | mx - 50 > area.2 | my - 50 > area.3 : clicked = 0
	} else {
		clicked = 0
	}
	if clicked = 0 : gosub *unclick
	wait 1
	goto *check

*unclick
	color 240 : boxf area, area.1, area.2, area.3
	clicked = 0
	// 指定領域がクリックされてない時の処理をココに書く
	return

*click
	color , 240 : boxf area, area.1, area.2, area.3
	clicked = 1
	// 指定領域がクリックされた時の処理をココに書く
	return