ページ 11

指定フレームで目標地点に向かうプログラム

Posted: 2013年11月28日(木) 15:11
by お茶
プログラムを独学で勉強しており、シューティングゲームを作り、
なんとなくゲームでのcos、sinの使い方が
わかってきたのであるサンプルプログラムを作っております。
開発環境はC++、DXLibになります。

2点間の角度を求め、指定されてポイントに特定のフレーム数で移動するといった少しややこしい形を目指しております。

Object.Px、Py・・・現在のポジション
Sx、Sy・・・スタート地点の座標
Tx、Ty・・・目標地点の座標

なんとなく近い所までいっていると思うのですが、
Tx、Tyの座標によってはそれぞれ定義されたフレーム数で移動してくれません。。。

新参者で恐縮ですが、どなたかアドバイスを頂けないでしょうか。

コード:


#define CHARACTER_ANIME_FRAME 30

        float angle = atan2((float)(this->Ty-this->Sy),(float)(this->Tx-this->Sx));
        
        float diffX = this->Tx - this->Sx;
        float diffY = this->Ty - this->Sy;
        
        float Mx = cos(angle) * float( diffX / CHARACTER_ANIME_FRAME ) * 1.0f;//CHARACTER_MOVE_SPEED;
        float My = sin(angle) * float( diffY / CHARACTER_ANIME_FRAME ) * 1.0f;//CHARACTER_MOVE_SPEED;
        
		// Xの移動
        if( this->Tx > this->Sx ){
            this->Object.Px += Mx;
            if( this->Object.Px >= this->Tx ) this->Object.Px = this->Tx;
        }

        /*
        if( this->Tx < this->Sx ){
            this->Object.Px -= Mx;
            if( this->Object.Px <= this->Tx ) this->Object.Px = this->Tx;
        }*/
        
		
		// Yの移動(TxはSxより必ず下にあるものとする)
        if( this->Object.Py < this->Ty ){
            this->Object.Py += My;
        }else{
            this->Object.Py = this->Ty;
        }

Re: 指定フレームで目標地点に向かうプログラム

Posted: 2013年11月28日(木) 16:13
by h2so5
9, 10行目は正しくはこうじゃないでしょうか。

コード:

        float Mx = diffX / CHARACTER_ANIME_FRAME;
        float My = diffY / CHARACTER_ANIME_FRAME;

Re: 指定フレームで目標地点に向かうプログラム

Posted: 2013年11月28日(木) 16:50
by ISLe
常に残りの距離を30フレームかけて移動するというふうに見えるのですが。
それだと理論的には永久に到達しないということなのでは。

「指定されたポイントに特定のフレーム数で移動する」のに三角関数は必要ないので、題材として不適切なのではないかと。

Re: 指定フレームで目標地点に向かうプログラム

Posted: 2013年11月28日(木) 17:04
by お茶
皆様ご回答ありがとうございます。
なるほど・・・確かに今回の場合、角度必要ないですよね・・・。

cos、sinを使ってもう少し理解出来るようになりたいと、
サンプル作ってたのですが問題が悪かったです。。。

どうやってもスパイラルから抜けれなかったので助かりました。
ありがとうございます!

Re: 指定フレームで目標地点に向かうプログラム

Posted: 2013年11月28日(木) 18:12
by ISLe
三角関数を使う題材としては…
線を使って描いた戦車を、左右のキーで回転、上下のキーで前進後退、で動くものが良いと思います。
キャラクターは画像を回転させたものでもかまいません。
重要なのは回転とともに進行方向が変化するという点です。

おおむかしにアステロイドというシューティングゲームがありましたが、あれを真似て作ってみるというのも良いかもしれません。