〜 グラフィック 〜
画像をドラッグ移動

HSPウィンドウ内の一部を、マウスによるドラッグ&ドロップで移動させるサンプルです。
下記のサンプルでは、ドラッグできる画像は1つしか設定できないので、
複数の画像を同時に読み込んで移動させる必要があるなら、各自でコレを参考に拡張してください。
	
gload 画像ファイル, X座標, Y座標
画像ファイル移動可能にする画像ファイルパスを指定。
X座標ウィンドウ内の表示する画像基点X座標を指定。
Y座標ウィンドウ内の表示する画像基点Y座標を指定。
gmove
[パラメータなし]現在のマウス座標へ移動させるだけのため、パラメータは必要ない。
 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 gload str, int, int, int
	mref file, 32 : mref id, 1 : mref x, 2 : mref y, 3
	mref bmscr, 67
	// 現ウィンドウ情報取得
	nx = winx : ny = winy
	actid = bmscr.18 // ウィンドウID
	// サイズ取得用の仮読み
	buffer id
	picload file 
	wx = winx : wy = winy
	// 画像と現ウィンドウ幅の大きい方のサイズでバッファ作成
	buffer id, (wx > nx) * wx + ((wx <= nx) * nx), wy + ny
	gcopy actid, , , nx, ny
	picload file, 1, , ny
	gsel actid
	px = x : py = y // 画像配置初期座標
	tmpid = id      // 一時バッファID取得
	pos px, py : gcopy tmpid, , ny, wx, wy
	return
 
#deffunc gmove
	x = mousex : y = mousey
	wait 1
	// クリックされていないなら終了
	stick key, 256, 1
	if (key & 256) = 0 : return
	// 対象ウィンドウではないなら終了
	ginfo 1
	if prmx != actid : return
	// 画像範囲外なら終了
	if px > x | (px + wx < x) | (py > y) | (py + wy < y) : return
	x = mousex - x : y = mousey - y
	// マウスが動かされているなら画像移動
	if x | y {
		pos 0, 0 : gcopy tmpid, , , nx, ny   // 一旦画像を消去
		px += x : py += y
		pos px, py : gcopy tmpid, , ny, wx, wy // 移動先に画像を表示
	}
	return
#global

	// 適当な背景(クリアされてないかのチェック用)
	picload "sample/hspdx/hspdx.bmp"
	// ウィンドウID2に画像をロード
	gload "sample/ssaver/Aruface.bmp", 2, 50, 50
	// ループでドラッグ移動を監視
	repeat
		redraw 0
		gmove // ドラッグ移動チェック(ループ側にウェイトは不要)
		redraw 1
	loop
gload 画像ファイル, X座標, Y座標
画像ファイル移動可能にする画像ファイルパスを指定。
X座標ウィンドウ内の表示する画像基点X座標を指定。
Y座標ウィンドウ内の表示する画像基点Y座標を指定。
gmove
[パラメータなし]現在のマウス座標へ移動させるだけのため、パラメータは必要ない。
 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
#module
#deffunc gload str file, int id, int x, int y
	// 現ウィンドウ情報取得
	nx = ginfo_winx : ny = ginfo_winy
	actid = ginfo_act
	// サイズ取得用の仮読み
	buffer id
	picload file 
	wx = ginfo_winx : wy = ginfo_winy
	// 画像と現ウィンドウ幅の大きい方のサイズでバッファ作成
	buffer id, (wx > nx) * wx + (wx <= nx) * nx, wy + ny
	gcopy actid, , , nx, ny
	pos 0, ny : picload file, 1
	gsel actid
	px = x : py = y // 画像配置初期座標
	tmpid = id      // 一時バッファID取得
	pos px, py : gcopy tmpid, , ny, wx, wy
	return
 
#deffunc gmove local x, local y, local key
	x = mousex : y = mousey
	wait 1
	// クリックされていないなら終了
	stick key, 256, 1
	if (key & 256) = 0 : return
	// 対象ウィンドウではないなら終了
	if ginfo(2) != actid : return
	// 画像範囲外なら終了
	if px > x | px + wx < x | py > y | py + wy < y : return
	x = mousex - x : y = mousey - y
	// マウスが動かされているなら画像移動
	if x | y {
		pos 0, 0 : gcopy tmpid, , , nx, ny   // 一旦画像を消去
		px += x : py += y
		pos px, py : gcopy tmpid, , ny, wx, wy // 移動先に画像を表示
	}
	return
#global

	// 適当な背景(クリアされてないかのチェック用)
	picload "sample/hspdx/hspdx.bmp"
	// ウィンドウID2に画像をロード
	gload "sample/game/face.bmp", 2, 50, 50
	// ループでドラッグ移動を監視
	repeat
		redraw 0
		gmove // ドラッグ移動チェック(ループ側にウェイトは不要)
		redraw 1
	loop