ページ 11

円弧を描いて画像を動かしたい

Posted: 2012年2月05日(日) 16:04
by taketoshi
こんにちは。お世話になります。

現在マウスカーソルから光を放出するソフトを書いています。
そこで、画像の動かし方について質問があります。
添付画像のように動かしたいのですが、どのように動かせばいいのでしょうか。
光の動き.jpg
光の動き.jpg (31.6 KiB) 閲覧数: 2826 回
色々試してみましたが、直角に反射するような動きまでしか描けませんでした。
今はこのような形でただ、右下にフェードするだけの処理になっています。

変数はnAlphaが0になったとき、それぞれ再初期化するような処理にしています。

コード:


typedef struct{
	HBITMAP hBitmap;
	HWND hChild;
	int nAlpha;
    png_uint_32 nWidth;
    png_uint_32 nHeight;
	POINT wndPos;//画像の位置
	SIZE  wndSize;//ウインドウサイズ
	int nMoveY;//Y移動量
	int nMoveX;//X移動量
	int nCount;//sinを使うためのループカウンタ	
	int nAccY;//Y加速度
	int nAccX;//X加速度
	bool bRetrunFlag;//頂点から引き返すフラグ
}DATA,*lpData;

int CEffect::Move(){
	WndData.nCount++;
	//Y軸の移動
	WndData.nMoveY -= sin(WndData.nCount * 3.14/ 180) * 3;
	//X軸の移動
	WndData.nMoveX -= sin(WndData.nCount * 3.14/ 180) * 3;
	return 0;
}
なにかアドバイスをお願いします。

Re: 円弧を描いて画像を動かしたい

Posted: 2012年2月05日(日) 16:29
by softya(ソフト屋)
加速度を持つ物体の運動方程式で解決する気がします。
初速を下方、加速を上方、横移動は等速運動でどうでしょうか?
x = vx0*t
y = vy0*t + 1/2*a*t*t

x,yは座標
tはフレーム時間
vx0,vy0は初速でピクセル/フレーム
aは加速度でピクセル/フレーム

Re: 円弧を描いて画像を動かしたい

Posted: 2012年2月05日(日) 16:32
by 史上最悪のデスペナ
softya(ソフト屋) さんが書きました:加速度を持つ物体の運動方程式で解決する気がします。
初速を下方、加速を上方、横移動は等速運動でどうでしょうか?
x = vx0*t
y = vy0*t + 1/2*a*t*t

x,yは座標
tはフレーム時間
vx0,vy0は初速でピクセル/フレーム
aは加速度でピクセル/フレーム
確かにそれも思ったのですが、それだとX軸方向に対して減速→加速が表すことが出来ないので(X軸でsinを使ってることからそう推測)
新・ゲームプログラミングの館 s2章. 高次方程式を用いたベジェ曲線 (2/2)
こちらのほうが良いと思うのですがどうでしょう?

Re: 円弧を描いて画像を動かしたい

Posted: 2012年2月05日(日) 17:23
by taketoshi
お二方、アドバイスありがとうございます。

直ぐに試せないので(知識が追いつかない)
画面をプリントアウトして読んでコードに書き起こした上で再度質問させていただきます。

解決とはせず、保留にさせてください。

Re: 円弧を描いて画像を動かしたい

Posted: 2012年2月06日(月) 22:15
by taketoshi
お返事頂いた内容で考えた結果、思うような動きを再現することが出来ました
softyaさんの運動式を元に、プログラムを変えたところいい動きをしてくれました。
それぞれrand関数を使って初期値は乱数を与えています。

コード:

typedef struct{
	HBITMAP hBitmap;
	HWND hChild;
	int nAlpha;
    png_uint_32 nWidth;
    png_uint_32 nHeight;
	POINT wndPos;//画像の位置
	SIZE  wndSize;//ウインドウサイズ
	int nMoveY;//Y移動量
	int nMoveX;//X移動量
	int nCount;//sinを使うためのループカウンタ
	int nFirstAccY;//Y軸初速
	int nAccY;//Y加速度
	int nAccX;//X加速度
	bool bRetrunFlag;//右放出か左放出のフラグ
}DATA,*lpData;

int CEffect::Move(){

	WndData.nCount++;

	//Y軸の移動
	WndData.nMoveY -= WndData.nFirstAccY - sin(WndData.nCount * 3.14/ 180) * 20;

	//X軸の移動
	if(WndData.bRetrunFlag){
		WndData.nMoveX += WndData.nAccX;
	}else{
		WndData.nMoveX -= WndData.nAccX;
	}

	return 0;
}
[youtube][/youtube]


お二方のおかげで先に進めました。
アドバイスありがとうございました。