敵の撃つ弾について

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

敵の撃つ弾について

#1

投稿記事 by arc » 16年前

こんにちは初心者ですが、毎日チェックして参考にさせてもらっているarcというものです。

C言語で龍神録を元にシューティングを作っているのですが、雑魚敵に分裂弾を撃たせたいのですが、どうプログラミングしていいのかわかりません。よろしければ教えていただけませんか?

Dixq (管理人)

Re:敵の撃つ弾について

#2

投稿記事 by Dixq (管理人) » 16年前

こんにちは^^
参考にしてくださってありがとうございます☆

では
http://dixq.net/rp/14.html
こちらを例に紹介します。
こちらの中央下部分に

//ばらまきショット(減速)
void shot_bullet_H006(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<120 && t%2==0){
                if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                        shot[n].bullet[k].knd   =enemy[shot[n].num].blknd2;
                        shot[n].bullet[k].angle =shotatan2(n)+rang(PI/4);
                        shot[n].bullet[k].flag  =1;
                        shot[n].bullet[k].x     =enemy[shot[n].num].x;
                        shot[n].bullet[k].y     =enemy[shot[n].num].y;
                        shot[n].bullet[k].col   =enemy[shot[n].num].col;
                        shot[n].bullet[k].cnt   =0;
                        shot[n].bullet[k].spd   =4+rang(2);
                        se_flag[0]=1;
                }
        }
        for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分ループ
                if(shot[n].bullet.spd>1.5)//速度が1.5より大きいものがあれば
                        shot[n].bullet.spd-=0.04;//減速
        }
}

こんなのありますよね。この青字の部分は現在発射中の弾を見つけて制御しているのです。
ですので、ここで適切な弾を見つけて発射させてやればいいです。

サンプル書いてみました。まず弾の識別番号stateを0として大玉を発射します。
大玉を常に計算しつつ、発射後1秒たった瞬間に、
その位置からさらに100個弾を発射しています。

下の意味がよくわからなければまた聞いて下さい。
14章のshotH.cppにある
void shot_bullet_H000(int n)
関数を以下の関数に書き換えて実行してみて下さい。



void shot_bullet_H000(int n){
    int t=shot[n].cnt;
    int k;
    if(t==0){
        if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
            shot[n].bullet[k].knd    =0;
            shot[n].bullet[k].angle    =PI/2;
            shot[n].bullet[k].flag    =1;
            shot[n].bullet[k].x        =enemy[shot[n].num].x;
            shot[n].bullet[k].y        =enemy[shot[n].num].y;
            shot[n].bullet[k].col    =0;
            shot[n].bullet[k].cnt    =0;
            shot[n].bullet[k].spd    =2;
            shot[n].bullet[k].state =0;//分裂させる弾ですよ
            se_flag[0]=1;
        }
    }
    for(int i=0;i<SHOT_BULLET_MAX;i++){
        if(shot[n].bullet.flag==1){//現在登録されている弾なら
            if(shot[n].bullet.state==0){//分裂させる弾なら
                if(shot[n].bullet.cnt==60){//発射して1秒後なら
                    for(int s=0;s<100;s++){
                        if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                            shot[n].bullet[k].knd    =6;
                            shot[n].bullet[k].angle    =rang(PI);
                            shot[n].bullet[k].flag    =1;
                            shot[n].bullet[k].x        =shot[n].bullet.x;
                            shot[n].bullet[k].y        =shot[n].bullet.y;
                            shot[n].bullet[k].col    =0;
                            shot[n].bullet[k].cnt    =0;
                            shot[n].bullet[k].spd    =1.5+rang(0.5);
                            shot[n].bullet[k].state =1;//分裂させない弾ですよ
                            se_flag[0]=1;
                        }
                    }
                    shot[n].bullet.flag=0;//元の弾消す
                }
            }
        }
    }
}
 

arc

Re:敵の撃つ弾について

#3

投稿記事 by arc » 16年前

解決しました!
わかりやすい説明の上、ソースまで書いていただいてありがとうございます^^

そして質問を見返すとかなり抽象的な文章でしたのでお詫びします。
管理人様どうもありがとうございます。

閉鎖

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