|
|
2014/12/10(Wed) 14:49:28|NO.66375
buffer 1
color 255,255,0:boxf 0,0,100,100
color 0,255,0:boxf 0,0,50,50
gsel 0,1
*def
oncmd gosub *click, 0x0201
pos windowx,windowy:celput 1
await
stop
*click
oncmd gosub *def, 0x0202
repeat
color 255,255,255:boxf
pos mousex,mousey
celput 1
windowx=mousex
windowy=mousey
await
loop
このスクリプトは、マウスを押すと四角形が動くき、離すととまるスクリプトです。
このスクリプトの緑色の部分にマウスが来て、押したときのみ動くようにするにはどうすればよいですか?
|
|
2014/12/10(Wed) 15:54:27|NO.66376
buffer 1
color 255,255,0:boxf 0,0,100,100
color 0,255,0:boxf 0,0,50,50
gsel 0,1
*def
//変更...gosubを消した
oncmd *click, 0x0201
pos windowx,windowy:celput 1
await
//変更...ループを抜けるフラグを立てる
brf = 1
stop
*click
//変更...gosubを消した
oncmd *def, 0x0202
//変更重要...カーソル下の色を取得
pget mousex,mousey
//変更重要...色が緑か判定し、違えばstop
if (ginfo_r == 0 && ginfo_g == 255 && ginfo_b == 0) == 0:stop
repeat
//変更...ループを抜けるかどうかのフラグを降ろす
brf = 0
//変更...ちらつき防止
redraw 0
color 255,255,255:boxf
pos mousex,mousey
celput 1
//変更...ちらつき防止
redraw 1
windowx=mousex
windowy=mousey
await
//変更...ループを抜ける時が来たらbreak
if brf == 1:break
loop
//変更...念のためstop
stop
こうすればよいと思います。
そのスクリプトにはいくつか問題があったので、修正してしまいました。
問題点は、oncmd gosub を使っているのにreturnされておらず、
また、repeat-loop内からとんだ先でstopいるために、
一度ドラッグする間にsublevが2つ,looplevが1つずつ増えていくことでした。
|
|
2014/12/10(Wed) 16:49:15|NO.66378
有難う御座います。
やはり即席スクリプトだとバグが出ちゃいますね..
気を付けます。
|
|
2014/12/10(Wed) 16:55:32|NO.66379
tds12さんの方法は色で指定しているようです。
しかし■が複数になるとやりにくくなってしまいそうです。
座標指定するif式を知っていればご教授ください。
|
|
2014/12/10(Wed) 17:48:17|NO.66380
矩形の座標データを配列に保持してチェックするのはダメなのでしょうか。
|
|
2014/12/10(Wed) 19:07:25|NO.66387
指定座標(この場合緑の部分)にマウスがあるならば移動の
if式を教えてください。
|
|
2014/12/10(Wed) 21:52:19|NO.66398
座標でマウスでドラッグされているか、の操作は
・そのボタンの左上X座標<マウスのX座標
・そのボタンの左上Y座標<マウスのY座標
・そのボタンの右下X座標(そのボタンの左上X座標+ボタンのXサイズ>マウスのX座標
・そのボタンの右下Y座標(そのボタンの左上Y座標+ボタンのYサイズ>マウスのY座標
という4つの座標の判定でできます。(判定の範囲が四角形の場合)
buffer 1,200,25//ボタン
repeat 200
color cnt,50,50
line cnt,0,cnt,25
loop
//(ボタンのサイズは200*25です)
color 255,255,255
font "",23:pos 2,2
mes {"ボタン"}
;end
screen 0,640,480
bX=50:bY=50;buttonX,buttonY
;ボタンの左上座標
repeat
color 255,255,255:boxf
stick click,256
if mousex>bX & mousey>bY & mousex<bX+200 & mousey<bY+25:if click=256{
buttonclick=1
}else:buttonclick=0
if buttonclick=1{
bX=mouseX-(200/2)
bY=mouseY-(25/2)
}
pos bX,bY
gcopy 1,0,0,200,25
redraw 1:await 1000/60:redraw 0
loop
「ボタン」を「緑の部分」にすることを忘れていました;
もし言っている事が違っていたらすみません
|
|
2014/12/10(Wed) 22:29:23|NO.66400
有難う御座います!
|
|
2014/12/10(Wed) 23:04:41|NO.66403
最後に質問
男子中学生 さんのスクリプトを少し改造して、2つにしたときに、
2つのボタンが重なると入れ替わってしまいます。
スクリプト↓
buffer 1,200,25//ボタン
repeat 200
color cnt,50,50
line cnt,0,cnt,25
loop
//(ボタンのサイズは200*25です)
color 255,255,255
font "",23:pos 2,2
mes {"ボタン"}
;end
buffer 2,200,25//ボタン
repeat 200
color cnt,50,100
line cnt,0,cnt,25
loop
//(ボタンのサイズは200*25です)
color 255,255,255
font "",23:pos 2,2
mes {"ボタン"}
;end
screen 0,640,480
id="null"
bX=50:bY=50;buttonX,buttonY
;ボタンの左上座標
bX2=150:bY2=150
act=0
*def
repeat
color 255,255,255:boxf:color 0,0,0
oncmd gosub *okclick, 0x0201
if mousex>bX & mousey>bY & mousex<bX+200 & mousey<bY+25:if click=256{
buttonclick=1
id=1
else:buttonclick=0
if mousex>bX2 & mousey>bY2 & mousex<bX2+200 & mousey<bY2+25:if click=256{
buttonclick=1
id=2
else:buttonclick=0
if buttonclick=1{
act=1
oncmd gosub *upclick, 0x0202
if (id==1){
act=1
bX=mouseX-(200/2)
bY=mouseY-(25/2)
}if(id==2){
act=1
bX2=mouseX-(200/2)
bY2=mouseY-(25/2)
}
}
pos bX,bY
gcopy 1,0,0,200,25
pos bX2,bY2
gcopy 2,0,0,200,25
pos 0,0
mes id
redraw 1:await 1000/60:redraw 0
loop
stop
*okclick
click=256
return
stop
*upclick
click=0
act=0
goto *def
return
oncmdになっていたり、関係ない変数があるのはスルーで..
| |
|