ページ 11

ボスショット

Posted: 2009年8月03日(月) 23:25
by 華穂
こんばんわ。
今日はちょっと徹夜覚悟でボスを作ろうかと考えてます。
そこで、ひとまずクラスを作ってみました。
しかし・・ここで問題が発生しまして・・とりあえず、ソースを。



class Boss
{
int Boss1[2], Boss1X, Boss1Y, Boss1W, Boss1H;
int BTama, BTamaX[2], BTamaY[2];
int BLife1, BTSpeed;
int BT_FLag[2];

int ZikiX, ZikiY;

float Radian, Degree, r;
float S, C;
float Target_angle;

public:

Boss();
void boss1();

};

Boss::Boss()
{
//ボスの画像
LoadDivGraph("Boss1.bmp", 2, 2, 1, 64, 64, Boss1);
BTama = LoadGraph("BTama.bmp");

//自機の設定
ZikiX = 0; ZikiY = 176;

//ボス1設定
BLife1 = 30;
Degree = 0;
r = 100;
BT_Flag[0] = 0;
BT_Flag[1] = 0;
BTSpeed = 6;
}

//ボス1の挙動
void Boss::boss1()
{
//ラジアン計算
Radian = Degree * ( PI / 360 );

//角度を1ずつ追加
Degree ++;


//サイン・コサインを求める
S = 1.2*sin(Radian);
C = 2.7*cos(Radian);

//座標を、それぞれサイン・コサインに半径を掛け、画面の半分の値に足す。
Boss1X = 305+r*C;
Boss1Y = 160+r*S;

//移動にて、反転した画像を表示
if(Boss1X-16 > 320)
{
DrawGraph( Boss1X, Boss1Y, Boss1[0], TRUE);
}
else
{
DrawGraph( Boss1X, Boss1Y, Boss1[1], TRUE);
}

//弾の発射
for(i = 0; i < 2; ++i)
{
if(BT_Flag == 0 )
{
BTamaX = Boss1X + 18;
if(i == 0)BTamaY = Boss1Y + 24;
else BTamaY = Boss1Y + 40;

if(BTamaX > 320)
{
//自機から見た敵の角度
Target_angle = atan2(BTamaY - ZikiY, BTamaX - ZikiX);

BTamaX -= cos(Target_angle) * BTSpeed;
BTamaY -= sin(Target_angle) * BTSpeed;
}
else
{
//自機から見た敵の角度
Target_angle = atan2(BTamaY - ZikiY, BTamaX[i] - ZikiX);

BTamaX[i] += cos(Target_angle) * BTSpeed;
BTamaY[i] += sin(Target_angle) * BTSpeed;
}
}
//弾の移動
if( BT_Flag[i] == 1 )
{
if(Boss1X <= 320)
{
BTamaX[i] -= BTSpeed;
}
else
{
BTamaX[i] += BTSpeed;
}

//弾が画面外から出たら消滅
if( BTamaX[i] >= 640 || BTamaX[i] <= -16 )
{
BT_Flag[i] = 0 ;
}
DrawGraph((int)BTamaX[i], (int)BTamaY[i], BTama, TRUE);
}
}
}






これが、ステージ3で、雑魚敵を全滅させた後に出てくるボス1です。
ここのボスは、移動を楕円の形でぐるぐると動きます。(今のソースでは、時計回りの動きですが)
楕円ということで、そこはまぁなんとかできたのですが、問題がちょっと発生しまして・・。

それは、このボスが弾を発射してくれないということです。
このボスは、弾を上下から1発ずつ、つまり計2発の弾を同時に発射し、その弾は自機めがけて
特攻してくるというものです。(上記のソースなら、X軸320を過ぎたら、自機の角度を取り
向かってきます。ホーミングではありません)

特攻ということで、そこは雑魚敵の特攻をまねて作ってみたのですが・・どうにもうまくいかず。
また、ボスということで、自機とは違い弾は間をおいて打ってくるという形にしたいのですが・・
どのようにすればいいのでしょうか?

もちろん、それにはいろいろなやり方があると思っています。
今のところ、考えているのは

1、秒数を数えて、発射する(つまり、5秒たったら発射)
2、発射した弾が、画面外に出たらフラグを0とし再び発射

です。

が、それを考えていても、弾が発射されていない又は弾の画像がうまく表示されていなければ
まったくもって意味がないのでそこは置いときたいと思います。(というより、それを考えて
いないから表示されないのでしょうか?)



今日から3日間は徹夜覚悟で頑張りたいので、どうかご指摘・アドバイス・ご指南の方を
よろしくお願いします。

Re:ボスショット

Posted: 2009年8月04日(火) 02:09
by 夢夢
BT_Flagを1にしている部分が見当たりませんが、記述していますか?

Re:ボスショット

Posted: 2009年8月04日(火) 03:06
by 華穂
っあ。
返信が遅くなってすみません、言われてみれば『BT_Flag = 1』を
記述していませんでした。

指摘されるまでまったく気づきませんでしたね・・。
さすがにソースが長くなっているため、細かく見ているつもりでも
見落としていました・・・。

おそらくそれを付け足せば弾が表示されるのでしょうが・・ちょっと今
大変なことに(?)なっておりまして・・何やらソースをコンパイルして起動
させてもすぐに閉じてしまうんですよね。

おそらく、どこかで強制的に終了させているか、危ないコードでも書きこんでいるか・・
それでも助かりました!

夢夢様、毎回毎回本当にご親切なアドバイスとご指摘、ありがとうございます!
私もパンチミスはなくしたいと思っていても・・自分では気づかないところがたくさんあって
正直こちらのサイトを見つけた時にはうれしかったです。


夢夢様、今日からしばらくは何度も分からなくて書きこむことが多くなると思いますが、
その時はどうぞ、よろしくお願いします。