|
|
|
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初期化命令
//ここまで
| |
|