前言
学习图形学有几年的时间了,计划用半年的时间,搭建一个简易的游戏引擎,加深对游戏引擎和图形学的理解,查漏补缺。
参考youtube上的教程 Game Engine series,做了简化,降低工程上的复杂度。
第一篇,创建简单的工程,能显示一行"hello world"
创建工程目录
考虑通用性和简单,开发工具选择CLion或vscode,使用CMake组织项目及编译流程。如果你的开发机是windows,也可以考虑使用visual studio。
按下面目录结构创建两个大文件夹(Sandbox、engine),和代码文件。

- Sandbox:业务工程,可以理解为一个sample工程
- engine:引擎工程,引擎的所有代码都放在这里
Sandbox和engine各自有一个CMakeLists.txt文件,组织编译流程。
实现过程
第一篇讲仔细点,假设读者可能连C++都不是太熟悉。
engine里增加Test类
Test.h // 声明一个Print()函数
c++
//
// Created by sumsmile on 2023/9/1.
//
#ifndef HAZEL_TEST_H
#define HAZEL_TEST_H
// follow原教程,引擎的名字叫Hazel(榛树)
// 没有特别的含义,随便取个名字
// 所有引擎的类都放在命名空间"Hazel"下
namespace Hazel {
// 只有很简单的print函数
void Print();
}
#endif //HAZEL_TEST_H
说明:用C++开发基础库,一般会声明一个统一的命名空间,包含自己的实现,避免重名冲突。不像Java,用包名来区分,这点不太方便,代码写起来会稍显冗余。
Test.cpp 实现Print()函数,打印一行字符串
c++
//
// Created by sumsile on 2023/9/1.
//
#include "Test.h"
#include <stdio.h>
namespace Hazel {
void Print()
{
printf("Welcome to Hazel Engine World \n");
}
}
engine/CMakeLists.txt。 这里不会专门讲cmake的语法,用到哪里,就补充说明。
scss
// 设置当前编译需要的最低cmake版本,这里随意选择2.8
cmake_minimum_required(VERSION 2.8)
// 工程名设置为"engine"
project(engine)
// 需要参与编译的源码,现在只有一个Test.cpp文件
// 设置变量SRC_LIST,值为src/Test.cpp
set(SRC_LIST src/Test.cpp)
// add_library,产物是一个engine.a的静态库,参与编译的文件是${SRC_LIST}
add_library(engine STATIC ${SRC_LIST})
Sandbox工程增加Application.cpp
Application.cpp放应用的实现,调用我们的引擎API,现在引擎只有一个Print()的API
arduino
//
// Created by sumsmile on 2023/9/1.
//
#include "../engine/src/Test.h"
int main()
{
// 调用Hazel命名空间下的Print()函数,打印一行日志
Hazel::Print();
return 0;
}
Sandbox/CMakeLists.txt
scss
cmake_minimum_required(VERSION 2.8)
// 应用名为"Sandbox"
project(Sandbox)
// 现在只有一个文件参与编译
set(SRC_LIST src/Application.cpp)
// 增加依赖的子目录-engine工程
add_subdirectory(engine)
// 输出是一个可执行文件,
add_executable(${PROJECT_NAME} ${SRC_LIST})
// 链接需要的engine库
target_link_libraries(${PROJECT_NAME} engine)
运行完,在命令行能看到日志:
bash
/Users/baidu/Documents/study/gameEngine/Hazel/Sandbox/cmake-build-debug/Sanbox
Welcome to Hazel Engine World
Process finished with exit code 0
完整代码参考创建工程
如果打不开,可能你需要科学上网额~
Done!
第一篇,大概半个小时的时间,搭建了非常简单的只有一个测试类的引擎工程