アスペクト比とは縦横の割合のことです。矩形のアスペクト比を保ち、ウィンドウの大きさに連動してサイズを可変します。
動画のプレイヤーなどに使える気がします。
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に移植すれば良いと思ったけど、上手くいかなかったから、結局自力で考える羽目になりました。次はその失敗例です。
; 失敗作
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) {
sh = 0.0+ginfo_winy
sw = sh*v1
}
if (ow > ginfo_winx) {
sw = 0.0+ginfo_winx
sh = sw/v1
}
color 0,0,0 : boxf2 ginfo_winx/2,ginfo_winy/2, sw,sh
redraw
await 10
goto *main
こんなのもできます。
; 最大値をウィンドウに合わせるなら、もっと簡単
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 (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
HSPの仕様で、ウィンドウサイズ変更中はプログラムがストップするのがなんとも・・・