読者です 読者をやめる 読者になる 読者になる

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

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

【ゲーム製作入門】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 = 1,vecY = 1;

    int px = 320,py = 400;//new

    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);//new

        if(x>640)vecX = -1;
        if(x<0)vecX = 1;
        if(y<0)vecY = 1;
        if(y>480)vecY = -1;
        if(x>px && x<px+60 && y > py)vecY = -1;//new
        
        x += 5*vecX;
        y += 5*vecY;

        //newここから
        if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
            px += 10;
        }
        if(CheckHitKey(KEY_INPUT_LEFT) == 1){
            px -= 10;
        }
        //newここまで
        
        if(CheckHitKey(KEY_INPUT_ESCAPE) == 1)break;
        int endTime = GetNowCount();
        WaitTimer(1000/60-(endTime-startTime));
    }
    DxLib_End() ;
    return 0 ;
}

newのコメント文を付けた箇所を中心に解説します。

int px = 320,py = 400;

プレイヤーの初期位置です。

DrawBox(px,py,px+60,py+20,GetColor(255,255,255),TRUE);

プレイヤーを描画します。DrawBox()の引数は左上頂点のX座標、Y座標、右下頂点のX座標、Y座標、色、塗りつぶすか否かです。

if(x>px && x<px+60 && y > py)vecY = -1;

プレイヤーと球が接触したら、球のY方向の向きを-1して跳ね返します。

2Dゲームにおける当たり判定は、このように2つのオブジェクト(物体)の座標を比較して判断しています。

if(CheckHitKey(KEY_INPUT_RIGHT) == 1){

CheckHitKey()でキーボードの右キーが押されているかを判定し、押されていればプレイヤーのX座標を+10します。

「KEY_INPUT_RIGHT」はDXライブラリで定義された定数です。その他のキーを使いたいときは、DXライブラリ公式ページの関数リファレンスから「CheckHitKey」の項目を参照してください。

同様に左キーが押された時にも球のX座標を-10しています。

デバッグをすると左右キーに合わせてバーが動き、上手くバーの上部に当てると球が跳ね返るかと思います。

だんだんゲームらしくなってきましたね。次回はもう少し手を加えて、「ミス」と「リセット」の要素を追加していきましょう。