斜方投射とバウンド
Posted: 2010年9月10日(金) 20:59
物理で習った斜方投射とゲームプログラミングの館を参考に東方の旧作霊異伝っぽいゲームを作ってみようかと思ったのですが、いくつか問題があったので質問させていただきます。
1:角度をつけて斜方投射をしたいのですがゲームプログラミングの館の28. ジャンプの考え方2(物理)
と29. 跳ね返りの考え方(物理) を参考にこのように書いてみました。
自分はxy位置が原因だと思うのですがうまくいきません。
それと28. ジャンプの考え方2(物理)はsinやcosで計算してませんがやはり三角関数を使うべきなのでしょうか?その場合はラジアンで角度を出しx、yそれぞれの式にsin()cos()を入れるのでしょうか?
1:角度をつけて斜方投射をしたいのですがゲームプログラミングの館の28. ジャンプの考え方2(物理)
と29. 跳ね返りの考え方(物理) を参考にこのように書いてみました。
#include "DxLib.h"
#include <math.h>
#define e 0.900
#define g 9.807
#define v 1.000
#define PI 3.14159265358979323846
#define y_max 2.000
int WINAPI WinMain( HINSTANCE hI, HINSTANCE hP,LPSTR lpC, int nC){
int image[8];
char Key[256];
int x,y,time1,time2,flag=0,i,j;
int a=0;
int hx=0;
int hy=0;
int count=0;
int gameclrea=0;
double t,v0;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "onmyou.png" , 8 , 4 , 2 , 24 , 24 , image );//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
ClearDrawScreen(); // 裏画面のデータを全て削除
GetHitKeyStateAll( Key ) ; // すべてのキーの状態を得る
if( Key[ KEY_INPUT_RETURN ] == 1 ){ //エンターが押されたら
time1 = GetNowCount(); //time1にエンターが押された時の時間を格納
flag=1; //飛び上がりフラグを立てる。
}
if(flag==1){
time2=GetNowCount();
v0= sqrt ( 2.000 * g * y_max);
t = (double)(time2-time1)/1500.000;
x = t*v0*40;
for(i=0;i<j;i++) //j回跳ね返った時の初速度
v0*=e; //eは反発係数
y = (int)((v0*t-0.500*g*t*t)*320.000/y_max);
a=a+1;
if(a>3){
a=0;
}
hx=610-x;
hy=380-y;
if(y>=-70)
DrawGraph(hx, hy , image[a] , TRUE ) ;
else{
time1=GetNowCount();
j++;
}
if( Key[ KEY_INPUT_ESCAPE ] == 1 ){
DxLib_End();
return 0; //Escボタンが押されたらend
}
ScreenFlip(); // 裏画面データを表画面へ反映
}
}
}
これを実行するとしっかり斜方投射するのですがその場でバウンドせず戻って再び斜方投射します。自分はxy位置が原因だと思うのですがうまくいきません。
それと28. ジャンプの考え方2(物理)はsinやcosで計算してませんがやはり三角関数を使うべきなのでしょうか?その場合はラジアンで角度を出しx、yそれぞれの式にsin()cos()を入れるのでしょうか?
