原文地址:
下面是一直发射自机狙的弹幕函数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
————————————————————————————————————————————————————————————————————
运行结果
(又停了好久,我感觉我翻译完估计要几年,然后学着做又要几年。。。 之前玩剑灵,觉得没意思了。又蛋疼玩起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博客目录: