第五十六章 试着制作图像弹幕吧
这次,对本篇的程序进行追加的部分和上一章制作汉字弹幕是同一个顺序。
虽然使用一样的变量也没问题,不过好歹为了容易理解因此我们分开使用不同的变量。
另外,在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;
}
}
}
}
运行结果
由于不知道为什么没法录制动画,动画我会在日后加上。(译者注:时至今日原作者仍然没有加上动画)