RexDK編 part 11

RexDKで、データスリム2のアドインを作る。

ゲームができるようにする

ゲームできるようにします。

その前にTmove()関数を少々味付けします。
具体的には、levelの数値を変えることによって動きの速度を変更できるようにしたことと、HOMEキーによる強制終了を追加しました。


int Tmove(int Char_Y,int level){  //変更
int Char_X=240,Char_X_old,x;
int Char_Y_old,y;
int i,f,flag;
char str[10];

    DsDisplayBlockClear(0,0,240,Scor_Y);

    f=1;
    do{
    if (Char_X<0){
    DsDisplayBlockClear(0,Char_Y,CharWidth*5,CharHeight);
    }
    else{
    DsDisplayBlockClear(Char_X_old,Char_Y,CharWidth*5,CharHeight);
    }
    for(i=0;i<5;i++){
        x=Char_X+i*CharWidth;
        if ((x>=0)&&(x<=232)){
        DsDisplayBitmapDraw( x, Char_Y, taro_bmps[i] , 0);
        }
    }
    x=Char_X;y=Char_Y;width=CharWidth*5;
    if(Char_X<0){
    x=0;width=width+Char_X;
    }
    DsSleep(level);  //追加 levelによってスピードを変更
    DsTouchDataGet(p);
    if(((p.PointX > x)&&(p.PointX < x+width))&&
        ((p.PointY > Char_Y)&&(p.PointY < Char_Y+CharHeight))){
        scor++;
        DsDisplayBlockClear(Scor_X,Scor_Y,40,12);
        itoa(str,scor);DsPrintf(Scor_X,Scor_Y,0,str);
        if (Char_X<0){
        DsDisplayBlockClear(0,Char_Y,CharWidth*5,CharHeight);
        }
        else{
        DsDisplayBlockClear(Char_X,Char_Y,CharWidth*5,CharHeight);
        }
        return 0;
    }
    p.PointX=255;p.PointY=255;

        DsReadMessage(msg,1);
        if ((msg.message== MSG_DS_KEY_DOWN)&&(msg.sCode==KEY_TOP_C))
         addin_end();  //HOMEボタンで終了する

    Char_X_old = Char_X;
    Char_X -=CharWidth;
    if(Char_X<(-5*CharWidth))  f=0;

    }while(f);

        return 1;
}

さらに、DsPrintf()が使用できるように

extern int __LIB__ DsPrintfe(int,int,int,char *);
#define DsPrintf(a,b,c,d)  DsPrintfe(a,b,c,d)

をソースのdefine文に付け加えておきます。

次に実際にゲームが行えるようにします。
ゲームの内容は3回ミスするまで無限に繰り返す事とし、その内容に従いgame()と言う関数を作成します。

void game(void){
int y,miss;
char str[10];
/*スコアとMiss数の初期画面*/
DsPrintf(Scor_X-30,Scor_Y,0,"Scor=");
DsPrintf(10,Scor_Y,0,"Miss=");

    while(1){//無限ループを作成
        y = (rand()%5)*20;   //
        miss +=Tmove(y,1);   //Tmoveを呼び出し変数missに戻り値を加算
    //missの回数を表示
        DsDisplayBlockClear(40,Scor_Y,40,12);
        itoa(str,miss);DsPrintf(40,Scor_Y,0,str);

        if (miss==3) return; //ミスが3回になると関数を抜け出す

        DsEventMessageGet(msg); //Homeキーによる終了
        if ((msg.message== MSG_DS_KEY_DOWN)&&(msg.sCode==KEY_TOP_C))
            addin_end();
    }

}

次にゲームの終了画面を作成します。

void game_end(void){
char str[10];

    DsEventClear();//画面と登録イベントの消去
    DsDisplayBlockClear(0,0,240,120);

    DsPrintf(60,50,0,"Scor="); //スコアの表示
    itoa(str,scor);DsPrintf(90,50,0,str);
    //再スタートボタンをID 0x80で作成
    DsDialogTextButton(40,80,60,16,0x80,"ReTry");
    //終了ボタンをID 0x50で作成
    DsDialogTextButton(140,80,60,16,0x50,"End");

scor=0;  //スコアをクリアします
}

ほぼ、スタート画面と一緒です。

今回作成した関数をmain()関数から呼び出せるように、main()関数を変更します。
内容は、まず初期画面を呼び出し無限ループに入ります。
ループの中で、メッセージイベントがあったかどうかを確認し、Startボタン(又はReTryボタン)が押されたらgame()関数を呼び出しgame()関数から戻ってきたらgame_end()関数を呼び出します。
また、EndボタンかHomeキーが押されたらaddin_end()関数を呼び出しアドインを終了するようにしました。


void main(void){
//int y;  //不要になったので削除

start_init();

    while(1){
        DsEventMessageGet(msg);
        switch (msg.message){
        case MSG_DS_COMMAND:
            if (msg.sCode==MSG_DS_COMMAND_DOWN){
                switch (msg.bCode){
                case 0x80:  //イベントID 0x80の時の処理
                    DsEventClear();
                    DsDisplayBlockClear(0,0,240,120);
                    game();//追加
                    game_end();
                break;
                case 0x50:  //イベントID 0x50の時の処理
                    addin_end();
                break;
                }
            }
        break;

        case MSG_DS_KEY_DOWN:
            switch (msg.sCode){
            case KEY_TOP_C:
                addin_end();  //追加
            break;
    //不要になったので削除
//            case KEY_ENTER_A:
//                y = (rand()%5)*20;
//                Tmove(y,1);
//            break;
            }
        }
    }
}

これで一応ゲームとして成り立ちましたが、まだ完成では有りません。

ここまでのソース

Copyright 2001-2002 Hideo Morotomi
感想、要望は、moro@deneb.freemail.ne.jp又は、掲示板へお願いします。
個人的にはMAILより掲示板に書きこんでもらえた方が嬉しいです。
当Web Site に関する補足事項