跳ね返りの考え方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
elise

跳ね返りの考え方について

#1

投稿記事 by elise » 14年前

こんばんわ。以前、ゲーム内時間とコンピュータ起動時間の誤差について質問させて頂いたものです。
復習を兼ねて、ゲームプログラミングの館を見直していますが、そこで疑問に思ったことを質問させていただきます。

ゲームプログラミングの館にある「29.跳ね返りの考え方(物理)」でのことです。
ここでのプログラムで、特に跳ね返りの部分に関する記述は

コード:

                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++;
                        }
                }
となっていますが、もしゲームの設定として上座標の限界がある(天井などがある)とする場合の衝突時の処理は
どのように行えばいいのでしょうか?
自分でも考えたのですが、限界となるy座標を指定し、それ以上になったら高さを元に戻す程度のことしかできず、
天井にぶつかっても、時間がたたないと落下してこないという状態になってしまいました。

elise

Re: 跳ね返りの考え方について

#2

投稿記事 by elise » 14年前

追記:
プログラム中では、DirectXライブラリを使用しています。

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

Re: 跳ね返りの考え方について

#3

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

実際問題、この計算方法は理想条件のものですから位置や加速度の計算を0時間からの累積で行うのではなく、フレーム時間毎の随時の計算に変えないと面倒だと思います。
かなり不まじめなプログラムのですが、一応それらしく動きます。
反発係数は床と天井で変えてあります。

コード:

#include "DxLib.h"
#include <math.h>

#define e 0.800	//	床の反発係数
#define eu 0.6	//	天井の反発係数
#define g 9.807	//	加速度

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode( TRUE ) ;          // ウインドウモードに変更
	if( DxLib_Init() == -1 ) return -1; //DXライブラリ初期化 エラーが起きたら終了 

	int image[16],time1,time2,flag=0; //時間を取得するtime1,time2。フラグ-flag
	double t,v0,v,y;
	char Key[256];

	SetDrawScreen( DX_SCREEN_BACK ) ;//描画先を裏画面に設定

	LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存

	v0= 40;           //初速度。

	while(1){
		ClearDrawScreen();//裏画面のデータを全て削除
		GetHitKeyStateAll( Key ) ;           // すべてのキーの状態を得る
		if( ProcessMessage() == -1 ) break ; //異常がおきたら終了

		if( Key[ KEY_INPUT_RETURN ]  == 1 ){
			time1 = GetNowCount();
			flag=1;
			v=v0;
			y = 0;
		}

		if(flag==1){
			//	前回との時間差。
			time2 = GetNowCount() ;                  // 現在経過時間を得る
			t = (double)(time2 - time1) / 1000.000;
			//	速度と位置の計算
			v = v - g * t;
			y = y + v;
			time1 = GetNowCount();
			if(y>=0) {
				if( y>(480-32) ) {
					//	天井の反射
					v = -v * eu;
					y = 480-32;
				}
			} else {
				//	床での反射
				v = -v * e;
				y = 0;
				if( v < 0.3 ) {
					v = 0;
				}
			}
			DrawGraph( 320 , 480-32-(int)y , image[8] , TRUE );
		}

		if( Key[ KEY_INPUT_ESCAPE ]  == 1 ) break;//Escボタンが押されたらブレイク

		ScreenFlip() ;//裏画面データを表画面へ反映
	}
	DxLib_End() ;// DXライブラリ使用の終了処理
	return 0 ;// ソフトの終了
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

elise

Re: 跳ね返りの考え方について

#4

投稿記事 by elise » 14年前

softya(ソフト屋) さんが書きました:実際問題、この計算方法は理想条件のものですから位置や加速度の計算を0時間からの累積で行うのではなく、フレーム時間毎の随時の計算に変えないと面倒だと思います。
かなり不まじめなプログラムのですが、一応それらしく動きます。
反発係数は床と天井で変えてあります。
ソフト屋さん、回答ありがとうございます。
実際に回答して頂いたプログラムを参考に実装してみたところ、上手く目的の動作をするようになりました!

閉鎖

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