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 -