滑らかに上下移動、大きさ変更をする時にsin波は欠かせません。
sinって何だっけ?と言う方はこちらへどうぞ。
sinの波はこんな形をしていましたね。
水平を時間軸、鉛直をyとすれば、この曲線を使って滑らかな上下移動が出来ます。
πは180゜、2πは360゜を表します。
円周率をPIとし、1秒間に60カウントアップするカウンタ(Count)を使えば、
sin( PI*2 / 60 * Count )
で1周期分の値が取得出来ます。
-1から1までをスムーズに遷移するこの値を使って移動と大きさの変更をしてみましょう。
値は-1~1までを遷移しますから、これに例えば200をかければ-200~200までの値に変換出来ます。
ではプログラムをご覧下さい。
#include <math.h> #include "DxLib.h" #define PI 3.141592654f int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定 int Handle; // 画像格納用ハンドル int Count = 0; Handle = LoadGraph( "画像/キャラクタ01.png" ); // 画像のロード // while(裏画面を表画面に反映, メッセージ処理, 画面クリア) while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){ DrawRotaGraph( 100, 240+sin(PI*2/240*Count)*200, 1.0, 0.0, Handle, TRUE ); //画像の描画 DrawRotaGraph( 500, 240, 1.0+sin(PI*2/120*Count)*0.5, 0.0, Handle, TRUE ); //画像の描画 Count++; } DxLib_End(); // DXライブラリ終了処理 return 0; }
実行結果
DrawRotaGraphの第二引数は y座標 を指定します。
240 + sin( PI*2 / 240 * Count ) * 200
とすることで、周期240カウントで -200~200 の範囲を遷移させることができます(振幅200)。
60カウントが1秒ですから、4秒が1周期ですね。
DrawRotaGraphの第三引数は 大きさ です。1.0が等倍ですから
1.0+sin(PI*2/120*Count)*0.5
とすることで、周期120カウント(2秒)で 0.5~1.5 の範囲を遷移させることが出来ます(振幅0.5)。
ゲームではこのように、滑らかに値を変化させる時
sin( PI*2 / 周期 * Count ) * 振幅
で値を取得することが多いので是非覚えておきましょう。
- Remical Soft -