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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0802
Kain画像の拡大について教えてください><6解決


Kain

リンク

2018/8/2(Thu) 18:20:28|NO.84933

HSP初心者です。画像の拡大について質問があります。
解像度 1280×680の画像を画像の中央を中心にして拡大アニメーション(加減速あり)を
付けたいのですが、うまくいきません。ネットで調べても出てきませんでした。
(テキストの拡大などを見つけたのですが中心が左上で...)

*start x=0 y=0 zx=1280 zy=680 repeat gzoom zx,zy,56,x,y,1280,680 y=y-1 x=x-1 zx=zx+1 zy=zy+1 if y=0:flg=0:goto *start await 10 loop
以上がソースです。(ある掲示板のものを参考にしました)

画像の中央を中心にして画像の拡大(加減速ありのアニメーション)
をするにはどうすればよいでしょうか?

※日本語おかしいかもしれません。馬鹿なので(意味が分からなかったら言ってください...)



この記事に返信する


あらや

リンク

2018/8/2(Thu) 18:59:38|NO.84936

posx = (画面横幅 - 元の画像幅) / 2;
posy = (画面縦高 - 元の画像高) / 2;

とりあえずこれで画面中央に配置するときの画像の左上座標(posx, posy)が取得できます。

あとはこれを応用して
posx = (画面横幅 - 拡大した画像幅) / 2;
posy = (画面縦高 - 拡大した画像高) / 2;



加速表現に関してはいくつか手法はありますが、
どれも毎ループ変化速度を徐々に大きくしていく感じで
たとえば

repeat zoom = cnt*cnt; // 画像の縦横比を維持するために割合で計算する 拡大した画像幅 = (100 + zoom) * 元の画像幅 / 100; 拡大した画像高 = (100 + zoom) * 元の画像高 / 100; // コピー先の左上座標の計算(省略) // 画像の拡大コピー(省略) loop

こんな感じで2次関数的にやると、変数zoomがループ毎に大きくなるのがわかると思います。

減速時は変化量を逆に徐々に小さくしていくようにするだけです。

今回は省略しましたが、変化する最大値・最小値を予め求めておいて
最大値以上になったら最大値に固定し、ループを抜けるなどの処理もいれてください。



Kain

リンク

2018/8/2(Thu) 19:54:13|NO.84939

すいません。コピー先の左上座標の計算、そして画像の拡大コピー方法が分かりません(´;ω;`)
そして、画像横幅、画面縦幅、そして元の画像幅と元の画像高拡大した画像幅と拡大した画像高には
座標などの変数を入力すれば良いのですか?初心者なので全く意味が分かりません...



あらや

リンク

2018/8/2(Thu) 20:17:34|NO.84940

>コピー先の左上座標の計算、そして画像の拡大コピー方法が分かりません
コピー先の左上座標の計算は最初に書いた

posx = (画面横幅 - 拡大した画像幅) / 2;
posy = (画面縦高 - 拡大した画像高) / 2;

これのことです。
日本語で書いてある部分は適当な変数名を入れてください。


画像の拡大コピー方法は
gzoomなどの変倍コピーの命令そのものです。

色々と省略したソースを書くとこんな感じになります。

ウィンドウID = 2; // 画像を読み込むウィンドウID、とりあえず2にしておく buffer ウィンドウID; picload "画像ファイル"; 元の画像幅 = ginfo_winx; 元の画像高 = ginfo_winy; gsel 0; // 操作対象ウィンドウを戻す // コピー先の左上座標の計算 posx = (画面横幅 - 拡大した画像幅) / 2; posy = (画面縦高 - 拡大した画像高) / 2; // 画像の拡大コピー pos posx, posy; gzoom 拡大した画像幅, 拡大した画像高, ウィンドウID, 0, 0, 元の画像幅, 元の画像高;



>画像横幅、画面縦幅、そして元の画像幅と元の画像高拡大した画像幅と拡大した画像高には座標などの変数を入力すれば良いのですか?
これらは座標というか、状況によって名称が変わりますが
解像度・ピクセル・ドットなどと言われる数字のことです。



リンク

2018/8/2(Thu) 20:57:15|NO.84941

精度の問題とかもありますがgrotateを使う方法もあります。
で、とりあえずただ画像を表示するソースです。
test.pngの名前であらかじめ画像は用意してください。
拡大率に1.0以外の数値を入れて実行すると拡大縮小して表示されます。

これを連続的に大きさを変えるには、ループする度に
拡大率の数値を変えていけばよいのです。考えてみてください。


screen 0,1280,680 celload "test.png",2 元画像幅=ginfo(12) 元画像高=ginfo(13) gmode 0,元画像幅,元画像高 画像中心X=640 画像中心Y=340 拡大率=1.0 回転角度=0 gsel 0 repeat redraw 0 color:boxf pos 画像中心X,画像中心Y grotate 2,0,0,deg2rad(回転角度),拡大率*元画像幅,拡大率*元画像高 redraw 1 await 10 loop



法貴優雅

リンク

2018/8/2(Thu) 21:11:04|NO.84942

拡大につきましては、皆さまのおっしゃってる通りですが、
加減速については、標準命令のイージング関数をいかがでしょうか?
せっかくあるのに使わないともったいないので。

ただ初心者とおっしゃっているので、どこまで理解いただけるか
心配ですが、参考にどうぞ。


#define GX 1280 // 画像のXサイズ #define GY 680 // 画像のYサイズ #define LOOP_TIME (1000 / 60) // 1ループの時間(ms) #define ZOOM_TIME 3000 // 拡大する時間(ms) buffer 1, GX, GY, 0 color 0, 0, 255:boxf screen 0, GX, GY, 0 // 処理時間カウント用 nTime = 0 // イージング関数初期設定 setease 0.0f, 1.0f, ease_cubic_inout // タイプを変えることで効果が変わる *main nTime += LOOP_TIME if (nTime > ZOOM_TIME):nTime = ZOOM_TIME n = geteasef(nTime, ZOOM_TIME) // nTime = 0 ~ ZOOM_TIME, n = 0.0 ~ 1.0 sx = n * GX // sx = 0 ~ 1280 sy = n * GY // sy = 0 ~ 680 redraw 0 color 0, 0, 0:boxf pos (GX - sx) / 2, (GY - sy) / 2 gzoom sx, sy, 1, 0, 0, GX, GY redraw 1 await LOOP_TIME goto *main



Kain

リンク

2018/8/3(Fri) 16:36:27|NO.84954

ありがとうございました!
皆さんが教えてくださったこととソースを使ってうまく画像が加速減ありで拡大できました!



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