C++ & SDL2で、ゲームの基本処理を試しにつくってみた [ゲーム制作]

C++

ゲームの基本処理

今回のサンプルはファイルが3つの構成です。
コンパイルが通り実行できると、Windowが一つ開きます。イベントを処理しているので☓ボタンで閉じることが可能です。イベントを処理していないとフリーズしたような感じになります。

ゲームについて書かれているサイトを参考にゲームの基本処理を書いてみました。これを基本として肉付けしていく考えです。

無限ループを処理本体としています。その中で、イベント(キー入力やメッセージ)の処理、キャラの移動などの更新処理、描画をします。

#include "gamemain.hpp"

int main(int argc, char** argv) {
    return GAME().Main();
}
#pragma once
#include <SDL.h>

class GAME {
public:

    int Main() {
        while (running) {
            event();
            update();
            render();
            fps();
        }

        return 0;
    }

    // ctor, dtor
    GAME();
    ~GAME();

    int init();     // 初期化
    void cleanup(); // 後処理
    void event();   // イベント
    void update();  // データ更新
    void render();  // 描画
    void fps();     // fpsの調整

private:
    bool running;
    SDL_Window* window;
};
#include "gamemain.hpp"
#include <iostream>

GAME::GAME(){
    init();
}

GAME::~GAME(){
    cleanup();
}

/*-----------------------------------------------------------------------------
 *  初期化
 *-----------------------------------------------------------------------------
 */
int GAME::init() {
    // SDL2の初期化
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
        return 1;
    }

    // Windowを生成する
    window = SDL_CreateWindow(
        "Sample",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
        640, 480,
        0
    );

    if (window == NULL) {
        std::cout << "ERROR : " << SDL_GetError() << std::endl;
        return 1;
    }

    // ループフラグ
    running = true;

    return 0; 
}

/*-----------------------------------------------------------------------------
 *  後処理
 *-----------------------------------------------------------------------------
 */
void GAME::cleanup() {
    SDL_DestroyWindow(window);
    SDL_Quit();
}

/*-----------------------------------------------------------------------------
 *  イベントを処理する
 *-----------------------------------------------------------------------------
 */
void GAME::event(){
    SDL_Event event;

    // イベントがなくなるまでループする
    while (SDL_PollEvent(&event) == 1) {
        if (event.type == SDL_QUIT) {
            // 終了
            running = false;
        }

        // ここにキー入力の処理等を書く

    }
}

/*-----------------------------------------------------------------------------
 *  データを更新する
 *-----------------------------------------------------------------------------
 */
void GAME::update(){}

/*-----------------------------------------------------------------------------
 *  描画する
 *-----------------------------------------------------------------------------
 */
void GAME::render(){}

/*-----------------------------------------------------------------------------
 *  FPSの調整をする
 *-----------------------------------------------------------------------------
 */
void GAME::fps(){}

コメント

タイトルとURLをコピーしました