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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0510
暇人hsplet対応命令の組み合わせでcelload、celput、celdiv の機能を実装するモジュール6解決


暇人

リンク

2012/5/10(Thu) 21:47:38|NO.46576

celload、celput、celdiv、wpeek、lpeek機能をhsplet上でも使えるようにするモジュール
使い方は全て標準命令と同じ実行結果の差異も無いかな?
回転倍率指定時も標準命令と見た目同じに見える・・・

	
#module "mod_cel" #undef wpeek #undef lpeek #undef gmode #undef celload #undef celdiv #undef celput //wpeek,lpeek 使い方は標準と変らない #define global wpeek(%1,%2=0) _wpeek %1,(%2) #define global lpeek(%1,%2=0) _lpeek %1,(%2) //gmode 使い方は標準と変らない(celput用に細工してあるだけ) #define global gmode(%1=_gmode_p1@mod_cel,%2=_gmode_p2@mod_cel,%3=_gmode_p3@mod_cel,%4=_gmode_p4@mod_cel) \ bid_bak@mod_cel=-1:_gmode_p1@mod_cel=%1:_gmode_p2@mod_cel=%2:_gmode_p3@mod_cel=%3:_gmode_p4@mod_cel=%4:gmode@hsp %1,%2,%3,%4 //celload 使い方は標準命令と変らない(ウィンドウIDに-1又は未指定の場合は1000番以上が使われる) #define global celload(%1,%2=-1,%3=0) _celload %1,(%2),(%3) //celdiv 使い方は標準命令と変らない(分割総数数がstatに返る) #define global celdiv(%1,%2=-1,%3=-1,%4=0,%5=0) _celdiv (%1),(%2),(%3),(%4),(%5) //celput 使い方は標準命令と変らない(存在しないNoを指定するとバッファオーバーでエラーになることがある(使う側で回避できるからモジュール側でするのはやめた)) #define global celput(%1,%2=0,%3=1.0,%4=1.0,%5=0.0) _celput (%1),(%2),(%3),(%4),(%5) //get_celdivx(ウィンドウID)、get_celdivy(ウィンドウID)  分割された数取得X、Y #define global get_celdivx(%1) cel_divx@mod_cel((%1)) #define global get_celdivy(%1) cel_divy@mod_cel((%1)) #define global get_celtotadiv(%1) cel_totadiv@mod_cel((%1)) //分割総数 #defcfunc _wpeek var p1,int p2 memcpy w,p1,2,0,p2 //上下がHSP上とは逆になるからmemcpyで代用 return w #defcfunc _lpeek var p1,int p2 memcpy l,p1,4,0,p2 return l #deffunc _celload str fn,int bid,int bm wid_bak=ginfo(3) if celload_f = 0 {celload_f=1:sdim cel_index:ddim cel_rcx,1:ddim cel_rcy,1:ddim cel_rcy,1:ddim cel_sqrt,1:ddim cel_r,1} if bid<0{_bid=1000+idcnt:idcnt+1}else{_bid=bid}//ginfo(25)未使用のウィンドウIDを取得が使えないので指定なしの時は1000番以上を使用 buffer _bid,,,bm picload fn cel_index(_bid)="" _celdiv _bid,-1,-1,0,0 gsel wid_bak return _bid #deffunc _celdiv int bid,int _dx,int _dy,int cx,int cy wid_bak(1)=ginfo(3) gsel bid if _dx<=0 {dx=ginfo(12)}else{dx=_dx} if _dy<=0 {dy=ginfo(13)}else{dy=_dy} cel_dx(bid)=dx//分割サイズ cel_dy(bid)=dy cel_cx(bid)=cx//通常の中心 cel_cy(bid)=cy cel_rcx(bid)=(double(cel_cx(bid)-double(cel_dx(bid))/2))//表示倍率指定用の中心 cel_rcy(bid)=(double(cel_cy(bid)-double(cel_dy(bid))/2)) cel_r(bid)=atan(cel_rcy(bid),cel_rcx(bid))//回転用の中心角度 cel_sqrt(bid)=sqrt(cel_rcx(bid)*cel_rcx(bid)+cel_rcy(bid)*cel_rcy(bid))//回転倍率指定用の中心 cel_divx(bid)=(ginfo(12)/dx) cel_divy(bid)=(ginfo(13)/dy) cel_totadiv(bid)=cel_divx(bid)*cel_divy(bid) repeat cel_totadiv(bid) //memexpandの代わり cel_index(bid)+" " loop repeat cel_divy(bid) divy=cnt repeat cel_divx(bid) x=cnt*dx y=(divy*dy) memcpy cel_index(bid),x,2,(divy*cel_divx(bid)+cnt)*4 ,0 //コピー元の左上X座標保存 memcpy cel_index(bid),y,2,(divy*cel_divx(bid)+cnt)*4+2,0//コピー元の左上Y座標保存 loop loop gsel wid_bak(1) return cel_totadiv(bid) #deffunc _celput int bid,int no,double ratx,double raty,double r cpx=ginfo(22) cpy=ginfo(23) x=wpeek(cel_index(bid),no*4) y=wpeek(cel_index(bid),no*4+2) if r ! 0.0 {//回転倍率用 px=ratx*cel_sqrt(bid)*cos(cel_r(bid)+r) py=raty*cel_sqrt(bid)*sin(cel_r(bid)+r) pos cpx-px,cpy-py if bid_bak ! bid {bid_bak = bid:gmode@hsp _gmode_p1,cel_dx(bid),cel_dy(bid),_gmode_p4}//無駄にgmodeしないように対策 grotate bid,x,y,r,ratx*(cel_dx(bid)),raty*(cel_dy(bid)) pos cpx+ratx*cel_dx(bid),cpy }else{//倍率用 if (ratx ! 1.0) or (raty ! 1.0) { pos cpx-ratx*cel_rcx(bid),cpy-raty*cel_rcy(bid) if bid_bak ! bid {bid_bak = bid:gmode@hsp _gmode_p1,cel_dx(bid),cel_dy(bid),_gmode_p4} grotate bid,x,y,r,ratx*(cel_dx(bid)),raty*(cel_dy(bid)) pos cpx+ratx*cel_dx(bid),cpy }else{//通常用 pos cpx-cel_cx(bid),cpy-cel_cy(bid) gcopy bid,x,y,cel_dx(bid),cel_dy(bid) pos cpx+cel_dx(bid),cpy } } return #global

hsplet上で使えるように組んでて嵌った問題

wpeek()が上下逆になる

変数の型を返す vartype(p1) が対応表で○になってるがvartype("str")は成功するけど
vartype(変数)は必ず0が返る

変数が文字列型で初期化されてなかったら
初期化するとしてたからエラーも出ず
全然問題が発見できなかった・・・



この記事に返信する


暇人

リンク

2012/5/10(Thu) 22:40:38|NO.46580

あ、もう一つあった

新規命令で登録した命令を使うときに
パラメータ省略するとエラーも無く止まったりする

それで今回のモジュールは省略する可能性がある命令全部
マクロを使ってそっちが本当の命令のようにしてる(結局全部だけど・・・)



暇人

リンク

2012/5/11(Fri) 00:12:35|NO.46589

buffer、screen、picloadを使って作ったバッファでもcelput等を使えるように
NO.46576のモジュールに

#undef buffer #define global buffer(%1,%2=640,%3=480,%4=0) _buffer (%1),(%2),(%3),(%4) #deffunc _buffer int bid,int bsx,int bsy,int bm if celload_f = 0 {celload_f=1:sdim cel_index:ddim cel_rcx,1:ddim cel_rcy,1:ddim cel_rcy,1:ddim cel_sqrt,1:ddim cel_r,1} buffer@hsp bid, bsx, bsy,bm _celdiv bid,-1,-1,0,0 return #undef screen #define global screen(%1,%2=640,%3=480,%4=0,%5=100,%6=100,%7=-1,%8=-1) _screen (%1),(%2),(%3),(%4),(%5),(%6),(%7),(%8) #deffunc _screen int bid,int ssx,int ssy,int bm,int spx,int spy,int wsx,int wsy if celload_f = 0 {celload_f=1:sdim cel_index:ddim cel_rcx,1:ddim cel_rcy,1:ddim cel_rcy,1:ddim cel_sqrt,1:ddim cel_r,1} if wsx<=0 {_wsx=ssx}else{_wsx=wsx} if wsy<=0 {_wsy=ssy}else{_wsy=wsy} screen@hsp bid, ssx, ssy, bm, spx, spy, _wsx, _wsy _celdiv bid,-1,-1,0,0 return #undef picload #define global picload(%1,%2=0) _picload (%1),(%2) #deffunc _picload str fn,int lm if celload_f = 0 {celload_f=1:sdim cel_index:ddim cel_rcx,1:ddim cel_rcy,1:ddim cel_rcy,1:ddim cel_sqrt,1:ddim cel_r,1} picload@hsp fn, lm _celdiv ginfo(3),-1,-1,0,0 return
を適当な所に追加



暇人

リンク

2012/5/11(Fri) 00:59:48|NO.46591

>回転倍率指定時も標準命令と見た目同じに見える・・・
hsplet上では実数がHSPとは違うからか少しずれる・・・



暇人

リンク

2012/5/12(Sat) 02:11:02|NO.46597

>>回転倍率指定時も標準命令と見た目同じに見える・・・
> hsplet上では実数がHSPとは違うからか少しずれる・・・
実数がHspとは違うから誤差は出るでるけど
あのぐらいの計算で1ドットもずれるの可笑しいと思ったら
grotateの動作がHsp用とは違うだけだった・・・

表示される位置が1ドット右にずれて
表示されるサイズが1ドット(奇数指定の場合2ドット)少ない
縦は下にずれて(ry

grotateの設定値とposいじってもHspと同じ表示させるのは無理・・・(偶数サイズが表示できない)
NO.46576のcelputは回転無し等倍指定ならgcopy使うから普通に
マップチップ並べるだけなら問題ないが・・・


オマケ

bgscrの存在を忘れてたので追加

#undef bgscr #define global bgscr(%1,%2=640,%3=480,%4=0,%5=-1,%6=-1,%7=-1,%8=-1) _screen (%1),(%2),(%3),(%4),(%5),(%6),(%7),(%8) #deffunc _bgscr int bid,int ssx,int ssy,int bm,int spx,int spy,int wsx,int wsy if celload_f = 0 {celload_f=1:sdim cel_index:ddim cel_rcx,1:ddim cel_rcy,1:ddim cel_rcy,1:ddim cel_sqrt,1:ddim cel_r,1} if wsx<=0 {_wsx=ssx}else{_wsx=wsx} if wsy<=0 {_wsy=ssy}else{_wsy=wsy} bgscr@hsp bid, ssx, ssy, bm, spx, spy, _wsx, _wsy _celdiv bid,-1,-1,0,0 return

hsplet非対応のmemexpandを機能実装

#undef memexpand //memexpand 使い方は標準と変らない(既に文字列が入ってる部分を残す、64より小さいかは見てない) #define global memexpand(%1,%2=64) _memexpand %1,(%2) #deffunc _memexpand var mem,int memsiz strsiz=strlen(mem) if strsiz<memsiz{ sdim strbuf,memsiz-strsiz+1 memset strbuf,' ',memsiz-strsiz,0 mem + strbuf memset mem,0,memsiz-strsiz,strsiz } return
これをモジュールの最初の方に入れて
モジュール内の
>repeat cel_totadiv(bid) //memexpandの代わり
> cel_index(bid)+" "
> loop


memexpand cel_index(bid),cel_totadiv(bid)*4
を置き換え



暇人

リンク

2012/5/13(Sun) 18:00:46|NO.46629

動いてるけど間違いの修正と
個々の命令で初期化してるか判定はやめて初期化命令追加
strlen()が文字列で初期化されてないとエラーがでるから対策(Hsp上ではエラーでない)


//モージュールファイルここから #module "mod_cel" //置き換え命令 #undef wpeek #undef lpeek #undef gmode #undef celload #undef celdiv #undef celput #undef buffer #undef screen #undef picload #undef bgscr #undef memexpand #define global buffer(%1,%2=640,%3=480,%4=0) _buffer (%1),(%2),(%3),(%4) #define global screen(%1,%2=640,%3=480,%4=0,%5=-1,%6=-1,%7=-1,%8=-1) _screen (%1),(%2),(%3),(%4),(%5),(%6),(%7),(%8) #define global bgscr(%1,%2=640,%3=480,%4=0,%5=-1,%6=-1,%7=-1,%8=-1) _screen (%1),(%2),(%3),(%4),(%5),(%6),(%7),(%8) #define global picload(%1,%2=0) _picload (%1),(%2) //memexpand 使い方は標準と変らない(既に文字列が入ってる部分を残す、64より小さいかは見てない) #define global memexpand(%1,%2=64) _memexpand %1,(%2) //wpeek,lpeek 使い方は標準と変らない #define global ctype wpeek(%1,%2=0) _wpeek( %1,(%2)) #define global ctype lpeek(%1,%2=0) _lpeek( %1,(%2)) //gmode 使い方は標準と変らない(celput用に細工してある) #define global gmode(%1=_gmode_p1@mod_cel,%2=_gmode_p2@mod_cel,%3=_gmode_p3@mod_cel,%4=_gmode_p4@mod_cel) \ bid_bak@mod_cel=-1:_gmode_p1@mod_cel=%1:_gmode_p2@mod_cel=%2:_gmode_p3@mod_cel=%3:_gmode_p4@mod_cel=%4:gmode@hsp %1,%2,%3,%4 //celload 使い方は標準命令と変らない(ウィンドウIDに-1又は未指定の場合は1000番以上が使われる) #define global celload(%1,%2=-1,%3=0) _celload %1,(%2),(%3) //celdiv 使い方は標準命令と変らない(分割総数数がstatに返る) #define global celdiv(%1,%2=-1,%3=-1,%4=0,%5=0) _celdiv (%1),(%2),(%3),(%4),(%5) //celput 使い方は標準命令と変らない(存在しないNoを指定するとバッファオーバーでエラーになることがある(使う側で回避できるからモジュール側でするのはやめた)) #define global celput(%1,%2=0,%3=1.0,%4=1.0,%5=0.0) _celput (%1),(%2),(%3),(%4),(%5) //get_celdivx(ウィンドウID)、get_celdivy(ウィンドウID)  分割された数取得X、Y #define global get_celdivx(%1) cel_divx@mod_cel((%1)) #define global get_celdivy(%1) cel_divy@mod_cel((%1)) #define global get_celtotadiv(%1) cel_totadiv@mod_cel((%1)) //分割総数 #deffunc _buffer int bid,int bsx,int bsy,int bm buffer@hsp bid, bsx, bsy,bm _celdiv bid,-1,-1,0,0 return #deffunc _screen int bid,int ssx,int ssy,int bm,int spx,int spy,int wsx,int wsy if wsx<=0 {_wsx=ssx}else{_wsx=wsx} if wsy<=0 {_wsy=ssy}else{_wsy=wsy} screen@hsp bid, ssx, ssy, bm, spx, spy, _wsx, _wsy _celdiv bid,-1,-1,0,0 return #deffunc _bgscr int bid,int ssx,int ssy,int bm,int spx,int spy,int wsx,int wsy if wsx<=0 {_wsx=ssx}else{_wsx=wsx} if wsy<=0 {_wsy=ssy}else{_wsy=wsy} bgscr@hsp bid, ssx, ssy, bm, spx, spy, _wsx, _wsy _celdiv bid,-1,-1,0,0 return #deffunc _picload str fn,int lm picload@hsp fn, lm _celdiv ginfo(3),-1,-1,0,0 return #deffunc _memexpand var mem,int memsiz strsiz=strlen(mem) if strsiz<memsiz{ sdim strbuf,memsiz-strsiz+1 memset strbuf,' ',memsiz-strsiz,0 mem + strbuf memset mem,0,memsiz-strsiz,strsiz } return #defcfunc _wpeek var p1,int p2 memcpy w,p1,2,0,p2 //上下がHSP上とは逆になるからmemcpyで代用 return w #defcfunc _lpeek var p1,int p2 memcpy l,p1,4,0,p2 return l #deffunc mod_cel_init sdim cel_index:ddim cel_rcx,1:ddim cel_rcy,1:ddim cel_rcy,1:ddim cel_sqrt,1:ddim cel_r,1 return #deffunc _celload str fn,int bid,int bm wid_bak=ginfo(3) if bid<0{_bid=1000+idcnt:idcnt+1}else{_bid=bid}//ginfo(25)未使用のウィンドウIDを取得が使えないので指定なしの時は1000番以上を使用 buffer@hsp _bid,,,bm picload@hsp fn _celdiv _bid,-1,-1,0,0 gsel wid_bak return _bid #deffunc _celdiv int bid,int _dx,int _dy,int cx,int cy wid_bak(1)=ginfo(3) gsel bid if _dx<=0 {dx=ginfo(12)}else{dx=_dx} if _dy<=0 {dy=ginfo(13)}else{dy=_dy} cel_dx(bid)=dx//分割サイズ cel_dy(bid)=dy cel_cx(bid)=cx//通常の中心 cel_cy(bid)=cy cel_rcx(bid)=(double(cel_cx(bid)-double(cel_dx(bid))/2))//表示倍率指定用の中心 cel_rcy(bid)=(double(cel_cy(bid)-double(cel_dy(bid))/2)) cel_r(bid)=atan(cel_rcy(bid),cel_rcx(bid))//回転用の中心角度 cel_sqrt(bid)=sqrt(cel_rcx(bid)*cel_rcx(bid)+cel_rcy(bid)*cel_rcy(bid))//回転倍率指定用の中心 cel_divx(bid)=(ginfo(12)/dx) cel_divy(bid)=(ginfo(13)/dy) cel_totadiv(bid)=cel_divx(bid)*cel_divy(bid) cel_index(bid)="" memexpand cel_index(bid),cel_totadiv(bid)*4 repeat cel_divy(bid) divy=cnt repeat cel_divx(bid) x=cnt*dx y=(divy*dy) memcpy cel_index(bid),x,2,(divy*cel_divx(bid)+cnt)*4 ,0 //コピー元の左上X座標保存 memcpy cel_index(bid),y,2,(divy*cel_divx(bid)+cnt)*4+2,0//コピー元の左上Y座標保存 loop loop gsel wid_bak(1) return cel_totadiv(bid) #deffunc _celput int bid,int no,double ratx,double raty,double r cpx=ginfo(22) cpy=ginfo(23) x=wpeek(cel_index(bid),no*4) y=wpeek(cel_index(bid),no*4+2) if r ! 0.0 {//回転倍率用 px=ratx*cel_sqrt(bid)*cos(cel_r(bid)+r) py=raty*cel_sqrt(bid)*sin(cel_r(bid)+r) pos cpx-px,cpy-py if bid_bak ! bid {bid_bak = bid:gmode@hsp _gmode_p1,cel_dx(bid),cel_dy(bid),_gmode_p4}//無駄にgmodeしないように対策 grotate bid,x,y,r,ratx*(cel_dx(bid)),raty*(cel_dy(bid)) pos cpx+ratx*cel_dx(bid),cpy }else{//倍率用 if (ratx ! 1.0) or (raty ! 1.0) { pos cpx-ratx*cel_rcx(bid),cpy-raty*cel_rcy(bid) if bid_bak ! bid {bid_bak = bid:gmode@hsp _gmode_p1,cel_dx(bid),cel_dy(bid),_gmode_p4} grotate bid,x,y,r,ratx*(cel_dx(bid)),raty*(cel_dy(bid)) pos cpx+ratx*cel_dx(bid),cpy }else{//通常用 pos cpx-cel_cx(bid),cpy-cel_cy(bid) gcopy bid,x,y,cel_dx(bid),cel_dy(bid) pos cpx+cel_dx(bid),cpy } } return #global mod_cel_init //mod_cel初期化命令 //ここまで

grotateがHsp上と同じ動作できないからgsquareでやろうとしたら
回転でエラー・・・
コピー元のバッファが右端だと出るっぽい
エラーでなくてもgsquareもHsp上と動作が異なる・・・



暇人

リンク

2012/5/15(Tue) 02:13:33|NO.46641

コピー元の座標を予め計算しといてwpeekで読み出しは
表示時に計算よりちょい早かったけど、wpeekを置き換えてるから遅かった・・・

と、言う事で表示時計算に変更

//モージュールファイルここから #module "mod_cel" //置き換え命令 #undef wpeek #undef lpeek #undef gmode #undef celload #undef celdiv #undef celput #undef buffer #undef screen #undef picload #undef bgscr #undef memexpand #define global buffer(%1,%2=640,%3=480,%4=0) _buffer (%1),(%2),(%3),(%4) #define global screen(%1,%2=640,%3=480,%4=0,%5=-1,%6=-1,%7=-1,%8=-1) _screen (%1),(%2),(%3),(%4),(%5),(%6),(%7),(%8) #define global bgscr(%1,%2=640,%3=480,%4=0,%5=-1,%6=-1,%7=-1,%8=-1) _screen (%1),(%2),(%3),(%4),(%5),(%6),(%7),(%8) #define global picload(%1,%2=0) _picload (%1),(%2) //memexpand 使い方は標準と変らない(既に文字列が入ってる部分を残す、64より小さいかは見てない) #define global memexpand(%1,%2=64) _memexpand %1,(%2) //wpeek,lpeek 使い方は標準と変らない #define global ctype wpeek(%1,%2=0) _wpeek( %1,(%2)) #define global ctype lpeek(%1,%2=0) _lpeek( %1,(%2)) //gmode 使い方は標準と変らない(celput用に細工してある) #define global gmode(%1=_gmode_p1@mod_cel,%2=_gmode_p2@mod_cel,%3=_gmode_p3@mod_cel,%4=_gmode_p4@mod_cel) \ bid_bak@mod_cel=-1:_gmode_p1@mod_cel=%1:_gmode_p2@mod_cel=%2:_gmode_p3@mod_cel=%3:_gmode_p4@mod_cel=%4:gmode@hsp %1,%2,%3,%4 //celload 使い方は標準命令と変らない(ウィンドウIDに-1又は未指定の場合は1000番以上が使われる) #define global celload(%1,%2=-1,%3=0) _celload %1,(%2),(%3) //celdiv 使い方は標準命令と変らない(分割総数数がstatに返る) #define global celdiv(%1,%2=-1,%3=-1,%4=0,%5=0) _celdiv (%1),(%2),(%3),(%4),(%5) //celput 使い方は標準命令と変らない(存在しないNoを指定すると-Noなら0番でオーバーなら非表示) #define global celput(%1,%2=0,%3=1.0,%4=1.0,%5=0.0) _celput (%1),(%2),(%3),(%4),(%5) //get_celdivx(ウィンドウID)、get_celdivy(ウィンドウID)  分割された数取得X、Y #define global get_celdivx(%1) cel_divx@mod_cel((%1)) #define global get_celdivy(%1) cel_divy@mod_cel((%1)) #define global get_celtotadiv(%1) cel_totadiv@mod_cel((%1)) //分割総数 #deffunc _buffer int bid,int bsx,int bsy,int bm buffer@hsp bid, bsx, bsy,bm _celdiv bid,-1,-1,0,0 return #deffunc _screen int bid,int ssx,int ssy,int bm,int spx,int spy,int wsx,int wsy if wsx<=0 {_wsx=ssx}else{_wsx=wsx} if wsy<=0 {_wsy=ssy}else{_wsy=wsy} screen@hsp bid, ssx, ssy, bm, spx, spy, _wsx, _wsy _celdiv bid,-1,-1,0,0 return #deffunc _bgscr int bid,int ssx,int ssy,int bm,int spx,int spy,int wsx,int wsy if wsx<=0 {_wsx=ssx}else{_wsx=wsx} if wsy<=0 {_wsy=ssy}else{_wsy=wsy} bgscr@hsp bid, ssx, ssy, bm, spx, spy, _wsx, _wsy _celdiv bid,-1,-1,0,0 return #deffunc _picload str fn,int lm picload@hsp fn, lm _celdiv ginfo(3),-1,-1,0,0 return #deffunc _memexpand var mem,int memsiz strsiz=strlen(mem) if strsiz<memsiz{ sdim strbuf,memsiz-strsiz+1 memset strbuf,' ',memsiz-strsiz,0 mem + strbuf memset mem,0,memsiz-strsiz,strsiz } return #defcfunc _wpeek var p1,int p2 memcpy w,p1,2,0,p2 //上下がHSP上とは逆になるからmemcpyで代用 return w #defcfunc _lpeek var p1,int p2 memcpy l,p1,4,0,p2 return l #deffunc mod_cel_init sdim cel_index:ddim cel_rcx,1:ddim cel_rcy,1:ddim cel_rcy,1:ddim cel_sqrt,1:ddim cel_r,1 return #deffunc _celload str fn,int bid,int bm wid_bak=ginfo(3) if bid<0{_bid=1000+idcnt:idcnt+1}else{_bid=bid}//ginfo(25)未使用のウィンドウIDを取得が使えないので指定なしの時は1000番以上を使用 buffer@hsp _bid,,,bm picload@hsp fn _celdiv _bid,-1,-1,0,0 gsel wid_bak return _bid #deffunc _celdiv int bid,int _dx,int _dy,int cx,int cy wid_bak(1)=ginfo(3) gsel bid if _dx<=0 {dx=ginfo(12)}else{dx=_dx} if _dy<=0 {dy=ginfo(13)}else{dy=_dy} cel_dx(bid)=dx//分割サイズ cel_dy(bid)=dy cel_cx(bid)=cx//通常の中心 cel_cy(bid)=cy cel_rcx(bid)=(double(cel_cx(bid)-double(cel_dx(bid))/2))//表示倍率指定用の中心 cel_rcy(bid)=(double(cel_cy(bid)-double(cel_dy(bid))/2)) cel_r(bid)=atan(cel_rcy(bid),cel_rcx(bid))//回転用の中心角度 cel_sqrt(bid)=sqrt(cel_rcx(bid)*cel_rcx(bid)+cel_rcy(bid)*cel_rcy(bid))//回転倍率指定用の中心 cel_divx(bid)=(ginfo(12)/dx) cel_divy(bid)=(ginfo(13)/dy) if cel_divx(bid)=0 {cel_divx(bid)=1} if cel_divy(bid)=0 {cel_divy(bid)=1} cel_totadiv(bid)=cel_divx(bid)*cel_divy(bid) gsel wid_bak(1) return cel_totadiv(bid) #deffunc _celput int bid,int no,double ratx,double raty,double r cpx=ginfo(22) cpy=ginfo(23) dup celdx,cel_dx(bid) x=celdx*(no\cel_divx(bid)) y=cel_dy(bid)*(no/cel_divx(bid)) if r ! 0.0 {//回転倍率用 px=ratx*cel_sqrt(bid)*cos(cel_r(bid)+r) py=raty*cel_sqrt(bid)*sin(cel_r(bid)+r) pos cpx-px,cpy-py if bid_bak ! bid {bid_bak = bid:gmode@hsp _gmode_p1,celdx,cel_dy(bid),_gmode_p4}//無駄にgmodeしないように対策 grotate bid,x,y,r,ratx*(celdx),raty*(cel_dy(bid)) pos cpx+ratx*celdx,cpy }else{//倍率用 if (ratx ! 1.0) or (raty ! 1.0) { pos cpx-ratx*cel_rcx(bid),cpy-raty*cel_rcy(bid) if bid_bak ! bid {bid_bak = bid:gmode@hsp _gmode_p1,celdx,cel_dy(bid),_gmode_p4} grotate bid,x,y,r,ratx*(celdx),raty*(cel_dy(bid)) pos cpx+ratx*celdx,cpy }else{//通常用 pos cpx-cel_cx(bid),cpy-cel_cy(bid) gcopy bid,x,y,celdx,cel_dy(bid) pos cpx+celdx,cpy } } return #global mod_cel_init //mod_cel初期化命令 //ここまで



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