49 章

今回は自機のショットにオプションを付けてみましょう。

ホーミング処理は次回に任せるとして、今回はオプションを発射するためのぼんぼんを用意し、

表示し、そこからオプションを発射させてみます。

ではいつものようにオプションのぼんぼん名づけてoption_bbの構造体を用意し、宣言し、計算させてやりましょう。

オプションの画像は現在固定なので、初期化関数で予め入れておきます。



---- struct.h に以下を追加 ----

//キャラクターショットに関する構造体
typedef struct{
        int flag;               //フラグ
        int power;              //パワー
        int cnt;                //カウンタ
        int knd;                //種類
        int img;                //画像(49)
        double x,y;             //座標
        double angle;           //角度
        double spd;             //スピード
}cshot_t;

//ショットのオプション発射元ボンボン
typedef struct{
        int 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];//オプション発射元ボンボン(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];//オプションボンボンの画像代入(49)
        option_bb[1].img=img_cshot[2];


オプションはオプションで独立して動き、オプションから発射させます。



自機のパワーが100〜299の時はオプションから2つ発射。

それ以上の時は4つ発射します。

オプションの基本位置は定義で用意しておき、4つの各角度はoption0angで設定しておきます。

オプションのぼんぼんはcalc_option_bbで計算します。

低速移動中はオプションを自機に近づけ固定します。


---- 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};//オプションの発射角度(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)
                        }
                }
        }
}

//オプションのぼんぼん計算
void calc_option_bb(){
        if(ch.power>=100){//パワー100以上ならオプションをつける
                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();//オプションのぼんぼん計算(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);
                }
        }
}




実行結果


ホーミング処理は次の章で追加していきましょう。


- Remical Soft -