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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0614
make表示の切替について10解決


make

リンク

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



この記事に返信する


YRIN

リンク

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はもう少し具体的に書かないとよくわかりません。



make

リンク

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



make

リンク

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文を使えば一瞬で済む話かと。



make

リンク

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



ANTARES

リンク

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を指定すれば出来ると思います。



make

リンク

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がなくても枠は表示されます。



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