跳转至

抽象父类要加虚析构函数

  • 简要说明

    因为是shared_ptr是指针,而指针的类型是父类

    若父类未写虚析构函数(程序会给一个默认的析构函数)那么delete时将不会执行 “运行时”选择派生类的析构函数再运行父类的析构函数功能

    会直接调用父类的析构函数,忽略子类的析构函数

input类 修改(鼠标点击面板和鼠标悬停)

简要说明

在某个平台的输入不需要在运行时选择另一个平台输入,不存在这种动态情况

比如:我在安卓上不可能存在用window的输入,只有安卓上的输入。

但渲染需要运行时选择哪个api,是opengl还是directx、vulkan,因为windows的操作是支持这三个渲染api的。

当前项目Input的类似结构

Ref<Input> Input::Create()
{
    switch (Renderer::GetPlatform())
    {
        case RendererAPI::API::None: HZ_CORE_ASSERT(false, "RendererAPI:None is currently not supported!"); return nullptr;
        case RendererAPI::API::Window: return std::make_shared<WindowInput>();
        case RendererAPI::API::Linux: return std::make_shared<LinuxInput>();
        case RendererAPI::API::Mac: return std::make_shared<MacInput>();
    }
    HZ_CORE_ASSERT(false, "UnKnown RendererAPI!");
    return nullptr;
}

可推:

一个input.h,一个input.cpp,有windowsinput.cpp、linuxinput.cpp、macinput.cpp文件。

编译后有:input.obj,windowsinput.obj,linuxinput.obj,macinput.obj

是用虚函数,动态运行时使用哪个子类

在项目中修改后Input的类后

一个input.h,有windowsinput.cpp、linuxinput.cpp、macinput.cpp文件,由在编译前决定编译哪一个cpp文件

编译后有:input.obj文件,这样就减少了三个cpp的obj文件

项目如何修改

  • 删除input.cpp、windowsinput.h
  • windowsinput.cpp、linuxinput.cpp、macinput.cpp中定义input.h声明的函数(当前只支持window,可以不用后两个cpp)

Imgui Event

当ImGuiLayer没有OnEvent处理事件函数时界面存在bug

Bug1

在ImGui的一个视口wasd,输出帧缓冲场景的ImGui视口(EditorLayer)也会响应

Bug2

在ImGui的一个视口滚轮滚动,输出帧缓冲场景的ImGui视口(EditorLayer)也会响应

应该改为只在对应的ImGui视口响应。

提下ImGuiLayer的OnEvent

在016节本来有OnEvent处理事件的

旧ImGui版本,所以需要手动写捕捉事件处理

但在022节又删掉了OnEvent函数

新ImGui版本,因为托管给ImGui去处理事件,不需要手动处理

现在此节又要加上是

因为如果托管给ImGui自己去处理事件,会造成上述的两个Bug,所以有部分事件需要手动处理。

WASD Bug

摄像机的OnUpdate,是放在update里的,所以每帧都会执行

因为一直在update,所以不管哪个ImGui视口在wasd 摄像机都会移动的。

void EditorLayer::OnUpdate(Timestep ts) { HZ_PROFILE_FUNCTION(); m_CameraController.OnUpdate(ts); }

滚轮滚动Bug

需要提的是:EditorLayer层在OnImGuiRender函数中渲染了两个ImGui视口

BUG修复

  • 说明Bug

    当窗口最小化,imgui的viewportsize会是负值传入给帧缓冲重新设置大小

    但是帧缓冲的大小参数是无符号,所以会转换为一个很大的无符号整数

    帧缓冲的大小就会过大,导致重新最大化窗口时,摄像机投影会变形(摄像机的宽高比与帧缓冲的大小不匹配)

![[Pasted image 20241213160258.png]]

下一步去哪

教人做引擎很困难

  • 就像教人研发一台汽车,不得不砍掉一些功能

而开发一些熟悉和感兴趣的功能(渲染、事件)

其它功能可能会采取第三方库的方法(实体组件、物理等)

  • 引擎是一种一直要开发和维护的东西,除非人们不在继续开发游戏。

  • 下一步会先做实体组件系统,有了实体,可以为其添加组件,然后用脚本控制