第五十六章 试着制作图像弹幕吧

>>点此回到教程目录

这次,对本篇的程序进行追加的部分和上一章制作汉字弹幕是同一个顺序。

虽然使用一样的变量也没问题,不过好歹为了容易理解因此我们分开使用不同的变量。

另外,在55章中做好了的爱莎的图像弹幕坐标数据放到了“data/font/”中

其次,我们在“data/img/bullet/”中追加了名为b14.png的子弹图像。

由于变量定义的工作、补充的函数的实现都在了一起,因此我省略了详细的说明,一起来看源码吧。

—在 define.h 中进行以下追加—

//文字弹幕所使用的子弹的最大数(56)
#define AA_BULLET_MAX 4000
//文字弹幕所使用的文字的最大数(56)
#define AA_NUM_MAX 10

—在 struct.h 中进行以下追加 —

//每一个AA子弹的信息(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;
            }
        }
    }
}

运行结果


由于不知道为什么没法录制动画,动画我会在日后加上。(译者注:时至今日原作者仍然没有加上动画)

>>点此回到教程目录

results matching ""

    No results matching ""