【四圣龙神录的编程教室】第14章、来制作各种各样的弹幕数据吧

原文地址:

http://dixq.net/rp/14.html


那些麻烦的设定终于搞定了,那么这次我们就来做各种各样的弹幕数据吧。

下面是一直发射自机狙的弹幕函数001.

往 shotatan2 函数里,传入n,就可以返回自机和编号为n的敌机的角度,这样很简单就把射向自机的角度传给angle 变量了。

——————————————————————————————————————————————————————————————————

//100个里面有10发子弹、向自机的方向直线发射(始终瞄准自机)
void shot_bullet_H001(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<100 && t%10==0){//100次里面,每10次出现1次
                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);//角度
                        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   =3;//速度
                        se_flag[0]=1;
                }
        }
}

——————————————————————————————————————————————————————————————————

只是看各个变量的数值可能不是很明白,我们拿运行的结果来比较一下看看吧。

——————————————————————————————————————————————————————————————————

---- shotH.cpp的改动 ----


#include "../include/GV.h"

//只有一发子弹、向自机方向直线发射
void shot_bullet_H000(int n){
        int k;
        if(shot[n].cnt==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);
                        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   =3;
                        se_flag[0]=1;
                }
        }
}

//100发中有10发、往自机方向直线发射(始终瞄准自机)
void shot_bullet_H001(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<100 && t%10==0){//在100发里,每10发出现一次
                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);//角度
                        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   =3;//速度
                        se_flag[0]=1;
                }
        }
}

//100发中有10发、往自机方向直线发射(角度记忆)
void shot_bullet_H002(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<100 && t%10==0){
                if(t==0)
                        shot[n].base_angle[0]=shotatan2(n);
                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 =shot[n].base_angle[0];
                        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   =3;
                        se_flag[0]=1;
                }
        }
}

//100发中有10发、往自机方向变速地直线发射
void shot_bullet_H003(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<100 && t%10==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);
                        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   =1+5.0/100*t;
                        se_flag[0]=1;
                }
        }
}

//每0.5秒一次的圆形发射
void shot_bullet_H004(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<120 && t%20==0){
                double angle=shotatan2(n);
                for(int i=0;i<20;i++){
                        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 =angle+PI2/20*i;
                                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;
                        }
                        se_flag[0]=1;
                }
        }
}

//散射
void shot_bullet_H005(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   =3+rang(1.5);
                        se_flag[0]=1;
                }
        }
}

//散射(减速)
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[i].spd>1.5)//子弹的速度比1.5还要大的话
                        shot[n].bullet[i].spd-=0.04;//减速
        }
}

——————————————————————————————————————————————————————————————————

添加上面这些弹幕的同时,下面这里也做一下改动

/カウンタ 移動パターン 敵の種類 x座標 y座標 スピード 発射時間 弾幕種類 弾の色 体力 弾種類 待機時間 アイテム1 2 3 4 5 6
/cnt pattern knd x y sp bltime blknd col hp blknd2 wait item_n          
60 9 0 200 150 0 60 0 0 100 7 120 0 -1 -1 -1 -1 -1
200 9 0 180 150 0 60 1 0 100 8 120 0 -1 -1 -1 -1 -1
340 9 0 200 150 0 60 2 0 100 9 120 0 -1 -1 -1 -1 -1
480 9 0 180 150 0 60 3 0 100 0 120 0 -1 -1 -1 -1 -1
620 9 0 200 150 0 60 4 0 100 7 120 0 -1 -1 -1 -1 -1
760 9 0 180 150 0 60 5 0 100 8 120 0 -1 -1 -1 -1 -1
900 9 0 180 150 0 60 6 0 100 8 120 0 -1 -1 -1 -1 -1

移动模式9里面,把上面的弹幕种类都包含进去了。

我们往【弹幕种类】里,传入0~6,代表这次制作的0~6的弹幕数据。

Excel文件下载

————————————————————————————————————————————————————————————————————

---- shot.cpp的exntern声明部分和指针代入部分作如下修改 ----

extern void shot_bullet_H000(int);
extern void shot_bullet_H001(int);
extern void shot_bullet_H002(int);
extern void shot_bullet_H003(int);
extern void shot_bullet_H004(int);
extern void shot_bullet_H005(int);
extern void shot_bullet_H006(int);

void (*shot_bullet[SHOT_KND_MAX])(int) ={
        shot_bullet_H000,
        shot_bullet_H001,
        shot_bullet_H002,
        shot_bullet_H003,
        shot_bullet_H004,
        shot_bullet_H005,
        shot_bullet_H006,
};



---- function.h 里添加下面这行 ----

GLOBAL double rang(double);


---- define.h 做如下变更 ----

#define SHOT_KND_MAX 7
————————————————————————————————————————————————————————————————————

运行结果

http://dixq.net/rp/swf/14.swf


(又停了好久,我感觉我翻译完估计要几年,然后学着做又要几年。。。 之前玩剑灵,觉得没意思了。又蛋疼玩起dota了,也觉得浪费时间,于是现在又抽时间把这个继续做下去)

(2014-3-5 笔记:

从这章和上一章的代码对比,可以看到改动很少,主要就3个文件。一个是敌机进入的数据,保存在csv文件中,控制敌机登场的时间,移动模式,发弹时间和类型等等。
看了下这次的csv文件,可以看到敌机的移动都使用第9种移动方式,在某个时间出现,过了wait 时间后,就往上移动。这次主要是展示不同的弹幕。
0号弹幕和之前一样,在敌机位置生成一颗子弹,角度朝向自机移动。
1号弹幕,从0到100的时间刻度内,每过10个时间刻度,发射一枚子弹,朝向自机。(10枚每个发射时都朝自机方向)
2号弹幕,也是像上面这样100帧内发射10颗。但只有第一颗会朝自机方向,后面的子弹都按照这个角度发射。(10枚都朝同一个方向,也就是记下了角度的)
3号弹幕,10枚都朝向自机,每枚子弹都会比上一枚速度更快。
4号弹幕,120帧内每20帧发射一次,每次往四周平均发射20枚子弹,也就是圆圈形状。(for里循环20次,每次角度加2*pi/20)
5号弹幕,120帧内每2帧发射一枚子弹,角度随机在朝自机的角度+- pi/4 的范围内,速度在1.5~4.5的范围之内。(rang(n) 生成正负n之内的随机数)
6号弹幕,生成和5号一样,但速度在2~4的范围内,并且速度会慢慢减为1.5.


本人CSDN博客目录:

http://blog.csdn.net/tidus5


展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值