首页 > 其他分享 >游戏引擎MiniEngine开发记录(一)

游戏引擎MiniEngine开发记录(一)

时间:2022-12-07 22:57:32浏览次数:78  
标签:Engine __ 游戏 MINI mini MiniEngine 引擎 define Log

游戏引擎MiniEngine开发记录(一)

最近看了Youtube大神The Cherno的Game Engine系列,学习到了很多知识,但是作者前期做的很多工作后期都推翻重构了,很多地方写的也很乱,因此想从自己的角度重新实现一个类似的游戏引擎。

引擎使用C++开发,集成glad,glfw,imgui,spdlog,entt,glm,stb,assimp这些库,不得不感叹C++的库真的强大,把这些库集成起来其实就能做出一个不错的渲染引擎了。

基本环境搭建

我选择使用CLion作为IDE进行开发,一方面CLion跨平台,并且和Rider都是Jetbrains公司的产品,界面差不多,用起来很舒服。

image-20221207220514251

可以下载一个Jetbrains ToolBox,这样就可以很轻松的管理自己的IDE了。

在CLion中,新建一个项目,取名MiniEngine,语言标准选择C++17

image-20221207220652682

之后下载需要的包:

有release版本的都下载release版本

glad

glfw

image-20221207220842010

spdlog

image-20221207220916860

glm

image-20221207221117468

entt

image-20221207221213143

stb_image

assimp

imgui

比较特殊,下载docking分支的文件

image-20221207222106670

image-20221207222114577

然后需要这些文件,包括核心文件和glfw实现需要的文件

下载完成之后,可以在项目下新建一个ThirdParty文件夹,把这些库放进去

然后编辑CmakeLists.txt

cmake_minimum_required(VERSION 3.23)
project(MiniEngine)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_subdirectory(Engine/ThirdParty/glfw)
add_subdirectory(Engine/ThirdParty/spdlog)
add_subdirectory(Engine/ThirdParty/entt)
add_subdirectory(Engine/ThirdParty/assimp/assimp-5.2.5)
add_subdirectory(Engine/ThirdParty/glm)
include_directories(Engine/ThirdParty/imgui)
include_directories(Engine/ThirdParty/glad/include)
include_directories(Engine/Core)
aux_source_directory(Engine/ThirdParty/imgui imgui)
aux_source_directory(Engine/ThirdParty/stb_image stb_image)
aux_source_directory(Engine/Core core)
add_executable(main main.cpp gl.c ${imgui} ${core} ${stb_image})
target_link_libraries(main PUBLIC glfw spdlog)

项目目录

Core为核心层,包括引擎核心代码,各种系统如日志等

Editor为以后要实现的编辑器层,方便使用

Function为各种函数,如各种运算等

Platform为平台无关层

Resource为资源层

image-20221207222300617

集成日志系统

今天先集成日志系统

为了方便使用Log.h为一个静态类,声明了两个静态变量,都是spdlog中的一个logger,用于打印日志信息,使用静态类我们可以不实例化类对象就直接在各处打印日志,很方便。

//Log.h
#ifndef MINIENGINE_LOG_H
#define MINIENGINE_LOG_H

#include "spdlog/spdlog.h"

namespace mini {
    //静态类
    class Log {
    public:
        //静态成员函数
        static void Init();
		
        static std::shared_ptr<spdlog::logger> &GetCoreLogger() { return s_core_logger_; }

        static std::shared_ptr<spdlog::logger> &GetClientLogger() { return s_client_logger_; }

    private:
        //静态变量
        static std::shared_ptr<spdlog::logger> s_core_logger_;
        static std::shared_ptr<spdlog::logger> s_client_logger_;
    };
}
//各种宏定义,方便使用
#define MINI_CORE_TRACE(...)     ::mini::Log::GetCoreLogger()->trace(__VA_ARGS__)
#define MINI_CORE_INFO(...)      ::mini::Log::GetCoreLogger()->info(__VA_ARGS__)
#define MINI_CORE_WARN(...)      ::mini::Log::GetCoreLogger()->warn(__VA_ARGS__)
#define MINI_CORE_ERROR(...)     ::mini::Log::GetCoreLogger()->error(__VA_ARGS__)
#define MINI_CORE_CRITICAL(...)  ::mini::Log::GetCoreLogger()->critical(__VA_ARGS__)
#define MINI_CORE_ASSERT(x, ...) { if(!(x)) { MINI_CORE_ERROR("Assertion Failed: {0}", __VA_ARGS__); __debugbreak(); } }
#define MINI_TRACE(...)       ::mini::Log::GetCoreLogger()->trace(__VA_ARGS__)
#define MINI_INFO(...)     ::mini::Log::GetCoreLogger()->info(__VA_ARGS__)
#define MINI_WARN(...)     ::mini::Log::GetCoreLogger()->warn(__VA_ARGS__)
#define MINI_ERROR(...)    ::mini::Log::GetCoreLogger()->error(__VA_ARGS__)
#define MINI_CRITICAL(...) ::mini::Log::GetCoreLogger()->critical(__VA_ARGS__)
#define MINI_ASSERT(x, ...) { if(!(x)) { MINI_ERROR("Assertion Failed: {0}", __VA_ARGS__); __debugbreak(); } }


#endif //MINIENGINE_LOG_H
//Log.cpp
#include "Log.h"
#include "spdlog/sinks/stdout_color_sinks.h"

namespace mini {
    std::shared_ptr<spdlog::logger> Log::s_core_logger_;
    std::shared_ptr<spdlog::logger> Log::s_client_logger_;

    void Log::Init() {
        spdlog::set_pattern("%^[%T] %n: %v%$");
        s_core_logger_ = spdlog::stdout_color_mt("MINI");
        s_core_logger_->set_level(spdlog::level::trace);

        s_client_logger_ = spdlog::stdout_color_mt("APP");
        s_client_logger_->set_level(spdlog::level::trace);
    }
}

Engine为引擎类,是最核心的一个类,目前只有初始化,启动,关闭和构造,析构函数,后面会不断拓展

//Engine类
#ifndef MINIENGINE_ENGINE_H
#define MINIENGINE_ENGINE_H

#include "string"
#include "Log.h"
#include "memory"

namespace mini {
    class Engine {
    public:
        explicit Engine(const std::string &name = "");

        ~Engine();
        
        void Initialize();
        
        void Run();

        void Close();
        
    private:
    };
}


#endif //MINIENGINE_ENGINE_H

在构造函数中,我们初始化Log系统,然后在开始启动的时候,测试打印一下日志,然后进入一个死循环

#include "Engine.h"
namespace mini{
    Engine::Engine(const std::string &name) {
        Log::Init();
    }

    Engine::~Engine() = default;

    void Engine::Close() {

    }

    void Engine::Run() {
        MINI_CORE_INFO("Engine Start!");
        while  (true){
            
        }
    }

    void Engine::Initialize() {

    }

}

main函数目前很简单,实例化一个引擎对象,然后启动即可

#include "memory"
#include "Engine.h"
int main()
{
    const auto engine=std::make_unique<mini::Engine>();
    engine->Run();
    return 0;
}

运行

运行之后,看到打印出的日志,说明集成日志系统成功

image-20221207223401538

GitHub

https://github.com/luoxiaozhu1998/MiniEngine

Gitee

https://gitee.com/lz19980618/MiniEngine

标签:Engine,__,游戏,MINI,mini,MiniEngine,引擎,define,Log
From: https://www.cnblogs.com/luoxiaozhu1998/p/16964808.html

相关文章

  • 12 虚拟机字节码执行引擎_字节码执行机制
    目录1解释执行与编译执行2基于栈/寄存器的指令集3解释器执行字节码过程4虚拟机进行数据运算的一般过程1解释执行与编译执行解释执行:通过解释器执行编译执行:通过即......
  • 1082. 数字游戏
    题目链接1082.数字游戏科协里最近很流行数字游戏。某人命名了一种不降数,这种数字必须满足从左到右各位数字呈非下降关系,如\(123\),\(446\)。现在大家决定玩一个游戏,指......
  • 基于MFC/WIN32写的坦克游戏
    基于MFC/WIN32写的坦克游戏本着学习的目的,最近尝试着编写一个游戏,整个项目使用MFC/WIN32来编写。未采用游戏引擎,主要的原因是想从基础出发,在重复造轮子的过程当中学习体会他......
  • 不知如何优选达人?火山引擎 VeDI 零售行业解决方案一键解决!
     技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群“人-货匹配”这句营销老话,在直播电商兴起的这几年,似乎不再专指消费者与商品之......
  • 【UE游戏开发】虚幻游戏开发常用功能
    一.游戏存档1.1创建SaveGame蓝图 1.2搭存档UI界面                                  ......
  • 火山引擎 DataTester:如何用 A/B 测试做产品增长?
    技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群随着如今越来越高的获客成本,用户拉新变得不再容易;而且由于获客成本的增高,让用户留......
  • 南开河北游戏网站高防BGP物理机
    排除非物理机器,将系统中暂时不关注的VM等产生的异常信息排除掉。排除非业务状态的机器,如装机状态中的,包括生产中,维修中,迁移中,重装中,销毁中,重启中,无管控状态,只监控正常状态......
  • 写给游戏测试萌新的攻略
    1、在编写测试用例需要准确细致的了解模块的策划文档,策划文档是编写测试用例的基础;在编写测试用例之前需要自行整合该模块的思维导图、流程图,这样才能做到心中有数......
  • 南开河北游戏网站高防物理机租用
    传递错误信息,将错误网站浏览页面展现给了浏览用户。那么ileowu今天对WEB服务器安全设置,从而提升服务器安全性,有效的防护我们的站点,保护我们企业网络形象,希望对站长们有所帮......
  • 坦克大战小游戏总览
    做的过程中一些难点如何绘制坦克如何让坦克动起来线程基本操作我方发射子弹,敌方发射子弹击中坦克消失击中坦克爆炸敌方坦克自由移动控制移动范围发射多颗子弹防......