国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口

這篇具有很好參考價(jià)值的文章主要介紹了Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

文中若有代碼、術(shù)語(yǔ)等錯(cuò)誤,歡迎指正

前言

  • 此節(jié)目的

    為了有窗口效果,但不想使用原生的window32寫起,所以用glfw窗口庫(kù)。

    也為了完成008計(jì)劃事件系統(tǒng)的創(chuàng)建窗口部分

  • 圖示

    Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口,Hazel游戲引擎,游戲引擎,glfw,窗口,git

步驟

GIT添加GLFW子模塊及編譯

  • 添加glfw子模塊

    git add submodule https://github.com/TheCherno/glfw Hazel/vendor/GLFW
    

    Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口,Hazel游戲引擎,游戲引擎,glfw,窗口,git

  • 修改premake

    解決方案下的premake修改

    -- 包含相對(duì)解決方案的目錄
    IncludeDir = {}
    IncludeDir["GLFW"] = "Hazel/vendor/GLFW/include"
    -- 這個(gè)include,相當(dāng)于把glfw下的premake5.lua內(nèi)容拷貝到這里
    include "Hazel/vendor/GLFW"
    project "Hazel"		--Hazel項(xiàng)目
    	location "Hazel"--在sln所屬文件夾下的Hazel文件夾
    	kind "SharedLib"--dll動(dòng)態(tài)庫(kù)
    	-- 包含目錄
    	includedirs{
    		"%{prj.name}/src",
    		"%{prj.name}/vendor/spdlog/include",
    		"%{IncludeDir.GLFW}"
    	}
    	-- Hazel鏈接glfw項(xiàng)目
    	links 
    	{ 
    		"GLFW",
    		"opengl32.lib"
    	}
    	filter "system:windows"
    		defines{
    			"HZ_PLATFORM_WINDOWS",
    			"HZ_ENABLE_ASSERTS"
    		}
    
  • 效果

    Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口,Hazel游戲引擎,游戲引擎,glfw,窗口,git

Window類

  • 目前類圖

    Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口,Hazel游戲引擎,游戲引擎,glfw,窗口,git

    Application類可以調(diào)用創(chuàng)建窗口函數(shù),而窗口類使用glfw庫(kù)創(chuàng)建真正的窗口。

    窗口類檢測(cè)glfw窗口的事件,并回調(diào)給Application的處理事件函數(shù)。

  • 代碼

    window.h

    #pragma once
    #include "hzpch.h"
    #include "Hazel/Core.h"
    #include "Hazel/Events/Event.h"
    namespace Hazel {
    	struct WindowProps{// 窗口初始化設(shè)置的內(nèi)容
    		std::string Title;
    		unsigned int Width;
    		unsigned int Height;
    		WindowProps(const std::string& title = "Hazel Engine",
    			unsigned int width = 1280,
    			unsigned int height = 720)
    			: Title(title), Width(width), Height(height){}
    	};
    	class HAZEL_API Window{
    	public:
    		using EventCallbackFn = std::function<void(Event&)>;
    		virtual ~Window() {}
    		virtual void OnUpdate() = 0;
    		virtual unsigned int GetWidth() const = 0;
    		virtual unsigned int GetHeight() const = 0;
    		// Window attributes
    		virtual void SetEventCallback(const EventCallbackFn& callback) = 0;
    		virtual void SetVSync(bool enabled) = 0;
    		virtual bool IsVSync() const = 0;
            // 在Window父類聲明創(chuàng)建函數(shù)
    		static Window* Create(const WindowProps& props = WindowProps());
    	};
    }
    

    WindowsWindow.h

    #pragma once
    #include "Hazel/Window.h"
    #include <GLFW/glfw3.h>
    namespace Hazel {
    	class WindowsWindow : public Window{
    	public:
    		WindowsWindow(const WindowProps& props);
    		virtual ~WindowsWindow();
    		void OnUpdate() override;
    		inline unsigned int GetWidth() const override { return m_Data.Width; }
    		inline unsigned int GetHeight() const override { return m_Data.Height; }
    		// 設(shè)置Application的回調(diào)函數(shù)
    		inline void SetEventCallback(const EventCallbackFn& callback) override { m_Data.EventCallback = callback; }
    		void SetVSync(bool enabled) override;
    		bool IsVSync() const override;
    	private:
    		virtual void Init(const WindowProps& props);
    		virtual void Shutdown();
    	private:
    		GLFWwindow* m_Window;
    		struct WindowData{
    			std::string Title;
    			unsigned int Width, Height;
    			bool VSync;
    			EventCallbackFn EventCallback;
    		};
    		WindowData m_Data;
    	};
    }
    

    WindowsWindow.cpp

    #include "hzpch.h"
    #include "WindowsWindow.h"
    
    namespace Hazel {
    	static bool s_GLFWInitialized = false;
        // 在WindowsWindow子類定義在Window父類聲明的函數(shù)
    	Window* Window::Create(const WindowProps& props){
    		return new WindowsWindow(props);
    	}
    	WindowsWindow::WindowsWindow(const WindowProps& props){
    		Init(props);
    	}
    	void WindowsWindow::Init(const WindowProps& props){
    		m_Data.Title = props.Title;
    		m_Data.Width = props.Width;
    		m_Data.Height = props.Height;
    		HZ_CORE_INFO("Creating window {0} ({1}, {2})", props.Title, props.Width, props.Height);
    		if (!s_GLFWInitialized){
    			// TODO: glfwTerminate on system shutdown
    			int success = glfwInit();
    			HZ_CORE_ASSERT(success, "Could not intialize GLFW!");// 是Core.h里面預(yù)處理器指令定義了HZ_CORE_ASSERT
    			s_GLFWInitialized = true;
    		}
    		// 創(chuàng)建窗口//
    		m_Window = glfwCreateWindow((int)props.Width, (int)props.Height, m_Data.Title.c_str(), nullptr, nullptr);
    		// 設(shè)置glfw當(dāng)前的上下文
    		glfwMakeContextCurrent(m_Window);
    		/*
    			設(shè)置窗口關(guān)聯(lián)的用戶數(shù)據(jù)指針。這里GLFW僅做存儲(chǔ),不做任何的特殊處理和應(yīng)用。
    			window表示操作的窗口句柄。
    			pointer表示用戶數(shù)據(jù)指針。
    		*/
    		glfwSetWindowUserPointer(m_Window, &m_Data);
    		SetVSync(true);
    	}
    	void WindowsWindow::OnUpdate(){
    		glfwPollEvents();			// 輪詢事件	
    		glfwSwapBuffers(m_Window);	// 交換緩沖
    	}
    	.....
    }
    
  • HZ_CORE_ASSERT

    在Core.h中

    #ifdef HZ_ENABLE_ASSERTS
    #define HZ_ASSERT(x, ...) { if(!(x)) { HZ_ERROR("Assertion Failed: {0}", __VA_ARGS__); __debugbreak(); } }
    #define HZ_CORE_ASSERT(x, ...) { if(!(x)) { HZ_CORE_ERROR("Assertion Failed: {0}", __VA_ARGS__); __debugbreak(); } }
    #else
    #define HZ_ASSERT(x, ...)
    #define HZ_CORE_ASSERT(x, ...)
    #endif
    
    HZ_CORE_ASSERT(success, "Could not intialize GLFW!");
    // 轉(zhuǎn)換成
    { if(!(success)) { ::Hazel::Log::GetCoreLogger()->error("Assertion Failed: {0}", "Could not intialize GLFW!"); __debugbreak(); } };
    

    可見:…當(dāng)做參數(shù)包被__VA_ARGS__展開;__debugbreak();是在debug模式下的斷點(diǎn)

其它修改

  • Application

    #pragma once
    #include "Core.h"
    #include "Events/Event.h"
    #include "Window.h"
    namespace Hazel {
    	class HAZEL_API Application{
    	public:
    		Application();
    		virtual ~Application();
    		void Run();
    	private:
    		std::unique_ptr<Window> m_Window;
    		bool m_Running = true;
    	};
    	Application* CreateApplication();
    }
    
    #include "hzpch.h"
    #include "Application.h"
    #include "Hazel/Events/ApplicationEvent.h" // 包含事件
    #include "Hazel/Log.h"
    #include <GLFW/glfw3.h>
    namespace Hazel {
    	Application::Application(){
    		m_Window = std::unique_ptr<Window>(Window::Create()); // 創(chuàng)建窗口
    	}
    	Application::~Application() {}
    	void Application::Run(){
    		while (m_Running){
                // 清屏
    			glClearColor(1, 0, 1, 1);
    			glClear(GL_COLOR_BUFFER_BIT);
    			m_Window->OnUpdate();	// 更新glfw
    		}
    	}
    }
    

效果

Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口,Hazel游戲引擎,游戲引擎,glfw,窗口,git

Bug記錄

  • glfw找不到函數(shù)定義

    Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口,Hazel游戲引擎,游戲引擎,glfw,窗口,git

  • 解決方法一

    修改GLFW的premake

    filter "configurations:Debug"
        defines "HZ_DEBUG"
        buildoptions "/MTd"
        symbols "On"
    
        filter "configurations:Release"
        defines "HZ_RELEASE"
        buildoptions "/MT"
        symbols "On"
    
        filter "configurations:Dist"
        defines "HZ_DIST"
        buildoptions "/MT"
        symbols "On"
    

    使GLFW項(xiàng)目的運(yùn)行庫(kù),只能是MT或者MTD,不能是MD或者M(jìn)DD

    重新生成項(xiàng)目解決方案才行

    Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口,Hazel游戲引擎,游戲引擎,glfw,窗口,git

    關(guān)于運(yùn)行庫(kù)選項(xiàng):

    // 運(yùn)行庫(kù)選項(xiàng)是MTD,靜態(tài)鏈接MSVCRT.lib庫(kù);
    // 運(yùn)行庫(kù)選項(xiàng)是MDD,動(dòng)態(tài)鏈接MSVCRT.dll庫(kù);打包后的exe放到另一臺(tái)電腦上若無(wú)這個(gè)dll會(huì)報(bào)錯(cuò)
    
    • 為什么GLFW要改為MT或者M(jìn)TD才行

      Hazel是MTD靜態(tài)鏈接MSVCRT.dll庫(kù)、而引用GLFW項(xiàng)目卻是MDD動(dòng)態(tài)鏈接MSVCRT.dll庫(kù),可能不兼容。如下是Hazel項(xiàng)目的運(yùn)行庫(kù)選項(xiàng)

      Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口,Hazel游戲引擎,游戲引擎,glfw,窗口,git

  • 解決方法二

    由于Hazel默認(rèn)是MTD,GLFW默認(rèn)是MDD,那么就將Hazel用premake改為MDD動(dòng)態(tài)鏈接MSVCRT.dll庫(kù),符合Hazel作為dll庫(kù)(SharedLib)的方式

    更改解決方案下的premake5.lua文件

    project "Hazel"
        ......
       filter "configurations:Debug"
    		defines "HZ_DEBUG"
    		buildoptions "/MDd"
    		symbols "On"
    
    	filter "configurations:Release"
    		defines "HZ_RELEASE"
    		buildoptions "/MD"
    		optimize "On"
    
    	filter "configurations:Dist"
    		defines "HZ_DIST"
    		buildoptions "/MD"
    		optimize "On"
    
    project "Sandbox"
    	......
    	filter "configurations:Debug"
    		defines "HZ_DEBUG"
    		buildoptions "/MDd"
    		symbols "On"
    
    	filter "configurations:Release"
    		defines "HZ_RELEASE"
    		buildoptions "/MD"
    		optimize "On"
    
    	filter "configurations:Dist"
    		defines "HZ_DIST"
    		buildoptions "/MD"
    		optimize "On"
    

    重新編譯后,Hazel的運(yùn)行庫(kù)依舊是MTd,但是添加了命令行/MDd 會(huì)覆蓋/MTd

    Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口,Hazel游戲引擎,游戲引擎,glfw,窗口,git

    • 后面017節(jié)才發(fā)現(xiàn)為什么Hazel依舊為MTD,需要添加了命令行/MDd 才會(huì)覆蓋/MTd

      由于premake設(shè)置了staticruntime為on

      -- On:代碼生成的運(yùn)行庫(kù)選項(xiàng)是MTD,靜態(tài)鏈接MSVCRT.lib庫(kù);
      -- Off:代碼生成的運(yùn)行庫(kù)選項(xiàng)是MDD,動(dòng)態(tài)鏈接MSVCRT.dll庫(kù);打包后的exe放到另一臺(tái)電腦上若無(wú)這個(gè)dll會(huì)報(bào)錯(cuò)
      staticruntime "On"	
      

      只需staticruntime 為off即可文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-636320.html

到了這里,關(guān)于Hazel游戲引擎(011)窗口抽象和GLFW創(chuàng)建窗口的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Hazel游戲引擎(008-009)事件系統(tǒng)

    Hazel游戲引擎(008-009)事件系統(tǒng)

    文中若有代碼、術(shù)語(yǔ)等錯(cuò)誤,歡迎指正 此節(jié)目的 理清順序和設(shè)計(jì)才能更好的編碼 設(shè)計(jì)如圖 聲明 圖是我自己縫合的,流程與大意沒錯(cuò),但是不符合軟件工程對(duì)應(yīng)圖的規(guī)范。 大致是根據(jù)視頻草稿圖與大意畫的 使用時(shí)序圖簡(jiǎn)單表示 使用類圖詳細(xì)表示 在軟件工程中,類圖沒有消

    2024年02月01日
    瀏覽(41)
  • Qt配置glfw庫(kù)(Windows)

    Qt配置glfw庫(kù)(Windows)

    glfw官網(wǎng)下載:https://www.glfw.org/download.html 下載之后,解壓如下: 創(chuàng)建一個(gè)Qt工程(我創(chuàng)建的是命令行程序),如下所示: 在工程路徑下新建一個(gè)文件夾 glfw 將下載的glfw庫(kù)文件夾中的include、lib-mingw-w64復(fù)制到新建的 glfw 文件夾中,如下所示: 切換到工程文件(*.pro),鼠標(biāo)右鍵

    2024年02月03日
    瀏覽(14)
  • Visual Studio 2022 搭建GLFW OpenGL開發(fā)環(huán)境

    Visual Studio 2022 搭建GLFW OpenGL開發(fā)環(huán)境

    最近工作需要 需要寫一個(gè)全景的視頻播放器 網(wǎng)上搜了下大概解決方案是 ffmpeg+opengl b站有很多視頻? 按照視頻 搭建了OpenGL的開發(fā)環(huán)境 先去GLFW的網(wǎng)站下載 windows平臺(tái)的庫(kù)文件 為什么使用GLFW? 因?yàn)镚LFW是跨平臺(tái)的? ?我下的是64位版本解壓后有目錄如下 ? ?包含了動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)

    2024年02月03日
    瀏覽(23)
  • Ubuntu20.04搭建OpenGL環(huán)境(glfw+glad)

    Ubuntu20.04搭建OpenGL環(huán)境(glfw+glad)

    本文在VMware安裝Ubuntu20.04桌面版的環(huán)境下搭建OpenGL, 按照本文搭建完成后可以執(zhí)行LearnOpenGL網(wǎng)站上的demo 。 關(guān)于VMware可自行到VMware Workstation Pro | CN下載 關(guān)于Ubuntu20.04桌面版可自行到官網(wǎng)或Index of /ubuntu-releases/20.04.6/ | 清華大學(xué)開源軟件鏡像站 | Tsinghua Open Source Mirror下載 這里窗口

    2024年02月12日
    瀏覽(29)
  • Visual studio2022 利用glfw+glad配置OpenGL環(huán)境

    Visual studio2022 利用glfw+glad配置OpenGL環(huán)境

    鏈接:https://visualstudio.microsoft.com/zh-hans/ 搜索時(shí)最常見的是glut,但是了解到glut最后更新時(shí)間是1998年,比我還小兩歲…目前沒人維護(hù)了,也被棄用了… 目前,最常用的就是freeglut+glew和glfw+glad兩種組合。據(jù)說(shuō)前者比較經(jīng)典,后者比較新潮,所以作為潮人,我選擇了后者(具體可

    2024年02月04日
    瀏覽(28)
  • 【GIS開發(fā)】基于C++繪制三維數(shù)字地球Earth(OpenGL、glfw、glut)

    【GIS開發(fā)】基于C++繪制三維數(shù)字地球Earth(OpenGL、glfw、glut)

    ??三維數(shù)字地球系列相關(guān)文章如下??: 1 【小沐學(xué)GIS】基于C++繪制三維數(shù)字地球Earth(OpenGL、glfw、glut)第一期 2 【小沐學(xué)GIS】基于C++繪制三維數(shù)字地球Earth(OpenGL、glfw、glut)第二期 3 【小沐學(xué)GIS】基于OpenSceneGraph(OSG)繪制三維數(shù)字地球Earth 4 【小沐學(xué)GIS】基于C++繪制太陽(yáng)系

    2023年04月17日
    瀏覽(56)
  • OpenGL —— 2.5、繪制第一個(gè)三角形(附源碼,glfw+glad)(更新:紋理貼圖)

    OpenGL —— 2.5、繪制第一個(gè)三角形(附源碼,glfw+glad)(更新:紋理貼圖)

    源碼效果 ? C++源碼 ? ?????紋理圖片 ????? ?????需下載stb_image.h這個(gè)解碼圖片的庫(kù),該庫(kù)只有一個(gè)頭文件。 ? ????? 具體代碼: ?????????? vertexShader.glsl ? ?????????? fragmentShader.glsl ? ?????????? main.c ? ???

    2024年02月11日
    瀏覽(23)
  • 【已解決】GLFW error #65544: X11: Failed to open display :0 連接遠(yuǎn)程服務(wù)器并開啟gui界面失敗

    本地計(jì)算機(jī)通過(guò)ssh連接服務(wù)器運(yùn)行g(shù)ui界面的時(shí)候報(bào)錯(cuò),但是直接在服務(wù)器上跑gui代碼沒有任何問(wèn)題。 原因其實(shí)在于你本地沒有設(shè)置顯示gui的顯示屏,如果之前一直ssh開gui沒問(wèn)題,用的好好地,突然不行了直接跳到第二步,否則從第一步開始看。 Step1. 服務(wù)器端ssh設(shè)置 修改完后

    2024年02月04日
    瀏覽(244)
  • Hazel 引擎學(xué)習(xí)筆記

    Hazel 引擎學(xué)習(xí)筆記

    https://youtu.be/etdSXlVjXss 我感覺自己照抄視頻中的腳本還是有點(diǎn)慢了 因?yàn)槟悴恢浪裁磿r(shí)候加了什么東西,或者自己照抄就很容易抄錯(cuò) 我覺得最好的方法就是自己快速過(guò)一遍他的視頻,知道他大概的思路是怎么樣的,然后自己再拉取那個(gè) commit 的代碼,用 diff 方便看他具體修

    2024年02月13日
    瀏覽(17)
  • 跟著cherno手搓游戲引擎【10】使用glm窗口特性

    跟著cherno手搓游戲引擎【10】使用glm窗口特性

    創(chuàng)建: ImGuiBuild.cpp:引入ImGui Layer.h:加入GuiRender方法,每次渲染Gui都會(huì)調(diào)用 ImGuiLayer.h:刪除冗余部分,僅留下加入,刪除,和Render方法,添加Begine和End,用于每次刷新UI的配置和刪除UI。 ImGuiLayer.cpp:刪除原來(lái)的Update,把配置、繪制UI的代碼、渲染分離 LayerStack.h:修改m_LayerInsertI

    2024年01月25日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包