素人プログラマーの日常

効率の良いコード、美しいコードなんて書けません。

自機の移動

久し振りということもあって、何かと確認確認で捗りませんが、少しずつでも進めていきます。

今回は、マウスカーソルに合わせて動く自機の移動をメインに書きました。いよいよゲームの内容に入って、楽しくなってくるところですが、微妙な間違いでデバッグに時間をかけてばかりです。まあでも、一度間違えると次からは同じ間違いをしてもすぐ気付けるのでそれもヨシとします。



【追加した変数】

int X ,Y;        //自機描画用
int gameF;    //ゲーム全体のフラグ




【プロトタイプ宣言】

void Title();    //タイトル画面
void Play();    //メイン

void Allinit();    //スタート時初期化
void Tekiinit();    //編隊ごとの初期化




【関数の定義】

void Title(){    //タイトル画面/////////////////////////////////

    LoadGraphScreen( 50 , 50 , "img/title.png" , TRUE );    //タイトル画像描画
    ScreenFlip();                                //描画をウインドウへ反映

    WaitKey();                // キー入力待ち
    
    Allinit();                //スタート時初期化

}

void Play(){    //プレイメイン/////////////////////////////////////////

    while( gameF == 0 ){

        WaitVSync( 1 );
        ClearDrawScreen();

        //敵機がいなかったら出現させる
/*        int j=0;
        for( int i=0 ; i<tekikazu ; i++ ){
            if( teki[i]<1 ) j++;
        }
        if( j == tekikazu ) Tekiinit();        */

        //マウスの位置を取得し自機を描画
        GetMousePoint( &mouX , &mouY );

        if( 16>mouX ) X = 16;
        else if( mouX>wX-16 ) X = wX-16;
        else X = mouX;

        if( 16>mouY ) Y = 16;
        else if( mouY>wY-16 ) Y = wY-16;
        else Y = mouY;

        DrawGraph( X-16 , Y-16 , Ghandle[0] , TRUE );

        ScreenFlip();

        //右クリックで終了
        if( ( GetMouseInput() & MOUSE_INPUT_RIGHT ) !=0 ){
            gameF = 1; continue;
        }

    }

}

void Allinit(){    //スタート時初期化///////////////////////////

    for( int i=0 ; i<tamakazu ; i++ ) tama[i] = 0;
    for( int i=0 ; i<tekikazu ; i++ ) teki[i] = 0;
    for( int i=0 ; i<ttamakazu ; i++ ) ttama[i] = 0;
    for( int i=0 ; i<expkazu ; i++ ) exp[i] = 0;

    X = wX/2;
    Y = wY-64;
    score = 0;
    
}

void Tekiinit(){    //編隊ごとの初期化///////////////////////////

    for( int i=0 ; i<tekikazu ; i++ ){
        teki[i] = 1;
        tekiX[i] = GetRand( wX*10-640 )+320;
        tekiY[i] = -GetRand( 3200 );
        spd[i] = GetRand( 120 )+40;
        tekicnt[i] = 0;
        tekicntmx[i] = GetRand( 60 )+20;
    }

}




敵機編隊ごとの初期化は、自機を動かしてから取り組むので、コメントアウトして数値もてきとーです。

で、もう少し続きます。前回のMain Loopです。

    LoadDivGraph( "img/sd_main.png" , 5 , 5 , 1 , 32 , 32 , Ghandle );    //キャラ画像読込み



    {    // Main Loop START /////////////////////////////////////////////

        while( gameF<1 ){
            Title();
            Play();
        }

    }    // Main Loop END //////////////////////////////////////////////

    DxLib_End() ;                // DXライブラリ使用の終了処理

    return 0 ;                // ソフトの終了
}




whileの条件を( gameF == 0 )ではなく、( gameF = 0 )としていたことに気付かず迷走しました。こういう間違いって、まったくの初心者だと何が悪いのかわかりませんよね~。私も初心者と似たようなものです(笑。古いBASICに慣れていると、条件部分で代入出来るなんて考え方はありませんから。代入と論理演算と比較は紛らわしいので、しっかり頭に叩き込まないとですね。