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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taketoshi
記事: 222
登録日時: 15年前
住所: 日本国

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

#1

投稿記事 by taketoshi » 14年前

こんにちは。お世話になります。

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

変数は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;
}
なにかアドバイスをお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 14年前

加速度を持つ物体の運動方程式で解決する気がします。
初速を下方、加速を上方、横移動は等速運動でどうでしょうか?
x = vx0*t
y = vy0*t + 1/2*a*t*t

x,yは座標
tはフレーム時間
vx0,vy0は初速でピクセル/フレーム
aは加速度でピクセル/フレーム
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 15年前

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

#3

投稿記事 by 史上最悪のデスペナ » 14年前

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

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

taketoshi
記事: 222
登録日時: 15年前
住所: 日本国

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

#4

投稿記事 by taketoshi » 14年前

お二方、アドバイスありがとうございます。

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

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

taketoshi
記事: 222
登録日時: 15年前
住所: 日本国

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

#5

投稿記事 by taketoshi » 14年前

お返事頂いた内容で考えた結果、思うような動きを再現することが出来ました
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]


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

閉鎖

“C言語何でも質問掲示板” へ戻る