56 章

今回、本編のプログラムに追加を行う部分は前回の漢字弾幕と同じ手順です。

同じ変数を用いても良かったのですが、一応わかりやすくするために分けてあります。

なお、「dat/font/」の中に55章で作ったアイシャの画像弾幕座標データが入っています。

また、「dat/img/bullet/」の中にb14.pngという弾画像を追加しておきました。

変数の用意の仕方も、付け加える関数の作り方も全部一緒なので、詳細は省きますから、ソースコードを見ていきましょう。


--- define.h に以下を追加 --- 

//文字弾幕に使う弾の最大数(56)
#define AA_BULLET_MAX 4000
//文字弾幕に使う文字の最大数(56)
#define AA_NUM_MAX 10


--- struct.h に以下を追加 ---

//AA弾1つ分の情報(56)
typedef struct{
    float x,y;
}BlAA_t;

//漢字弾全体の情報(56)
typedef struct{
    int Num;//登録した個数
    BlAA_t BlAA[ AA_BULLET_MAX ];//登録する弾情報
}BlAAPoint_t;


--- GV.h に以下を追加 ---

GLOBAL BlAAPoint_t BlAAPoint[ AA_NUM_MAX ];//AA弾幕用変数(56)


--- func.h に赤字部を追加 ---

extern void boss_shot_bulletH011();
extern void boss_shot_bulletH012();//(53)
extern void boss_shot_bulletH013();//(53)
extern void boss_shot_bulletH014();//(56)

void (*boss_shot_bullet[DANMAKU_MAX])() =
{
        boss_shot_bulletH014,//漢字弾幕(56)

        boss_shot_bulletH012,//漢字弾幕(53)
        boss_shot_bulletH013,//漢字弾幕(53)


--- function.h に以下を追加 ---

        //AA弾幕の弾座標データロード(56)
        GLOBAL int load_AA_dat(char name[64], BlAAPoint_t *Bp);


--- load.cpp の load() に以下を追加 ---

    LoadDivGraph( "../dat/img/bullet/b14.png",  4 ,  4 , 1 ,  6 ,   6 , img_bullet[14]) ;//(56)


--- load.cpp に以下を追加 ---

//文字弾幕の弾座標データロード(53)
int load_AA_dat(char name[64], BlAAPoint_t *Bp){
    int i;
    char fname[128];
    FILE *fp;
    sprintf(fname,"../dat/font/%s.dat",name);//受け取ったファイル名をパスに入れる
    fp = fopen( fname , "rb" );//そのパスとファイル名を使ってファイルを開く
    if( fp == NULL )
        return -1;
    fread( Bp, sizeof(BlAAPoint_t), 1, fp );
    fclose(fp);
    return 0;
}


--- boss_shotH.cpp に以下を追加 ---

//漢字弾幕(56)
void boss_shot_bulletH014(){
    int i,k,t=boss_shot.cnt%400,t2=boss_shot.cnt;
    if( t2==0 ){
        input_phy_pos(FMX/2,FMY/2, 50);//真ん中へ移動
        if(load_AA_dat("アイシャAA", &BlAAPoint[0])!=0){
            printfDx("AA弾幕データロードエラー\n");
        }
    }
    if( t==50 ){
        for(i=0; i<BlAAPoint[0].Num; i++){
            if((k=search_boss_shot())!=-1){
                float sx = BlAAPoint[0].BlAA[i].x, sy = BlAAPoint[0].BlAA[i].y;
                if(sx==0 && sy==0){
                    printfDx("座標データの中に(0,0)の座標データがあります\n");
                    return ;
                }
                boss_shot.bullet[k].col   = 1;//弾の色
                boss_shot.bullet[k].x     = boss.x+sx;//座標
                boss_shot.bullet[k].y     = boss.y+sy;
                boss_shot.bullet[k].knd   = 14;//弾の種類
                boss_shot.bullet[k].angle = atan2( sy, sx );//角度
                boss_shot.bullet[k].flag  = 1;
                boss_shot.bullet[k].cnt   = 0;
                boss_shot.bullet[k].spd   = sqrt( sx*sx + sy*sy ); //スピード
                boss_shot.bullet[k].eff   = 0;
                boss_shot.bullet[k].state = 0;
            }
        }
        se_flag[0]=1;
    }
    for(i=0;i<BOSS_BULLET_MAX;i++){
        if(boss_shot.bullet[i].flag>0){
            int cnt = boss_shot.bullet[i].cnt;
            boss_shot.bullet[i].spd *= 1.001;
            if(cnt > 180){
                boss_shot.bullet[i].spd *= 1.01;
            }
        }
    }
}

実行結果


なぜか動画がキャプチャ出来ないので動画は後日取り直します。


- Remical Soft -