|
 |
|
2008/6/14(Sat) 23:03:11|NO.16722
>その1
上2列の動作は希望通りに動かせているのですが10x2列のスクリプトが
うまくまとめられません、どうすればいいのでしょうか?
>その2
1度でも中段■の中にマウスをいれると座標の外でも
クリックがきいて枠が移動してしまうので、きかないようにしたいです
>その3
最下層のboxf中にあるmesですが一定時間がたつと点滅するので点滅しないようにしたいです
>その4
最下層boxfを赤くきりかえるとmesがきえてしまうのできえないようにしたいです
>その5
最下層boxfの真中と右をきくようにしたです
以上、よろしくお願いします(左上のmes表示は確認の為です)
#define blue 0,0,255
#define red 255,0,0
#define gray 155,155,155
#define BUTTON_MAX 3 ;ボタンの数
#define BUTTON_W 100 ;ボタンの幅
#define BUTTON_H 30 ;ボタンの高さ
dim width_x,10
width_x= 90,130,170,210,250,290,330,370,410,450
dim button_x,BUTTON_MAX
button_x=10,270,530 ;下ボタンのX座標
dim button_y,BUTTON_MAX
button_y=440,440,440 ;下ボタンのY座標
screen 0,640,480 : color : boxf
buffer 1
color red : boxf
buffer 2
color red : boxf 3,3,31,31
color blue
boxf 1,1,34,2 : boxf 1,32,34,34 ;枠の上下
boxf 1,2,2,32 : boxf 32,2,34,32 ;枠の左右
buffer 3
color : boxf 0,0,394,34
repeat 10
color 255,0,0 : boxf 2+40*cnt,2,32+40*cnt,32;枠をけす
loop
buffer 4
color gray : boxf ;下のメインボタン
gsel 0
repeat 10
pos width_x.cnt,170 : gcopy 1,0,0,30,30;1列目をならべる
pos width_x.cnt,210 : gcopy 1,0,0,30,30;2列目をならべる
loop
pos 448,168 : gcopy 2,0,0,34,34;黒枠を右端に表示,1列目
pos 448,208 : gcopy 2,0,0,34,34;黒枠を右端に表示,2列目
*graybutton
repeat BUTTON_MAX
pos button_x.cnt,button_y.cnt :gcopy 4,BUTTON_W*cnt,0,BUTTON_W,BUTTON_H;下ボタンを表示
loop
pos 12,444:color:mes"test" : pos 272,444:mes"aa" : pos 532,444:mes"bb"
*main
await 17
gosub*mousecheck
;カーソルが四角の中にある場合は明転、ない場合は暗転
if(mousex>=10)&(mousey>=440)&(mousex<=110)&(mousey<=470):color red:boxf 10,440,110,470:else:goto*graybutton
;下の2行をいれるとうまく動かない
; if(mousex>=270)&(mousey>=440)&(mousex<=370)&(mousey<=470):color red:boxf 270,440,370,470:else:goto*graybutton
; if(mousex>=530)&(mousey>=440)&(mousex<=630)&(mousey<=470):color red:boxf 530,440,630,470:else:goto*graybutton
mouse_leftpush=0
stick mouse_leftpush
if mouse_leftpush!256 : goto *main ;左ボタンがおされていない
;以下をいれても中と右が反応しない
; number=-1 ;ボタンの番号
; repeat BUTTON_MAX
; if mousex < button_x.cnt : continue
; if mousex > (button_x.cnt+BUTTON_W) : continue
; if mousey < button_y.cnt : continue
; if mousey > (button_y.cnt+BUTTON_H) : continue
; number=cnt ;押されたボタンをnumberに
; break
; await 17
; loop
; if number==-1 : goto*graybutton ;ボタンの上ではない
if number==0 : dialog "左ボタンが押されました"
; if number==1 : dialog "中ボタンが押されました"
; if number==2 : dialog "右ボタンが押されました"
goto*graybutton
;黒枠のカーソルをきりかえる,元の位置にあった黒枠は消す
*mousecheck
if(mousex>=90)&(mousex<=120)&(mousey>=170)&(mousey<=200):onclick *inkey_a
;1列目左端2〜9番目は省略してます
if(mousex>=450)&(mousex<=480)&(mousey>=170)&(mousey<=200):onclick *inkey_j
if(mousex>=90)&(mousex<=120)&(mousey>=210)&(mousey<=240):onclick *inkey_k
;2列目左端2〜9番目は省略してます
if(mousex>=450)&(mousex<=480)&(mousey>=210)&(mousey<=240):onclick *inkey_t
await 17
return
; goto*graybutton
*inkey_a
pos 88,168 : gcopy 3,0,0,394,34;1列目右端
pos 88,168 :gcopy 2,0,0,34,34;1列目左端
pos 0,0 :mes "1列目左端を押した"
goto *main
stop
*inkey_j
pos 88,168 : gcopy 3,0,0,394,34;1列目左端
pos 448,168 : gcopy 2,0,0,34,34;1列目右端
pos 0,0 :mes "1列目右端を押した"
goto *main
stop
*inkey_k
pos 88,208 : gcopy 3,0,0,394,34;2列目右端
pos 88,208 : gcopy 2,0,0,34,34;2列目左端
pos 0,0 :mes "2列目左端を押した"
goto *main
stop
*inkey_t
pos 88,208 : gcopy 3,0,0,394,34;2列目右端
pos 448,208 : gcopy 2,0,0,34,34;2列目左端
pos 0,0 :mes "2列目右端を押した"
goto *main
stop

| |
|
2008/6/15(Sun) 04:01:29|NO.16739
その4
66行目の
> if number==0 : dialog "左ボタンが押されました"
が実行された後に、左下のボタンの文字列が表示されるのが原因です。
*graybutton で実行してる描画の処理の部分をサブルーチンにして、
goto *graybutton
と書いているところを
goto *main
とかいて、*mainの先頭で
gosub *graybutton
と書けばいいかと。
その3
*graybuttonのところでredraw命令を使えばいいと思います。
それと余計なお世話かもしれませんが、再描画の必要が無いときまで再描画を実行してるのは、
少し効率が悪いかもしれません。
その4の答えとやや矛盾しますが、再描画の必要が発生したときだけ、
gosub *graybutton
を実行すればいいと思います。
その5
45行目
> if(mousex>=10)&(mousey>=440)&(mousex<=110)&(mousey<=470)
が当てはまらないときは、それより下の行は絶対に実行されません。
なぜなら、これが当てはまらないときはelseの部分で
>goto*graybutton
とやっているからです。
else : if 〜〜〜
とやれば簡単です。
他の質問なのですが、もう少し具体的に書いてください。
列とか段とか、日本語ならではのあいまいな部分をきっちり定めない事には・・・。
ちなみに質問その1ですが、もしソースコードが長くなってしまって、それを簡潔に書けないのかという
悩みでしたら、全文を載せてくれた方が答えやすいと思います。
それと質問その2はもう少し具体的に書かないとよくわかりません。
|
|
2008/6/15(Sun) 16:18:40|NO.16752
すみません、全然解決しないので質問を変更させて頂きます
例として通常はgrayのboxfでマウスがx=10、y=440の位置にあった場合redのboxfになり
左クリックするとダイアログがでて
位置がx=10、y=440の外にあった場合grayのboxfに戻るというものを作りたいです
以下のコードですとマウスがboxf内ですとmesがぼやけてしまいますし
マウスを外の位置に移動しても色がgrayに戻りません
以上、よろしくお願いします
#define BUTTON_MAX 3 ;ボタンの数
#define BUTTON_W 100 ;ボタンの幅
#define BUTTON_H 30 ;ボタンの高さ
*main
;----------------変数の初期化-------------------
dim button_x,BUTTON_MAX
dim button_y,BUTTON_MAX
button_x=10,270,530 ;ボタンの左上のX座標
button_y=440,440,440 ;ボタンの左上のY座標
;----------------画面の準備-------------------
buffer 2
color 155,155,155 : boxf
gsel 0
*view
repeat BUTTON_MAX
pos button_x.cnt,button_y.cnt
gcopy 2,BUTTON_W*cnt,0,BUTTON_W,BUTTON_H ;ボタンを表示
loop
pos 10,440 :mes "test" : pos 270,440 : mes "aa" : pos 530,440 : mes "bb"
;----------------入力待ち-------------------
*kurikaesi
if(mousex>=10)&(mousey>=440)&(mousex<=110)&(mousey<=470):gosub*redbox
; if(mousex>=270)&(mousey>=440)&(mousex<=370)&(mousey<=470):gosub*?
; if(mousex>=530)&(mousey>=440)&(mousex<=630)&(mousey<=470):gosub*?
await 17
click_stat=0
stick click_stat
if click_stat!256 : goto *kurikaesi ;左ボタンが押されていない
;----------------どこでクリックされたか判定-------------------
number=-1 ;何番目のボタンか
repeat BUTTON_MAX
if mousex < button_x.cnt : continue
if mousex > (button_x.cnt+BUTTON_W) : continue
if mousey < button_y.cnt : continue
if mousey > (button_y.cnt+BUTTON_H) : continue
number=cnt ;押されたボタンをnumberに
break
loop
if number==-1 : goto *kurikaesi ;ボタンの上ではない
if number==0 : dialog "赤ボタンが押されました"
if number==1 : dialog "青ボタンが押されました"
if number==2 : dialog "緑ボタンが押されました"
goto *view
*redbox
color 255 : boxf 10,440,110,470
pos 10,440 :color: mes "test"
await 17
return

| |
|
2008/6/15(Sun) 17:18:39|NO.16754
こんなんでどうでしょうか。
#define BUTTON_MAX 3 ;ボタンの数
#define BUTTON_W 100 ;ボタンの幅
#define BUTTON_H 30 ;ボタンの高さ
*main
;----------------変数の初期化-------------------
dim button_x,BUTTON_MAX
dim button_y,BUTTON_MAX
button_x=10,270,530 ;ボタンの左上のX座標
button_y=440,440,440 ;ボタンの左上のY座標
;----------------画面の準備-------------------
buffer 2 : color 155,155,155 : boxf
gsel 0
;----------------表示文字の配列-------------------
sdim message,5,3
message="red","blue","green"
*view
repeat BUTTON_MAX
pos button_x.cnt,button_y.cnt
gcopy 2,BUTTON_W*cnt,0,BUTTON_W,BUTTON_H ;ボタンを表示
color 0,0,0 : pos button_x.cnt,button_y.cnt : mes message.cnt
loop
znumber=-1
*kurikaesi
number=-1
;----------------キー情報-------------------
stick click_stat : mx=mousex : my=mousey
;----------------ボタンの上にマウスがあるか?----------
repeat 3
if (button_x.cnt<=mx)&(button_x.cnt+BUTTON_W>mx) {
if (button_y.cnt<=my)&(button_y.cnt+BUTTON_H>my) {
number=cnt}}
loop
if znumber!number : gosub *colorchange
znumber=number
;----------------クリックされたら-------------------
if click_stat&256 : if number!-1 : gosub *clickbox
await 17
goto *kurikaesi
;----------------ボタンの色変更-------------------
*colorchange
if znumber=-1 : color (number=0)*255,(number=2)*255,(number=1)*255{
boxf button_x.number,button_y.number,button_x.number+BUTTON_W-1,button_y.number+BUTTON_H-1
color 0,0,0 : pos button_x.number,button_y.number : mes message.number}
if znumber!-1 : pos button_x.znumber,button_y.znumber : gcopy 2,BUTTON_W*znumber,0,BUTTON_W,BUTTON_H{
color 0,0,0 : pos button_x.znumber,button_y.znumber : mes message.znumber}
return
;----------------ダイアログ表示-------------------
*clickbox
switch number
case 0 : dialog "赤ボタンが押されました" : swbreak
case 1 : dialog "青ボタンが押されました" : swbreak
case 2 : dialog "緑ボタンが押されました" : swbreak
swend
return

| |
|
2008/6/15(Sun) 19:17:00|NO.16758
下の方は解決しました、通りすがりさん、ありがとうございます
残りの質問ですが
マウスを1度でも■の座標の中にいれるとマウスを■の座標の外に移動して
左クリックしても実行されて枠が移動してしまいます
■の座標の中にある時だけ左クリックが実行され枠が移動するようにしたいです
あと以下の書き方だと*mousecheck以下の10x2列のスクリプトが長々となってしまい
うまくまとめられません
どうすれば効率のいい書き方ができるんでしょうか?
#define blue 0,0,255
#define red 255,0,0
dim width_x,10
width_x= 90,130,170,210,250,290,330,370,410,450
screen 0,640,480 : color : boxf
buffer 1
color red : boxf
buffer 2
color red : boxf 3,3,31,31
color blue
boxf 1,1,34,2 : boxf 1,32,34,34 ;枠の上下
boxf 1,2,2,32 : boxf 32,2,34,32 ;枠の左右
buffer 3
color : boxf 0,0,394,34
repeat 10
color red : boxf 2+40*cnt,2,32+40*cnt,32;枠をけす
loop
gsel 0
repeat 10
pos width_x.cnt,170 : gcopy 1,0,0,30,30;1列目をならべる
pos width_x.cnt,210 : gcopy 1,0,0,30,30;2列目をならべる
loop
pos 448,168 : gcopy 2,0,0,34,34;黒枠を右端に表示,1列目
pos 448,208 : gcopy 2,0,0,34,34;黒枠を右端に表示,2列目
;黒枠のカーソルをきりかえる,元の位置にあった黒枠は消す
*mousecheck
if(mousex>=90)&(mousex<=120)&(mousey>=170)&(mousey<=200):onclick *inkey_a
;1列目左端2〜9番目は省略してます
if(mousex>=450)&(mousex<=480)&(mousey>=170)&(mousey<=200):onclick *inkey_j
if(mousex>=90)&(mousex<=120)&(mousey>=210)&(mousey<=240):onclick *inkey_k
;2列目左端2〜9番目は省略してます
if(mousex>=450)&(mousex<=480)&(mousey>=210)&(mousey<=240):onclick *inkey_t
await 17
goto*mousecheck
*inkey_a
pos 88,168 : gcopy 3,0,0,394,34;1列目右端
pos 88,168 :gcopy 2,0,0,34,34;1列目左端
pos 0,0 :mes "1列目左端を押した"
goto *mousecheck
stop
*inkey_j
pos 88,168 : gcopy 3,0,0,394,34;1列目左端
pos 448,168 : gcopy 2,0,0,34,34;1列目右端
pos 0,0 :mes "1列目右端を押した"
goto *mousecheck
stop
*inkey_k
pos 88,208 : gcopy 3,0,0,394,34;2列目右端
pos 88,208 : gcopy 2,0,0,34,34;2列目左端
pos 0,0 :mes "2列目左端を押した"
goto *mousecheck
stop
*inkey_t
pos 88,208 : gcopy 3,0,0,394,34;2列目右端
pos 448,208 : gcopy 2,0,0,34,34;2列目左端
pos 0,0 :mes "2列目右端を押した"
goto *mousecheck
stop

| |
|
2008/6/15(Sun) 19:41:39|NO.16759
私が投稿したスクリプトはお読みになりましたか?
それと同様、マウスが■の上にある時のみクリック判定を行えばいいのでは?
■の配置も等間隔で単純ですし、repeat〜loop文を使えば一瞬で済む話かと。
|
|
2008/6/16(Mon) 01:33:17|NO.16766
一応できました
希望通りに動いてますがgcopy2とか無駄に多いですしgosubも1つにしたいです
これでいいんでしょうか?
#define blue 0,0,255
#define red 255,0,0
#define BUTTON_MAX 10 ;ボタンの数
#define BUTTON_W 30 ;ボタンの幅
#define BUTTON_H 30 ;ボタンの高さ
;----------------変数の初期化-------------------
dim button_x,BUTTON_MAX
button_x =90,130,170,210,250,290,330,370,410,450 ;ボタンのX座標
button_y =170 ;ボタンの上Y座標
button_by=210 ;ボタンの下Y座標
*main
screen 0,640,480 : color : boxf
buffer 1
color red : boxf
buffer 2
color red : boxf 3,3,31,31
color blue
boxf 1,1,34,2 : boxf 1,32,34,34 ;枠の上下
boxf 1,2,2,32 : boxf 32,2,34,32 ;枠の左右
buffer 3
color : boxf 0,0,394,34
repeat BUTTON_MAX
color red : boxf 2+40*cnt,2,32+40*cnt,32 ;枠をけす板
loop
gsel 0
;----------------表示文字の配列-------------------
repeat BUTTON_MAX
pos button_x.cnt,button_y
gcopy 1,0,0,BUTTON_W,BUTTON_H ;1列目をならべる
pos button_x.cnt,button_by
gcopy 1,0,0,BUTTON_W,BUTTON_H ;2列目をならべる
loop
pos 448,168 : gcopy 2,0,0,34,34;黒枠を右端に表示,1列目
pos 448,208 : gcopy 2,0,0,34,34;黒枠を右端に表示,2列目
*kurikaesi
number=-1
number_b=-1
;----------------キー情報-------------------
stick click_stat : mx=mousex : my=mousey
;----------------ボタンの上にマウスがあるか?----------
repeat BUTTON_MAX
if (button_x.cnt<=mx)&(button_x.cnt+BUTTON_W>mx) {
if (button_y<=my)&(button_y+BUTTON_H>my) {
number=cnt}}
loop
repeat BUTTON_MAX
if (button_x.cnt<=mx)&(button_x.cnt+BUTTON_W>mx) {
if (button_by<=my)&(button_by+BUTTON_H>my) {
number_b=cnt}}
loop
;----------------クリックされたら-------------------
if click_stat&256 : if number!-1 : gosub *clickbox
if click_stat&256 : if number_b!-1 : gosub *clickbox_b
await 17
goto *kurikaesi
;----------------ダイアログ表示-------------------
*clickbox
pos 88,168 : gcopy 3,0,0,394,34 ;枠を全部けす
switch number
case 0 :pos 88,168 : gcopy 2,0,0,34,34 : swbreak
case 1 :pos 128,168 : gcopy 2,0,0,34,34 : swbreak
case 2 :pos 168,168 : gcopy 2,0,0,34,34 : swbreak
case 3 :pos 208,168 : gcopy 2,0,0,34,34 : swbreak
case 4 :pos 248,168 : gcopy 2,0,0,34,34 : swbreak
case 5 :pos 288,168 : gcopy 2,0,0,34,34 : swbreak
case 6 :pos 328,168 : gcopy 2,0,0,34,34 : swbreak
case 7 :pos 368,168 : gcopy 2,0,0,34,34 : swbreak
case 8 :pos 408,168 : gcopy 2,0,0,34,34 : swbreak
case 9 :pos 448,168 : gcopy 2,0,0,34,34 : swbreak
swend
return
*clickbox_b
pos 88,208 : gcopy 3,0,0,394,34 ;枠を全部けす
switch number_b
case 0 :pos 88,208 : gcopy 2,0,0,34,34 : swbreak
case 1 :pos 128,208 : gcopy 2,0,0,34,34 : swbreak
case 2 :pos 168,208 : gcopy 2,0,0,34,34 : swbreak
case 3 :pos 208,208 : gcopy 2,0,0,34,34 : swbreak
case 4 :pos 248,208 : gcopy 2,0,0,34,34 : swbreak
case 5 :pos 288,208 : gcopy 2,0,0,34,34 : swbreak
case 6 :pos 328,208 : gcopy 2,0,0,34,34 : swbreak
case 7 :pos 368,208 : gcopy 2,0,0,34,34 : swbreak
case 8 :pos 408,208 : gcopy 2,0,0,34,34 : swbreak
case 9 :pos 448,208 : gcopy 2,0,0,34,34 : swbreak
swend
return

| |
|
2008/6/16(Mon) 01:53:17|NO.16768
>switch number
>case 0 :pos 88,168 : gcopy 2,0,0,34,34 : swbreak
>case 1 :pos 128,168 : gcopy 2,0,0,34,34 : swbreak
>case 2 :pos 168,168 : gcopy 2,0,0,34,34 : swbreak
>case 3 :pos 208,168 : gcopy 2,0,0,34,34 : swbreak
>case 4 :pos 248,168 : gcopy 2,0,0,34,34 : swbreak
>case 5 :pos 288,168 : gcopy 2,0,0,34,34 : swbreak
>case 6 :pos 328,168 : gcopy 2,0,0,34,34 : swbreak
>case 7 :pos 368,168 : gcopy 2,0,0,34,34 : swbreak
>case 8 :pos 408,168 : gcopy 2,0,0,34,34 : swbreak
>case 9 :pos 448,168 : gcopy 2,0,0,34,34 : swbreak
>swend
pos number*40+88,168 : gcopy 2,0,0,34,34
|
|
2008/6/16(Mon) 02:17:02|NO.16769
gcopy 2,0,0,34,34はreturn直前か直後に1回でよいと思います。
case 0は態々pos指定しなくても、2行上で指定しているので無駄な気がします。
クリック後の飛び先が2つありますが、1つにしてposのY軸だけ切り替えた方が良いかも
飛んで直ぐに上からか下からか判別して、以降posのY軸に168か208を指定すれば出来ると思います。
|
|
2008/6/16(Mon) 22:02:27|NO.16794
case0の上2行目は枠をけす為のものでcase0を指定しないと枠は表示されないはずですけど?
一応ご報告までに
>ANTARESさん
いつもありがとうございます、助かりました
ご返答頂いた他の皆様もありがとうございました
|
|
2008/6/16(Mon) 22:41:21|NO.16795
2行上で既にpos指定しているのでcase 0 で同じposを指定しても無駄になるだけっていう意味です><
case 0 はposがなくても枠は表示されます。
|
|