ここまでの冒険を記録しますか?

長岡技大ソフトウェア開発サークルの開発ブログ

【ゲーム製作入門】C/C++でブロック崩しを作る④【DXライブラリ】

書き手:肥田野

プログラミング初心者向けに、簡単なゲームの制作を通してC/C++の基本を解説していきます。

当サークルに所属しない方でも参考にしていただければ幸いです。

この記事では前回の内容を理解していることを前提に進めていきます。

前回はプレイヤーのバーを表示したので、今度は球が画面下に接触した時にゲームがリセットされる==ミスのシステムを実装します。

今回解説するコードです。

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);
    if( DxLib_Init() == -1 )return -1 ;
    SetDrawScreen(DX_SCREEN_BACK);
    
    int x = 40,y = 40;
    int vecX = 0,vecY = 0;//new
    int px = 320,py = 400;

    while(ProcessMessage() != -1){
        int startTime = GetNowCount();
        ScreenFlip();
        ClearDrawScreen();
        
        DrawCircle(x,y,20,GetColor(255,255,255),TRUE);
        DrawBox(px,py,px+60,py+20,GetColor(255,255,255),TRUE);

        if(vecX != 0 && vecY != 0){//new
            if(x>640)vecX = -1;
            if(x<0)vecX = 1;
            if(y<0)vecY = 1;
            if(x>px && x<px+60 && y > py)vecY = -1;
            if(y>480){//new
                x = 320;
                y = 240;
                vecX = 0;
                vecY = 0;
            }
        }else{
            DrawFormatString(260,160,GetColor(255,255,255),"PUSH SPACE");
            if(CheckHitKey(KEY_INPUT_SPACE)){
                vecX = 1;
                vecY = 1;
            }
            //newここまで
        }
        
        x += 5*vecX;
        y += 5*vecY;

        if(CheckHitKey(KEY_INPUT_RIGHT) == 1)px += 10;
        if(CheckHitKey(KEY_INPUT_LEFT) == 1)px -= 10;
        
        if(CheckHitKey(KEY_INPUT_ESCAPE) == 1)break;
        int endTime = GetNowCount();
        WaitTimer(1000/60-(endTime-startTime));
    }
    DxLib_End() ;
    return 0 ;
}

newのコメントが付いた箇所を中心に解説していきます。

int vecX = 0,vecY = 0;

前回までは1と定義していましたが、今回からは初期設定を0にします。

スペースキーが押されたらこの値を変更して、球が動き出すという仕組みです。

if(vecX != 0 && vecY != 0){

球が動かないのはvecXとvecYが0の時なので、そうではない(「!=」は否定を表します)ときだけ動くように、球を動かしている部分のコードをすっぽりとif文で囲んでしまいましょう。

if(y>480){

画面の縦サイズは480なので、球の中心がここに達したらミスとなります。

ミスをしたら球の座標を画面中央に設定して、vecXとvecYを0にします。

DrawFormatString(260,160,GetColor(255,255,255),"PUSH SPACE");

DrawFormatString()は文字を描画する関数です。

printf()との違いは、表示する場所の座標と文字の色を設定する必要があるということです。

ただ球が中央に置かれただけではプレイヤーは何をすればいいのかわからないので、「PUSH SPACE」と案内をさせています。

if(CheckHitKey(KEY_INPUT_SPACE)){

スペースキーが押されたら、vecXとvecYを1にしてゲームを再開します。

いかがだったでしょうか。いわゆる暇潰しゲームとしてはこれで完成といっても過言ではありませんね。

しかし、今回作るのはブロック崩しです。崩すためのブロックがなくては始まらないので、次回はブロックを作ってみたいと思います。