アスペクト比とは縦横の割合のことです。矩形のアスペクト比を保ち、ウィンドウの大きさに連動してサイズを可変します。
動画のプレイヤーなどに使える気がします。
if 0 {
#deffunc boxf2 int x, int y, int w, int h
;-----------------------------------------------------------
; boxfの改造
;-----------------------------------------------------------
;
; p1,p2 : 中心座標
; p3,p4 : サイズ
;-----------------------------------------------------------
boxf x-w/2,y-h/2, x+w/2,y+h/2
return
}
gsel 0, -1
screen 1, 640,480, 0
; オリジナルのサイズ、実数がポインント
ow = 500.0 : oh = 300.0
*main
redraw 0
color 255,255,255 : boxf
sw = ow : sh = oh
v1 = ow/oh
if (oh > ginfo_winy) | (ow > ginfo_winx) {
if (ow/ginfo_winx) > (oh/ginfo_winy) {
sw = 0.0+ginfo_winx
sh = sw/v1
} else {
sh = 0.0+ginfo_winy
sw = sh*v1
}
}
color 0,0,0 : boxf2 ginfo_winx/2,ginfo_winy/2, sw,sh
redraw
await 10
goto *main
FancyZoomのソースを、HSPに移植すれば良いと思ったけど、上手くいかなかったから、結局自力で考える羽目になりました。次はその失敗例です。
;=========================================================== ; 2007/10/25 ; 矩形の衝突判定モジュール ver.0.1.0 ; GAM-22 ;=========================================================== if 0 { #defcfunc chk_box int ax, int ay, int axs, int ays, int bx, int by, int bxs, int bys ;----------------------------------------------------------- ; 矩形同士の交差判定 ;----------------------------------------------------------- ; ; p1,p2 : 矩形Aの座標 ; p3,p4 : 矩形Aのサイズ ; p5,p6 : 矩形Bの座標 ; p7,p8 : 矩形Bのサイズ ;----------------------------------------------------------- return (ax+axs>=bx) & (bx+bxs>=ax) & (ay+bys>=by) & (by+bys>=ay) } cxm = 1 cym = 1 repeat redraw 0 ; 背景 color 255,255,255 : boxf ; 矩形A color ,,255 boxf mousex,mousey, mousex+32,mousey+32 ; 円B color 255 boxf cx,cy, cx+64,cy+64 cx += cxm cy += cym if cx<=0 | cx>=576 : cxm *= -1 if cy<=0 | cy>=416 : cym *= -1 ; 判定 if chk_box(mousex,mousey,32,32, cx,cy,64,64) { pos 0,0 : mes "当たってる" } redraw await 5 loop
;=========================================================== ; 2007/10/24 ; 円の衝突判定モジュール ver.0.1.0 ; GAM-22 ;=========================================================== if 0 { #defcfunc chk_circle int ax, int ay, int ar, int bx, int by, int br ;----------------------------------------------------------- ; 円同士の交差判定 ;----------------------------------------------------------- ; ; p1,p2 : 円Aの座標 ; p3 : 円Aの半径 ; p4,p5 : 円Bの座標 ; p6 : 円Bの半径 ;----------------------------------------------------------- ; 絶対値に変換するのは、巨大な足し算するとマイナスになって困るから return abs((ax-bx)*(ax-bx) + (ay-by)*(ay-by)) <= (ar+br)*(ar+br) #deffunc circle2 int x, int y, int r ;----------------------------------------------------------- ; 円を描画 ;----------------------------------------------------------- ; ; p1,p2 : 中心座標 ; p3 : 半径 ;----------------------------------------------------------- circle x-r,y-r, x+r,y+r return } cxm = 1 cym = 1 cx = 320 cy = 240 repeat redraw 0 ; 背景 color 255,255,255 : boxf ; 円A color ,,255 circle2 mousex,mousey, 32 ; 円B color 255 circle2 cx,cy, 64 cx += cxm cy += cym if cx<=64 | cx>=576 : cxm *= -1 if cy<=64 | cy>=416 : cym *= -1 ; 判定 if chk_circle(mousex,mousey,32, cx,cy,64) { pos 0,0 : mes "当たってる" } redraw await 5 loop
;=========================================================== ; 2007/8/14 ; 線分交差判定モジュール ver.0.1.0 ; GAM-22 ;=========================================================== if 0 { #defcfunc chk_line double ax1, double ay1, double ax2, double ay2, double bx1, double by1, double bx2, double by2 ;------------------------------------------------------- ; 線分同士の交差判定 ;------------------------------------------------------- ; ; p1,p2 : x1,y1(A) ; p3,p4 : x2,y2(A) ; p5,p6 : x1,y1(B) ; p7,p8 : x2,y2(B) ;------------------------------------------------------- ; ax2-ax1, ay2-ay1 の法線 m1 = -(ay2-ay1) : m2 = ax2-ax1 ; 正規化(長さを1.0にする) m3 = sqrt(m1*m1 + m2*m2) if m3>0 : m3 = 1.0/m3 m1 *= m3 m2 *= m3 ; var d = -(ax * nx + ay * ny); ; var t = -(nx * x + ny * y + d) / (nx * dx + ny * dy); if (m1*(bx2-bx1) + m2*(by2-by1))!0{ m4 = -(m1*bx1 + m2*by1 - (ax1*m1 + ay1*m2)) / (m1*(bx2-bx1) + m2*(by2-by1)) }else{ return 0 } ; cx = x + dx * t; ; cy = y + dy * t; if m4>0 & m4<=1{ stat1@ = bx1+(bx2-bx1)*m4 stat2@ = by1+(by2-by1)*m4 return (ax1-stat1@)*(ax2-stat1@)+(ay1-stat2@)*(ay2-stat2@) < 0;inner(ax1-stat1@, ay1-stat2@, ax2-stat1@, ay2-stat2@) < 0 }else{ return 0 } } repeat redraw 0 ; 背景 color 255,255,255 : boxf ; 線分A color ,,255 line mousex, mousey, 100, 100 ; 線分B v1 = 0.05*cnt line 340+cos(v1)*200,240+sin(v1)*200, 340-cos(v1)*200,240-sin(v1)*200 ; 判定 if chk_line(mousex,mousey, 100,100, 340+cos(v1)*200,240+sin(v1)*200, 340-cos(v1)*200,240-sin(v1)*200) { color 255 circle stat1-5,stat2-5, stat1+5,stat2+5 } redraw await 50 loop仕組みとかは、ここのを参考にしました。
#uselib "user32" #func SetParent "SetParent" int, int ParentHwnd = hwnd screen 1, 300,200, 8, 10,10 SetParent hwnd, ParentHwndCreateWindowExで、新規に作るとHSPの命令が使えなくなるので、