抽象父类要加虚析构函数¶
-
简要说明
因为是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]]
下一步去哪¶
教人做引擎很困难
- 就像教人研发一台汽车,不得不砍掉一些功能
而开发一些熟悉和感兴趣的功能(渲染、事件)
其它功能可能会采取第三方库的方法(实体组件、物理等)
-
引擎是一种一直要开发和维护的东西,除非人们不在继续开发游戏。
-
下一步会先做实体组件系统,有了实体,可以为其添加组件,然后用脚本控制