HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1210
nepisat画面上の四角形の一部の座標にマウスが来たときのみ反応するようにする。8解決


nepisat

リンク

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
このスクリプトは、マウスを押すと四角形が動くき、離すととまるスクリプトです。

このスクリプトの緑色の部分にマウスが来て、押したときのみ動くようにするにはどうすればよいですか?



この記事に返信する


tds12

リンク

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つずつ増えていくことでした。



nepisat

リンク

2014/12/10(Wed) 16:49:15|NO.66378

有難う御座います。
やはり即席スクリプトだとバグが出ちゃいますね..
気を付けます。



nepisat

リンク

2014/12/10(Wed) 16:55:32|NO.66379

tds12さんの方法は色で指定しているようです。
しかし■が複数になるとやりにくくなってしまいそうです。

座標指定するif式を知っていればご教授ください。



cats

リンク

2014/12/10(Wed) 17:48:17|NO.66380

矩形の座標データを配列に保持してチェックするのはダメなのでしょうか。



nepisat

リンク

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

「ボタン」を「緑の部分」にすることを忘れていました;

もし言っている事が違っていたらすみません



nepisat

リンク

2014/12/10(Wed) 22:29:23|NO.66400

有難う御座います!



nepisat

リンク

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になっていたり、関係ない変数があるのはスルーで..



ONION software Copyright 1997-2023(c) All rights reserved.