第四十九章 为自机的射击加上Option吧
(译者注:Option即オプション,在东方之类的STG里面有特殊意义的东西,说简单点就是选择自机的时候选到的武器,而后面出现的Bonbon也就是围绕在自机周围放子弹的东西,具体可以看图,这里我不知道汉化版中的通用称谓是什么,这里我直接写为Option)
(搬运者注:也许叫“僚机”,“附属武器”?)
这一次我们为自机的射击加上Option吧。
自动追踪的处理我们将在下一章中讲解,本章中我们先准备好发射Option所需要的Bonbon,然后显示它,最后再来发射Option。
那么和之前一样,我们来定义Option的Bonbon的结构体option_bb,声明并计算之。
由于Option的图像现在是固定的,因此在初始化函数中就事先设定好了。
—-在 struct.h 中进行一下追加 —-
//和角色射击相关的结构体
typedef struct{
int flag; //flag
int power; //power
int cnt; //计数器
int knd; //种类
/***修改请注意***/
int img; //图像(49)
/***修改请注意***/
double x,y; //坐标
double angle; //角度
double spd; //速度
}cshot_t;
//射击的Option的发射源Bonbon
/***修改请注意***/
typedef struct{
int flag; //flag
int img; //图像
int cnt; //计数器
double x,y; //坐标
}option_bb_t;
/***修改请注意***/
—-在 GV.h 中进行以下追加 —-
GLOBAL int img_cshot[3]; //自机射击用图像(49)
GLOBAL option_bb_t option_bb[2];//Option的发射源Bonbon (49)
—-在 load.cpp 中进行以下追加 —-
img_cshot[2]=LoadGraph("../dat/img/char/ball.png");
—-在 ini.cpp 中进行以下部分变更 —-
memset(option_bb,0,sizeof(option_bb_t)*2);//(49)
option_bb[0].img=img_cshot[2];//代入Option的Bonbon的图像 (49)
option_bb[1].img=img_cshot[2];
Option是独立地在运动,发射时从Option开始。
自机的power在100~299的时候从Option发射2路子弹。
超过299的话发射4路子弹。
Option的基本位置在定义中已经写好了,4路子弹的各自的角度在option0ang中设定。
Option的Bonon在calc_option_bb中计算。
低速移动中将Option靠近自机并固定不动。
—-在 cshot.cpp 中进行以下追加 —-
/***修改请注意***/
#define OPTION_X 25
#define OPTION_Y 35
int option0num[2] ={2,4};
double option0ang[4] = {-PI/2,-PI/2,-PI/2-PI/4,-PI/2+PI/4};//Option的发射角度(49)
/***修改请注意***/
//返回自机射击可以登录的编号
int search_cshot(){
for(int i=0;i<CSHOT_MAX;i++){
if(cshot[i].flag==0)
return i;
}
return -1;
}
//登录通常射击
void ch0_shot_pattern(){
int k;
for(int i=0;i<cshot0num[ch.power<200?0:1];i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=-PI/2;
cshot[k].spd=20;
cshot[k].x=ch.x+cshot0pos_x[i];
cshot[k].y=ch.y+cshot0pos_y[i];
cshot[k].power=23;
cshot[k].knd=0;
cshot[k].img=img_cshot[0];//图像编号代入(49)
}
}
se_flag[2]=1;//发射音有效
/***修改请注意***/
if(ch.power>=100){
for(int i=0;i<(ch.power<300?2:4);i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=option0ang[i];
cshot[k].spd=20;
cshot[k].x=option_bb[i%2].x;
cshot[k].y=option_bb[i%2].y;
cshot[k].power=20;
cshot[k].knd=1;
cshot[k].img=img_cshot[1];//画像番号代入(49)
}
}
}
/***修改请注意***/
}
//低速通常射击登录
void ch1_shot_pattern(){
int k;
for(int i=0;i<cshot0num[ch.power<200?0:1];i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=-PI/2;
cshot[k].spd=20;
cshot[k].x=ch.x+cshot0pos_x[i]/3;//如果低速中的话将位置往中心偏移
cshot[k].y=ch.y+cshot0pos_y[i]/2;
cshot[k].power=23;
cshot[k].knd=0;
cshot[k].img=img_cshot[0];//图像编号代入(49)
}
}
se_flag[2]=1;
/***修改请注意***/
if(ch.power>=100){
for(int i=0;i<(ch.power<300?2:4);i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=option0ang[i];
cshot[k].spd=20;
cshot[k].x=option_bb[i%2].x;
cshot[k].y=option_bb[i%2].y;
cshot[k].power=20;
cshot[k].knd=1;
cshot[k].img=img_cshot[1];//图像编号代入(49)
}
}
}
/***修改请注意***/
}
//Option的Bonbon计算
/***修改请注意***/
void calc_option_bb(){
if(ch.power>=100){//power在100以上的话增加Option
for(int i=0;i<2;i++){
if(CheckStatePad(configpad.slow)==0){//如果不是低速移动中的话
option_bb[i].x=ch.x+OPTION_X*(i==0 ? -1 : 1);
option_bb[i].y=ch.y+OPTION_Y+sin(PI2/150*option_bb[i].cnt)*20;
}
else{
option_bb[i].x=ch.x+OPTION_X/2*(i==0 ? -1 : 1);
option_bb[i].y=ch.y+OPTION_Y/2;
}
option_bb[i].cnt++;
}
if(option_bb[0].flag==0)
option_bb[0].flag = option_bb[1].flag = 1;
}
else{
if(option_bb[0].flag==1)
option_bb[0].flag = option_bb[1].flag = 0;
}
}
/***修改请注意***/
(略)
//和角色射击相关的函数
void cshot_main(){
/***修改请注意***/
calc_option_bb();//Option的Bonon计算 (49)
/***修改请注意***/
calc_cshot();//射击的启动计算
enter_shot();//登录射击
}
—-在 graph.cpp 中进行以下变更 —-
//自机绘制
void graph_ch(){
double sx,sy,ny=(sin(2.0*PI*(count%50)/50)*3),ang=2.0*PI*(count%120)/120;
if(CheckStatePad(configpad.slow)>0)//低速移动中的话
sx=15,sy=15+ny;//拉近
else
sx=30,sy=30+ny;//在普通的位置
/***修改请注意***/
// DrawRotaGraphFdF( ch.x-sx, ch.y+sy, 1.0f, ang, img_chetc[2], TRUE );
// DrawRotaGraphFdF( ch.x+sx, ch.y+sy, 1.0f, -ang, img_chetc[2], TRUE );
/***修改请注意***/
if(ch.mutekicnt%2==0){//无敌状态的话亮灭
//自机显示
DrawRotaGraphFdF(ch.x,ch.y,1.0f,0.0f,img_ch[0][ch.img],TRUE);
if(CheckStatePad(configpad.slow)>0)//低速移动中的话显示碰撞判定(译者注:即碰撞判定点)
DrawRotaGraphFdF( ch.x, ch.y, 1.0f, 2.0*PI*(count%120)/120, img_chetc[0], TRUE );
}
}
//自机射击的绘制
void graph_cshot(){
for(int i=0;i<CSHOT_MAX;i++){
if(cshot[i].flag>0){
DrawRotaGraphFdF(cshot[i].x,cshot[i].y,1,cshot[i].angle+PI/2,cshot[i].img,TRUE);
}
}
/***修改请注意***/
for(int i=0;i<2;i++){//(49)
if(option_bb[i].flag>0){
DrawRotaGraphFdF(option_bb[i].x,option_bb[i].y,1,0,option_bb[i].img,TRUE);
}
}
/***修改请注意***/
}
运行结果