ページ 11

敵キャラの動き2

Posted: 2009年7月27日(月) 17:04
by 華穂
またまた失礼します。
華穂です。


え~と、実は昨日アドバイスをいただいてsin波についてはあの後ソースで実際
にできたのですが、敵の動きその1にある、特攻について今日いろいろありまして、
最初はホーミングを考えていたのですが、特攻なのだから・・と変更があり、悶々と
考えてみましたが、どうしてもここでプログラムが分からないため書き込みをさせていただきました。

さて、分からない特攻の動き・・というものですが、まずは図的なもので簡単に説明しますと。
☆・・自機 ●・・敵
                   ①
              /―――●
             /
           ☆  
             \
              \
               \―――●
                    ②
といったものです。(大雑把ですみません)
つまり、敵はある程度前に進んだら自機のいる方向に向かって急降下(①)又は急上昇(②)する
といった動きです。(左端を通過する)(スピードは一定)
ホーミングではありませんので、あくまで自機を追いかけないようにしたいのですが・・
そこまでの動きについてまだうまく頭の中でプログラムが立てられず困ってしまいました。

まだ途中ですが、「こうかなぁ?」といった形のものがあるのですが、おそらくそれも
間違ってはいると思います。
が、一応短いですがソースを大雑把に記します。(中途半端で挫折してしまいました)


☆TEZako = 特攻敵 , Ziki = 自機

int TEZX, TEZY;
int EZSpeed;
float i;
EZSpeed = 3;

TEZX = TEZakoX - ZikiX;
TEZY = TEZakoY - ZikiY;

i = atan( TEZX * TEZX - TEZY * TEZY );



です。
おそらくここで既に間違っているはずです。
えと、atanとかを使えればなんとかいけるのかなぁ?とは思っているのですが
どうなんでしょうか?



ご検討・アドバイス・ソースのご指摘よろしくお願いします。

Re:敵キャラの動き2

Posted: 2009年7月27日(月) 17:14
by ねこ
自分から見た対象への角度を求める場合は
double target_angle = atan2( 対象.y - 自分.y, 対象.x - 自分.y );
で求まります。

この角度に速度をかけて座標に加算するのがホーミング、
どこかのタイミングで1回だけ行い、その角度を保持して動くのがロック動作です。

Re:敵キャラの動き2

Posted: 2009年7月27日(月) 17:28
by 華穂
はは~・・なるほど・・。


そういったものがあるのですね!
さっそく試して理解を深めたいと思います!
もしかしたら、「??」となってまた聞くことがあるかもしれませんが、
その時はどうぞよろしくお願いします。


ねこ様。
アドバイス、ありがとうございました!

Re:敵キャラの動き2

Posted: 2009年7月27日(月) 18:52
by 華穂
はい。
またまたすみません。


ねこ様に教えていただいた方法も使い、試してはみたんですが・・。
なぜか、弾が発射されて消えるまでの間でしか動かないんです。
しかも、止まっているときは私の眼の錯覚でしょうか?
ブルブル震えてます(笑)ちょっとこれはやばいんじゃないかと思いまして・・・。



ま、まだなにや足りない・・間違っていますでしょうか?


えと、ソースは・・。
ざっくりと記すと。




int TEZX, TEZY;
int EZSpeed;
float Target_angle;
EZSpeed += 3;

Target_angle = atan2(TEZakoY - ZikiY, TEZakoX - ZikiX);

//TEZX = TEZakoX - ZikiX;
//TEZY = TEZakoY - ZikiY;

TEZakoX -= cos(Target_angle * EZSpeed);
TEZakoY -= sin(Target_angle * EZSpeed);

DrawGraph( TEZakoX, TEZakoY, TEZako, TRUE);




と書いてみましたが・・・何が足りなくて、何が「あ、これは駄目」
なのかちょっと私一人じゃ気づけません。


どなたか、どうぞご指摘・アドバイス・ご検討よろしくおねがいします。

Re:敵キャラの動き2

Posted: 2009年7月27日(月) 19:17
by ねこ
EZSpeed = 3;
TEZakoX [color=red>+[/color]= cos(Target_angle * EZSpeed); 
TEZakoY [color=red>+[/color]= sin(Target_angle * EZSpeed);
で、動くんじゃないかな。

Re:敵キャラの動き2

Posted: 2009年7月27日(月) 19:28
by 華穂
・・・ぁ。
本当ですね。

はい!確かに動きました!!

こ、こんなパンチミス・・情けないです。
でも、本当に助かりました!


ねこ様、ご指摘・アドバイスありがとうございました!!!

Re:敵キャラの動き2

Posted: 2009年7月27日(月) 19:41
by TRUTH
こんにちはー。
全体の構成がわからないので何とも言えませんが…
流れを見る限り、その関数は何度も呼ばれますよね?


Target_angle = atan2(TEZakoY - ZikiY, TEZakoX - ZikiX);
これは毎回呼ばれるのではなく、特攻の態勢に入り角度の変わる瞬間(1回きり)だけ
上手くいくと思います。


TEZakoX -= cos(Target_angle * EZSpeed);
TEZakoY -= sin(Target_angle * EZSpeed);
ですが、EZSpeed += 3; かつ Target_angle が毎回変わってしまっている(上記より)ので
-1<=cos<=1,-1<=sin<=1の間の様々な値をとり、結果としてブルブル震えているんだと思います。

TEZakoX -= cos(Target_angle)*EZSpeed;
TEZakoY -= sin(Target_angle)*EZSpeed;

とすれば、Target_angleが1度だけ呼ばれると定数のようになり
速度をかけることで、上手くいくと思います。

Re:敵キャラの動き2

Posted: 2009年7月27日(月) 21:35
by 華穂
TRUTH様、返信遅くなって申し訳ありませんっ!!


なるほど・・そういうことなんですね。
私も「??どうしていけば・・」とちょこちょこいじっては
いたんですが、そうすればいいんですね!

アドバイスとご指摘のほう、ありがとうございました。
これからまた、少し作っていきたいと思います。


また、何か問題が発生したら、ぜひともよろしくお願いします。