41 章

今回は右側のボードの表示をやってみましょう。

今回ポイントとなるのは、複数の桁がある数字の表示を画像で行う事です。

普通数字の表示は%dで表示させれば桁など気にせずに表示できていましたが、

今回は0-9までの10種類の画像を組み合わせて複数の桁を表示します。

これには「余り」という概念が大事です。10で割った余りを表示すればその桁を表示することが出来ます。


今「29」という数字があったとして、0-9はそれぞれ0-9番の画像番号に対応しているとします。

まず一桁目の表示です。

int score = 29;

において、

29 % 10 は9ですね。画像番号9を表示します。

少し表示座標を左にずらし、

score /= 10;

そして

socre % 10



2 % 10

と同じ意味ですから、ここに画像番号2を表示します。

こうしてみると、「29」が表示できたと思います。

このように、10で割った余りを表示させ、10で割り、10で割った余りを表示させ、10で割り・・・

と、数がなくなるまで続けてやればいいのです。

この処理を、graph.cpp内で行ってみましょう。

また、今回から色を使うので、色の変数も用意します。

(41)とかいてあるのは、この処理は41章で追加したものですよということを表したものです。


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

GLOBAL int img_num[3][12];//数字の画像(41)

//その他の変数
GLOBAL int color[20];//色(41)


---- struct.cpp の赤字部を変更 ----

//キャラクターに関する構造体
typedef struct{
        int flag;               //フラグ
        int cnt;                //カウンタ
        int power;              //パワー
        int point;              //ポイント
        int score;              //スコア
        int num;                //残機数
        int mutekicnt;          //無敵状態とカウント
        int shot_mode;          //ショットモード
        int money;              //お金
        int img;
        int slow;               //スローかどうか
        double x,y;             //座標
        int shot_cnt;           //ショットカウント
        int graze;              //グレイズ(41)
}ch_t;


---- ini.cpp の ini() 関数内の以下を変更・追加 ----

        ch.power=0;//初期パワー(41)
        ch.num=5;//初期残機数(41)


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

        LoadDivGraph( "../dat/img/num/2.png" , 10 , 10 , 1 , 16 , 18 , img_num[0] ) ;//(41)
        
        //(41)
        color[0] = GetColor(255,255,255);//白
        color[1] = GetColor(  0,  0,  0);//黒
        color[2] = GetColor(255,  0,  0);//赤
        color[3] = GetColor(  0,255,  0);//緑
        color[4] = GetColor(  0,  0,255);//青
        color[5] = GetColor(255,255,  0);//黄色
        color[6] = GetColor(  0,255,255);//青緑
        color[7] = GetColor(255,  0,255);//紫


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

//スコアボード表示(41)
void graph_board_states(){
        int i;
        int score=ch.score;
        int power=ch.power;
        int graze=ch.graze;
        int point=ch.point;
        int money=ch.money;
        
        for(i=0;i<9;i++){//スコア表示
                DrawRotaGraph(625-15*i,30,1.0f,0.0f,img_num[0][score%10],TRUE);
                DrawRotaGraph(625-15*i,50,1.0f,0.0f,img_num[0][score%10],TRUE);
                score/=10;
        }
        
        for(i=0;i<ch.num;i++)//残機数表示
                DrawGraph(499+12*i,63,img_etc[8],TRUE);
        DrawRotaGraph(547,91,0.9f,0.0f,img_num[0][power%10],TRUE);power/=10;
        DrawRotaGraph(536,91,0.9f,0.0f,img_num[0][power%10],TRUE);power/=10;
        DrawRotaGraph(513,91,1.0f,0.0f,img_num[0][power%10],TRUE);
        DrawString(522,82,".",color[0]);//チョン

        for(i=0;i<6;i++){//グレイズ表示
                DrawRotaGraph(578-14*i,111,1.0f,0.0f,img_num[0][graze%10],TRUE);
                graze/=10;
        }
        
        for(i=0;i<4;i++){//ポイント表示
                DrawRotaGraph(550-14*i,131,1.0f,0.0f,img_num[0][point%10],TRUE);
                point/=10;
        }
        
        for(i=0;i<6;i++){//マネー表示
                DrawRotaGraph(578-14*i,154,1.0f,0.0f,img_num[0][money%10],TRUE);
                money/=10;
        }
}

//ボード描画
void graph_board(){
        DrawGraph(      0,      0,img_board[10],FALSE);
        DrawGraph(      0, 16,img_board[11],FALSE);
        DrawGraph(      0,464,img_board[12],FALSE);
        DrawGraph(416,  0,img_board[20],FALSE);

        graph_board_states();//(41)
}


前の章で上限を決めたのはここで表示できる最大の値のことだったんですね。


実行結果



- Remical Soft -