29. 跳ね返りの考え方1
今度は床に跳ね返る時のモーションを考えましょう。反発係数というものをご存知でしょうか。
反発係数eは以下の式で求められます。
B式だけ見てもらったらいいです。何か難しそうな式ですが、ようは、床に跳ね返った後、速さが0.8倍になれば
反発係数も0.8というだけの事です。ですから j 回床に跳ね返った時の初速度はこのように計算できます。
#define e 0.800
v0= sqrt ( 2.000 * g * y_max);
for(i=0;i<j;i++)
v0*=e;
v0の式は前回の通りです。j 回分0.8倍された事になりますね。
ではサンプルプログラムを見てください。ほとんど前回と変わっていません。初速度の計算部分だけ変えてあります。
#include "DxLib.h" #include <math.h> #define e 0.800 #define g 9.807 #define y_max 2.000 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode( TRUE ) ; // ウインドウモードに変更 if( DxLib_Init() == -1 ) return -1; //DXライブラリ初期化 エラーが起きたら終了 int y,image[16],time1,time2,flag=0,i,j; //時間を取得するtime1,time2。フラグ-flag double t,v0; char Key[256]; SetDrawScreen( DX_SCREEN_BACK ) ;//描画先を裏画面に設定 LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存 while(1){ ClearDrawScreen();//裏画面のデータを全て削除 GetHitKeyStateAll( Key ) ; // すべてのキーの状態を得る if( ProcessMessage() == -1 ) break ; //異常がおきたら終了 if( Key[ KEY_INPUT_RETURN ] == 1 ){ time1 = GetNowCount(); flag=1; j=0; } if(flag==1){ time2 = GetNowCount() ; // 現在経過時間を得る t = (double)(time2 - time1) / 1000.000; v0= sqrt ( 2.000 * g * y_max); //初速度を計算 for(i=0;i<j;i++) //j回跳ね返った時の初速度 v0*=e; //eは反発係数 y = (int)((v0 * t - 0.500 * g * t * t ) * 480.000 / y_max); if(y>=0) DrawGraph( 320 , 480-32-y , image[8] , TRUE ); else{ DrawGraph( 320 , 480-32 , image[8] , TRUE ); time1=GetNowCount(); j++; } } if( Key[ KEY_INPUT_ESCAPE ] == 1 ) break;//Escボタンが押されたらブレイク ScreenFlip() ;//裏画面データを表画面へ反映 } DxLib_End() ;// DXライブラリ使用の終了処理 return 0 ;// ソフトの終了 }
実行結果
注意:黄色の文字や線は表示されません。
- Remical Soft -