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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1025
CONbutton goto ~のような命令の登録4未解決


CON

リンク

2012/10/25(Thu) 05:44:25|NO.50209

今までモジュールを作った経験がなかったので
試しに一度挑戦してみたのですが…
昨日の夜から始めて、いろいろ苦戦したあげく夜が明けてしました;
ソースはこんな感じです。

#module #include "user32.as" #define WM_LBUTTONDOWN 0x0201 #define WM_LBUTTONUP 0x0202 #deffunc ResetObj int max oncmd gosub *LBUTTONDOWN, 0x0201 oncmd gosub *LBUTTONUP, 0x0202 //ボタンの一時描画用バッファを用意したいけれど //これでいいのかな buffer_id=ginfo_newid buffer buffer_id //いろんな変数の初期化 id=-1 ldim label, 0 dim size_data,max,6 : dim button_name,max : dim button_style,max,10 dim font_name,max : dim font_style,max,2 : dim font_color,max,3 gsel 0 return #deffunc _ImgStyle int buf_id,int x1,int y1,int x2,int y2,int x3,int y3,int p1,int p2 bufID=buf_id dx1=x1 : dy1=y1 : dx2=x2 : dy2=y2 : dx3=x3 : dy3=y3 copy_mode=p1:blend=p2 return #deffunc SetButton str name, int px, int py, var lb, int go id++ //ボタンのスタイルを設定 button_style(id,0)=bufID button_style(id,1)=dx1:button_style(id,2)=dy1:button_style(id,3)=dx2 button_style(id,4)=dy2:button_style(id,5)=dx3:button_style(id,6)=dy3 button_style(id,7)=copy_mode : button_style(id,8)=blend //フォントの設定 ;http://lhsp.s206.xrea.com/hsp_string.html#8 ;こちらのページを参考にしました ; HSPのBMSCR構造体 mref BMSCR, 67 font_style(id,0) = (-BMSCR.49) font_style(id,1)+= (BMSCR.53/700)*1 font_style(id,1)+= peek(BMSCR.54, 0)*2 font_style(id,1)+= peek(BMSCR.54, 1)*4 font_style(id,1)+= peek(BMSCR.54, 2)*8 font_style(id,1)+= (peek(BMSCR.55, 2)/4)*16 ; フォント名 sdim lfFaceName getstr lfFaceName, BMSCR, $E0 font_name.id=lfFaceName //フォントカラーの設定 font_color(id,0)=ginfo_r font_color(id,1)=ginfo_g font_color(id,2)=ginfo_b //サイズ・座標・その他の設定 size_data(id,0)=ginfo_cx: size_data(id,1)=ginfo_cy size_data(id,2)=px : size_data(id,3)=py size_data(id,4)=go : size_data(id,5)=ginfo_sel button_name.id=name :label.id=lb //gmodeの設定 if copy_mode!0{ blend_id=ginfo_newid buffer blend_id,px,py gcopy hwnd,size_data(id,0),size_data(id,1),px,py } button_style(id,9)=blend_id RedrawObj id return id #defcfunc OnMouse int obj_id, int mx, int my xPos=size_data(obj_id,0) : yPos=size_data(obj_id,1) xSize=size_data(obj_id,2) : ySize=size_data(obj_id,3) if mx>xPos & mx<xPos+xSize & my>=yPos & my<=yPos+ySize:return 0 return -1 #defcfunc OnMouseID int mx, int my foreach label OnID=(id-cnt) if OnMouse(OnID,mx,my)!-1:break OnID=-1 await 0 loop return OnID #deffunc _MouseOver int p1 //マウスが動いていない場合は更新しない if (mousex!mx)&(mousey!my) | p1!0{ redraw 0 mx=mousex:my=mousey OnID=OnMouseID(mx,my) foreach label if cnt=OnID:mode=p1:else:mode=0 RedrawObj cnt,mode await 0 loop redraw 1 } return #deffunc RedrawObj int obj_id, int draw_mode if redraw_mode!-1{ px=size_data(obj_id,2) :py=size_data(obj_id,3) buffer buffer_id,px,py font font_name.obj_id,font_style(obj_id,0),font_style(obj_id,1) name=button_name.obj_id:mes name a="\n":c = 0:a2=strlen(a) repeat d=instr(name, c, a) kai=cnt+1 if d = -1 : break c = c + d + a2 loop mesx=ginfo(14):mesy=ginfo(15)*kai buf_id=button_style(obj_id,0):pos 0,0 switch draw_mode case 0 if buf_id!-1{ gcopy buf_id,button_style(obj_id,1),button_style(obj_id,2),px,py }else:color 0,128,128:boxf 0,0,px,py swbreak case 1 if buf_id!-1{ gcopy buf_id,button_style(obj_id,5),button_style(obj_id,6),px,py }else:color 0,128,255:boxf 0,0,px,py swbreak case 2 if buf_id!-1{ gcopy buf_id,button_style(obj_id,3),button_style(obj_id,4),px,py }else:color 0,255,255:boxf 0,0,px,py swbreak swend color font_color(obj_id,0),font_color(obj_id,1),font_color(obj_id,2) pos (px-mesx)/2,(py-mesy)/2:mes name gsel size_data(obj_id,5) pos size_data(obj_id,0),size_data(obj_id,1) if button_style(obj_id,7)!0:gcopy button_style(obj_id,9),0,0,px,py gmode button_style(obj_id,7),px,py,button_style(obj_id,8) gcopy buffer_id,0,0,px,py } return *LBUTTONDOWN mxPos = lParam & 0xFFFF // カーソルx座標 myPos = (lParam >> 16) & 0xFFFF // カーソルy座標 OnID=OnMouseID(mxPos,myPos) if OnID!-1:_MouseOver 2 redraw_mode=-1 return *LBUTTONUP mxPos = lParam & 0xFFFF // カーソルx座標 myPos = (lParam >> 16) & 0xFFFF // カーソルy座標 OnID=OnMouseID(mxPos,myPos) if OnID!-1{ if size_data(OnID,4)=0:goto label(OnID) if size_data(OnID,4)=1:gosub label(OnID) } redraw_mode=0:_MouseOver 1 return OnID #global //パラメータの省略に対応させる #define global ImgButton_goto(%1="",%2=64,%3=24,%4)lb_temp@=%4:SetButton %1,%2,%3,lb_temp@,0 #define global ImgButton_gosub(%1="",%2=64,%3=24,%4)lb_temp@=%4:SetButton %1,%2,%3,lb_temp@,1 #define MouseOver(%1=1) _MouseOver %1 #define ImgStyle(%1=-1,%2=0,%3=0,%4=0,%5=0,%6=0,%7=0,%8=0,%9=0) _ImgStyle %1,%2,%3,%4,%5,%6,%7,%8,%9 //---------------------------------------------------------------------------------------------------// randomize screen 1 title "こんな感じのバッファを用意します" x=180:y=40 //Classic風ボタンの描画 color:boxf 0,0,x-1,y-1:boxf 0,y,x-1,y*2-1 color $ff,$ff,$ff:boxf 0,0,x-2,y-2 color $c0,$c0,$c0:boxf 1,y+1,x-1,y*2-1 color $80,$80,$80:boxf 1,1,x-2,y-2:boxf 1,y+1,x-2,y*2-2 color $c0,$c0,$c0:boxf 1,1,x-3,y-3:boxf 2,y+2,x-2,y*2-2 y=25 //メニュー用ボタンの描画 color:boxf x,0,x*2,y color 0,255,255:boxf x,y,x*2,y*2 color 0,128,255:boxf x,y*2,x*2,y*3 screen 0, 640, 480 ResetObj 99 color:boxf color 255,255,255 pos 640-300,480-320:mes "重なってもちゃんと判別します" line 640-320,480-320,640,480-320 line 640-320,480-320,640-320,480 ImgStyle font "",11 repeat 20 x=636-300+rnd(240) y=480-300+rnd(280) pos x,y ImgButton_gosub "ミニボタン"+cnt,64,20,*mini loop font "",40 pos 600,0 ImgButton_gosub "×",40,40,*exit font "",16 pos 300 ,20 ImgButton_gosub "一応\n改行も\nできます",100,100,*kai pos 0,300 setu={"画像ボタンモジュールです わりと使いやすいように作りました 自分用に作ったので汚いです…"} ImgButton_gosub setu,300,150,*setumei pos 450 ,20:color 255,0,0 ImgButton_gosub "colorで色も\n指定できます",100,100,*iro pos 0,0:color ImgStyle 1,0,0,0,40,0,0 ImgButton_gosub "WinClassic風ボタン",180,40,*win ImgStyle 1,0,0,0,40,0,0,3,128 pos 0,40 ImgButton_gosub "gmodeの機能も使えます",180,40,*gm color 255,255,255 ImgStyle 1,180,0,180,25,180,50 repeat 5 pos 0,80+25*cnt ImgButton_gosub "メニュー"+(cnt+1),180,25,*menu loop pos 0,240:color ImgStyle 1,361,0,361,0,361,0 font "HG正楷書体-PRO", 18,16 ImgButton_gosub "fontでフォントを指定できます",300,60,*fn repeat MouseOver wait 5 loop stop *setumei dialog "ImgStyleのパラメータを省略すると代わりのものが描画されます" return *fn dialog "フォントに" return *gm dialog "半透明にしてみました" return *kai dialog "全行センターぞろえではないですけど;" return *mini dialog "ミニボタン"+stat return *win dialog "boxfで描いた擬似ボタンです" return *menu dialog "メニュー"+(stat-25) return *iro dialog "おまけです" return *exit end

画像ボタンを扱うモジュールです。
長々しいですが、命令はシンプルです。

今は頭がくらくらなので家に帰ったら修正したものをもう一度貼ります。

実際に使う命令
ResetObj p1…ボタン郡の初期化です。
p1に作るボタンの最大個数(0~99)を入れます。

ImgStyle p1,p2,p3,p4,p5,p6,p7,p8,p9…ボタンの見た目の設定です。
p1〜p7まではobjimageと同じです。p8,p9はgmodeのp1とp4です。

ImgButton_goto name,p1,p2,*label…ボタンです。(goto版)
p1,p2にボタンのxyサイズを入れて、nameには文字を入れられます。

ImgButton_gosub name,p1,p2,*label…ボタンです。(gosub版)

MouseOver p1…マウスオーバーを有効にするためのものです。
通常はp1を省いてメインループの中から呼び出して使います。

あとはposでボタンの位置,colorで文字の色,fontで文字のフォントを設定できます。

そこでみなさんにお聞きしたいのが
通常のbuttonはbutton goto〜のように命令2連続で書かれていますよね。

モジュール内でこのような命令はどのように記述すればいいですか。

今はImgButton_gotoとImgButton_gosubに分けているので問題ありませんが
もし、出来るのであれば教えていたたきたいです。

もしかしたら初歩的な質問かもしれませんがよろしくお願いします。

あと、モジュール内で改善すべき点がありましたらご教示お願いします。



この記事に返信する


KA

リンク

2012/10/25(Thu) 10:35:44|NO.50213

確かに長ったらしすぎて、結局どこを聞きたいのか分かりません。
余分な部分は削って、質問したい所だけのスクリプトにして下さい。

また「一晩で作った」物の改善点を聞く前に、自分で「数日」かけて
ゆっくり見直して下さい。



CON

リンク

2012/10/25(Thu) 13:54:10|NO.50214

>>KAさん
自分でも分かりにくいスクリプトなので改善点は出来ればでいいのです。
すみません。

僕がお聞きしたいのは本題にもあるように「button goto "",*label」のような
間にgotoをはさむことの出来る命令を作る方法はあるのでしょうか。

ということです。
分かりににくくてすみません…



レノス

リンク

2012/10/26(Fri) 18:03:38|NO.50246

間にある goto は文法的に特殊なので作れません。



@key

リンク

2012/10/26(Fri) 19:23:31|NO.50249

ごり押すなら、#defineで引数付きの命令に置き換えるよう定義すればいいと思う



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