ページ 11

斜方投射とバウンド

Posted: 2010年9月10日(金) 20:59
by エデリュス
物理で習った斜方投射とゲームプログラミングの館を参考に東方の旧作霊異伝っぽいゲームを作ってみようかと思ったのですが、いくつか問題があったので質問させていただきます。
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()を入れるのでしょうか? 画像

Re:斜方投射とバウンド

Posted: 2010年9月10日(金) 22:08
by Tatu
ボールの移動については速度用の変数を用意し、
速度を計算してその値を現在の座標に足すというやり方をすればよいのではないでしょうか。
速度についてはxy座標で扱い、角度は使わなくてもよいでしょう。

以前、「東方靈異伝」風のゲームを作成し、公開したことがあります。
作成している時は「龍神録プログラミングの館」のページとプロジェクトを見ながら作っていました。
エデリュスさんも「龍神録プログラミングの館」を参考にしてみてはいかがですか?

Re:斜方投射とバウンド

Posted: 2010年9月11日(土) 16:51
by エデリュス
>>Tatuさん
ありがとうございます。おかげでさまでバウンドに成功しました。
これからは龍神録プログラミングの館も参考にしてみます。



>>以前、「東方靈異伝」風のゲームを作成し、公開したことがあります。
もう公開はおわってますか?
できればプレイしたいのですが・・・

Re:斜方投射とバウンド

Posted: 2010年9月11日(土) 17:44
by Tatu
>>エデリュスさん
前にアップロードしたものが消えていたので、アップロードしなおしました。

>>他の方
前からの変更は全くありません。


タイトル 星と陰陽玉
アップローダー
http://www1.axfc.net/uploader/Sc/so/152 ... y=starball

Re:斜方投射とバウンド

Posted: 2010年9月12日(日) 15:50
by エデリュス
>>Tatuさん
アップロードありがとうございます。
早速プレイさせていただきました。
キクリっぽいのが鬼門でした。

ブロックをエクセルで制御してるんですね。参考になります。

質問なんですが壁のバウンドって床と同じですか?

Re:斜方投射とバウンド

Posted: 2010年9月12日(日) 20:53
by Tatu
壁というのが左右の端を指すのであればほぼ同じです。

細長いブロックのことならぶつかったかどうかを調べた後に
縦横どちらでぶつかったかの判定を行っています。

ソースを見たところ、

ぶつかったときにボールの座標を移動前のときの値に戻してから
左右の端では横方向の速度に-1をかけ、
上の端では縦方向の速度に-1をかけ、
床では縦方向の速度に-0.8をかけていました。
壊れないブロックではぶつかったと判断された方向の速度に-1をかけていました。

Re:斜方投射とバウンド

Posted: 2010年9月15日(水) 20:19
by エデリュス
>>Tatuさん
ありがとうございます。返信が遅れてすみません。
なんとか壁のバウンドもできるようになりました。
本当にありがとうございました。

Re:斜方投射とバウンド

Posted: 2010年9月15日(水) 20:19
by エデリュス
解決付け忘れです。すいません。