🍾

AIでどこまで、ゲーム開発ができるのか? - 検証

2024/11/18に公開

概要

AIに0からゲーム制作をやらせてみた

使用するもの:

AI:ChatGPT
プログラミング言語:C++
ユーザー入力:GLFW
画面出力:GLAD
計算: GLM
ビルド:Cmake

本編

僕> 
GLFW GLAD GLM C++ Cmakeを使って、ゲームを開発してください
GPT>
はい、いかがコードです...
...(省略)

最終形態

最終形態
本記事では、C++を用いてGLFW、GLAD、GLMといったライブラリを組み合わせ、立方体を描画し、WASDキーでカメラ操作を行うプログラムを実装する方法について詳細に解説します。特に、Minecraftのようなブロックベースのゲーム開発を視野に入れたプロジェクトに役立つ基本的な概念とコーディング手法を紹介します。

必要なライブラリとセットアップ

  • GLFW: マルチプラットフォームのウィンドウやOpenGLコンテキスト、入力の管理。
  • GLAD: OpenGL関数のロード。
  • GLM: ベクトルや行列計算用のヘッダオンリーのライブラリ。

これらのライブラリを導入することで、低レベルの操作が可能になり、自由度の高いグラフィックスプログラムの開発が行えます。

プロジェクトの構成

  1. struct CubeData
    各立方体の属性を保持する構造体です。具体的には以下のようなプロパティを持ちます:

    struct CubeData {
        glm::vec3 position;
        glm::vec3 color;
        bool drawWireframe;
        bool isSolid;
    };
    
  2. CubeWorldクラス
    立方体の追加や描画を管理するクラスで、GLFWウィンドウのセットアップやOpenGLバッファの初期化も行います。

    class CubeWorld {
    public:
        CubeWorld() {
            // GLFWとGLADの初期化、ウィンドウ作成
            // OpenGLのバッファ設定やシェーダープログラムのロード
        }
        void AddCube(const glm::vec3& position, const glm::vec3& color, bool drawWireframe, bool isSolid) {
            cubes.push_back({ position, color, drawWireframe, isSolid });
        }
        void Render() {
            for (const CubeData& cube : cubes) {
                // モデル行列の作成とシェーダープログラムへの適用
                // glDrawArraysを使用した描画
            }
        }
    private:
        std::vector<CubeData> cubes;
    };
    

カメラの操作とキー入力

カメラ操作のためにGLMを用いてベクトル演算を行います。cameraPositioncameraFrontcameraUpといった変数を用いてカメラの位置と向きを管理します。

glm::vec3 cameraPosition = glm::vec3(0.0f, 0.0f, 3.0f);
glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);

keyHandler()関数では、WASDキーでカメラを移動させ、スペースキーで上方向、LEFT_SHIFTキーで下方向への移動を実現します。

マウスによるカメラ視点の回転

マウスの動きによってカメラの向きを制御するためにmouseCallback()関数を設定します。これにより、滑らかな視点変更が可能になります。具体的には、マウスの移動量を基にカメラの方向ベクトルを更新します。

void mouseCallback(GLFWwindow* window, double xpos, double ypos) {
    static float lastX = 400, lastY = 300;
    static bool firstMouse = true;
    if (firstMouse) {
        lastX = xpos;
        lastY = ypos;
        firstMouse = false;
    }
    float xoffset = xpos - lastX;
    float yoffset = lastY - ypos; // Yは反転
    lastX = xpos;
    lastY = ypos;

    float sensitivity = 0.1f;
    xoffset *= sensitivity;
    yoffset *= sensitivity;

    // カメラの方向ベクトルの更新
}

Zキーでのデータ出力

Zキーを押すと、cubesに格納されている全ての立方体の位置をコンソールに出力し、スクリーンのクリアと更新を行います。この機能はデバッグやゲームの状態をログに記録する際に役立ちます。

結論

今回の実装で学べることは、GLFW、GLAD、GLMを使用した立方体描画の基本や、WASDによるカメラ移動、マウスを用いた視点変更など、3Dゲームやシミュレーションの基礎となるテクニックです。これを基に、さらに複雑なシーンやゲームロジックの追加も可能です。

まとめ

Discussion