40 章

なんか今更ながら章を分けるほどのものでもなかったと気づきました(汗

この章では前の章の続きで、アイテムの接触判定と、

接触した時のアイテムによるステータス変化を行ってみましょう。

今回追加すべき処理はちょろっとです。

とりあえず当たり判定を定義し、その範囲にあればステータス変化させてみましょう。

当たり判定は英語でHitboxというので、豆知識として覚えておきましょうb


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

//アイテムの当たり判定
#define ITEM_HIT_BOX 20


---- out.cpp に以下赤字部を追加 ----

//アイテムとの接触
//アイテム 0:小パワー 1:小点 2:弾点 3:小金 4:大パワー 5:大金
void ch_and_item(){
        for(int i=0;i<ITEM_MAX;i++){
                if(item[i].flag>0){
                        double x=item[i].x-ch.x,y=item[i].y-ch.y;
                        if(x*x+y*y<ITEM_HIT_BOX*ITEM_HIT_BOX){//当たり判定内なら
                                switch(item[i].knd){//種類によって変更
                                        case 0: ch.power+=3; break;
                                        case 1: ch.point+=1; break;
                                        case 2: ch.score+=1; break;
                                        case 3: ch.money+=1; break;
                                        case 4: ch.power+=50;break;
                                        case 5: ch.money+=10;break;
                                }
                                if(ch.power>500)ch.power=500;
                                if(ch.point>9999)ch.point=9999;
                                if(ch.money>999999)ch.money=999999;
                                if(ch.score>999999999)ch.score=999999999;
                                item[i].flag=0;
                                se_flag[34]=1;//ゲット音
                        }
                }
        }
}

//当たり判定メイン
void out_main(){
    cbom_and_enemy();//敵にボムを喰らわせる
    cshot_and_enemy();//自機ショットと敵との処理
    enemyshot_and_ch();//敵ショットと自機との処理
    ch_and_item();//アイテム接触処理
}


---- load.cpp のload関数に以下を追加 ----

        sound_se[34]=LoadSoundMem("../dat/se/item_get.wav");


ステータスを変化させ、値を増加させる時は上のように上限値を決めておきましょう。

私はまさか9億点もスコア稼ぐ人はいないだろうと思って上限値決めてなかったのですが、

これをやっていなかったせいで、上限値を超えた人のプレイでバグを引き起こしました(汗

スコアなどのマイナスになりえないものはunsigned intにするというのも一つの方法ですが、

上記のように設定してやれば問題ないですね。

次の章で説明しますが、この上限値は意味のある上限値です。

実行結果



- Remical Soft -