第四十九章 为自机的射击加上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);
                }
        }
        /***修改请注意***/

}

运行结果


自动追踪处理将会在下一章中追加。

>>点此回到教程目录

results matching ""

    No results matching ""