自機を狙わせる

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

自機を狙わせる

#1

投稿記事 by Tororo » 15年前

お久しぶりです。
今STGを作っています。
困っているのは、自機を狙わせる方法です。
アングルは1~0で360°をあらわしているので、
とりあえず
float GetPlayerAngle(floatx, float y){
      return atan2f(P->Y-y, P->X-x)/PHI_F/2;(敵キャラクラスの中にPと言うポインタのプレイヤーが定義されています)
}
と定義しているのですが、なぜかプレイヤーが動いても、動かなくても、ヘンな方向に出てしまいます。
どうしたらいいんでしょうか?

開発環境 
VC++ DXライブラリ

わかる範囲 ポインタ、基本はわかります。 簡単なゲームも作れます。

ひよこ

Re:自機を狙わせる

#2

投稿記事 by ひよこ » 15年前

/PHI_F/2 これってなんでしょうか?
龍神録のソースから考えるとatan2f(P->Y-y, P->X-x);となると思います。間違っているかもしれません。

Tororo

Re:自機を狙わせる

#3

投稿記事 by Tororo » 15年前

>>ひよこs
PHI_FはDXライブラリ内で定義されている円周率(3.1415・・・・f)です。
たしかatan2fの戻り値はラジアン?だったはずなので、0~1で表すために、円周率で割って、2で割ってます。

DVDM

Re:自機を狙わせる

#4

投稿記事 by DVDM » 15年前

>>Tororoさん
仮の話ですが自機が(10, 10)、敵が(50, 50)の位置にいた時、atan2fで返ってくる値は
0.785・・・度数法で45°です。
atan2で既に0~1の間で返ってきています。
なので、/PHI_F/2はいらないような気がします。

float GetPlayerAngle(floatx, float y)
{
return atan2f(P->Y-y, P->X-x);
}

この、GetPlayerAngle(~)が自機と対象となるオブジェクトとの角度を取得する関数だとすると、


Angle = GetPlayerAngle(x, y);
これで、自機と対象となるオブジェクトとの角度を取得しています。
対象となるオブジェクトが敵の弾だと仮定すると、あとは敵の弾を動かす処理だけになります。

敵の弾のX += 敵の弾の速度 * cosf(Angle);
敵の弾のY += 敵の弾の速度 * sinf(Angle);

間違っていたらごめんなさい;

Tororo

Re:自機を狙わせる

#5

投稿記事 by Tororo » 15年前

>>DVDMさん
玉はソノ通りに動かしています^^; 
が、/PHI_F/2は無くても同じ結果でした。
現状では、玉が自機か動いてなくても動いていても、0.75ぐらいの角度に飛んでいってしまいます><
とりあえずデバッガで探ります^^;

DVDM

Re:自機を狙わせる

#6

投稿記事 by DVDM » 15年前

>>Tororoさん
合っても無くても同じ結果ですか・・・。
自分で作ってるSTGのソース部分に atan2fで返ってくる値に、円周率/2をすると
全然違う方向に飛んでいくんですけどね;


考えられる原因は返ってきた角度を更にいじっているとか、
実はAngleがfloatやdouble型ではなかったとか、
与える座標の情報がおかしいとか(初期化ミスやループミスなど)でしょうか。
少なくとも「/PHI_F/2」は要らないと思いますよ~。


現時点ではどのように座標を送ったりしているのかが解りませんので
これ以上の解答はソースを添付しないと厳しいですかね;
(出来たら、問題だけを再現できるプロジェクトを上げて頂けると助かります!)

Tororo

Re:自機を狙わせる

#7

投稿記事 by Tororo » 15年前

>>DVDMさん
ソースは何も考えずにクラスにしてたり、ヘンなことがいっぱいなので、見せれません^^;
余りにも汚くて・・ そこから直さないとw
とりあえず関わってしそうな部分です。
class EnemyBase : public Players
{
public:
    Players *player;
    float X, Y, Speed;
    int Money, cnt, ShotMode, Move_Num, Graph_Num, Bomm_cnt, Point;
    bool Flag, Bom;
         EnemyBase(void)
         {
        X = Y = Speed = 0.0f;
        Money = cnt = ShotMode = Move_Num = Graph_Num = Bomm_cnt = 0;
        Flag = false;
        Bom = false;
        player = new Players();
         }

         ~EnemyBase(void)
          {
          }

    int Search_Enemy(EnemyBase E[/url], int Num){
        for(int i=0;i<Num;i++){
            if(E.Flag == 0){
                return i;
            }
        }
        return -1;
    }

    float GetPlayerAngle(float x, float y){
        return atan2f(player->Y-y, player->X-x);
    }

};

class Players
{
public:
    bool Death;生きてますか?
    float X, Y, Speed;
    int Point, Score, Power, Money, cnt, ShotMode, Num;
    int img[3], Key;画像ハンドル、キー入力
    Players(void);全部初期化
    ~Players(void);何もしてない
    void Draw();間違いなく関係ないw
         void Load(){
        LoadDivGraph("Date\\Chara\\Player\\Player.PNG", 3, 3, 1, 32, 32, img);
        X = 200.0f;
        Y = 380.0f;
        Speed = 5.0f;
        Point = Score = Power = Money = cnt = ShotMode = Num = 0;
         }
};

Tororo

Re:自機を狙わせる

#8

投稿記事 by Tororo » 15年前

関係ないんですけど、貰ったポイント666って不吉・・・
6は不吉な数字だったはずだから・・

Tororo

Re:自機を狙わせる

#9

投稿記事 by Tororo » 15年前

>>皆さん
Load関数がううまく作動していませんでした^^;
答えてくれた皆さんアリガトウございましたm(_ _)m

Ma

Re:自機を狙わせる

#10

投稿記事 by Ma » 15年前

>>Tororoさん
>アングルは1~0で360°をあらわしているので、

>>DVDM
>atan2で既に0~1の間で返ってきています。
>なので、/PHI_F/2はいらないような気がします。


なんか、どちらかが盛大な勘違いをしてらっしゃる気が・・・?
Tororo さんが言っているのは、 0が0度 0.5で180度 1.0で360度という事でありラジアンの値とはまったく関係がない勝手に作った単位です。すなわち度数の360分の1の単位です。

それに対してDVDM さんがいっているのは、ラジアンの話ですよね。
しかも atan2 の戻り値って [-pi,+pi] ラジアンのはずだと思ったのですが。。。
atan2f は使ったことないので知りませんが、atan2 と大差ないですよねきっと。

それを踏まえて、考えるとTororo さんが求めている回答はこんなんじゃないでしょうか?


float GetPlayerAngle(floatx, float y){
float degree = atan2f(P->Y-y, P->X-x)*180/PHI_F;//これで度数
float tororoUnit = degree/360;//tororoさんが作った単位
return tororoUnit;
}

これをまとめると、
float GetPlayerAngle(floatx, float y){
return atan2f(P->Y-y, P->X-x)/PHI_F/2;//これでtororo単位
}


すなわち、最初のtororoさんの式は間違っていません。

ではなぜ、正しく計算できないのか?

もしかすると、GetPlayerAngleから戻ってきた値を絶対角度として計算していませんか?
atan2 はふたつのベクトルの相対角度、いわば間の角度です。

GetPlayerAngle をどのように使っているのかというソースがないので断定はできませんが。。。。
しくみは内積と外積でそれを割って出るんですが…っていう御託はどうでもいいですね。
(どうでもよくなかったら、内積と外積を調べてみてください)

それ(相対角度であること)を知っている上で質問しているなら、私が間違っているかもしれません。
そのときはすいません。

Tororo

Re:自機を狙わせる

#11

投稿記事 by Tororo » 15年前

何かすれ違ってます^^;
最後のPHI_F/2は、いりました。
ただただ私の初期化忘れでした><
本当にお騒がせしましたm(_ _)m

DVDM

Re:自機を狙わせる

#12

投稿記事 by DVDM » 15年前

>>Maさん
間違いを御指摘下さいましてありがとうございます。
「アングルは1~0で360°をあらわしている」ってのを勝手に勘違いしていました。

>しかも atan2 の戻り値って [-pi,+pi] ラジアンのはずだと思ったのですが。。。
>atan2f は使ったことないので知りませんが、atan2 と大差ないですよねきっと。
仰る通り、-π~πラジアンの範囲です。
(念のため調べてきました:http://msdn.microsoft.com/ja-jp/library ... 80%29.aspx)


>>Tororoさん
こちらこそお騒がせして申し訳ございませんでした;
問題解決おめでとうございます!

閉鎖

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