#1 导入基于windows平台的GLFW=OpenGL Framwork #2 premake5.lua添加项目相关引用 #3 编写窗体公共头文件定义Window.h #4 编写游戏窗体类WindowsWindow #5 修改Application.cpp进行测试
#1 导入第三方已经使用premake5封装好的GLFW库
git submodule add https://github.com/TheCherno/glfw Aurora/vendor/GLFW
#2 premake5.lua修改
IncludeDir
= {}
IncludeDir
["GLFW"] = "Aurora/vendor/GLFW/include"
include
"Aurora/vendor/GLFW"
includedirs
{
"%{prj.name}/src",
"%{prj.name}/vendor/spdlog/include",
"%{IncludeDir.GLFW}"
}
links
{
"GLFW",
"opengl32.lib"
}
#pragma once
#include "aopch.h"
#include "Aurora/Core.h"
#include "Aurora/Events/Event.h"
namespace Aurora
{
struct WindowProps
{
std
::string Title
;
unsigned int Width
;
unsigned int Height
;
WindowProps(const std
::string
& title
= "Aurora Engine",
unsigned int width
= 1280,
unsigned int height
= 720)
:Title(title
), Width(width
), Height(height
)
{
}
};
class AURORA_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;
virtual void SetEventCallback(const EventCallbackFn
& callback
) = 0;
virtual void SetVSync(bool enable
) = 0;
virtual bool IsVSync() const = 0;
static Window
* Create(const WindowProps
& prop
= WindowProps());
};
}
#pragma once
#include "Aurora/Window.h"
#include <GLFW/glfw3.h>
namespace Aurora
{
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
; }
inline void SetEventCallback(const EventCallbackFn
& callback
) override
{ m_Data
.EventCallback
= callback
; }
void SetVSync(bool enable
) 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
;
};
}
#include "aopch.h"
#include "WindowsWindow.h"
namespace Aurora
{
static bool s_GLFWInitialized
= false;
Window
* Window
::Create(const WindowProps
& props
)
{
return new WindowsWindow(props
);
}
WindowsWindow
::WindowsWindow(const WindowProps
& props
)
{
Init(props
);
}
WindowsWindow
::~WindowsWindow()
{
Shutdown();
}
void WindowsWindow
::Init(const WindowProps
& props
)
{
m_Data
.Title
= props
.Title
;
m_Data
.Width
= props
.Width
;
m_Data
.Height
= props
.Height
;
AO_CORE_INFO("Creating window {0} ({1}, {2})", props
.Title
, props
.Width
, props
.Height
);
if (!s_GLFWInitialized
)
{
int success
= glfwInit();
AO_CORE_ASSERT(success
, "Could not initialize GLFW!");
s_GLFWInitialized
= true;
}
m_Window
= glfwCreateWindow((int)props
.Width
, (int)props
.Height
, m_Data
.Title
.c_str(), nullptr, nullptr);
glfwMakeContextCurrent(m_Window
);
glfwSetWindowUserPointer(m_Window
, &m_Data
);
SetVSync(true);
}
void WindowsWindow
::Shutdown()
{
glfwDestroyWindow(m_Window
);
}
void WindowsWindow
::OnUpdate()
{
glfwPollEvents();
glfwSwapBuffers(m_Window
);
}
void WindowsWindow
::SetVSync(bool enable
)
{
if (enable
)
glfwSwapInterval(1);
else
glfwSwapInterval(0);
m_Data
.VSync
= enable
;
}
bool WindowsWindow
::IsVSync() const
{
return m_Data
.VSync
;
}
}
#5 修改测试
#pragma once
#include "Core.h"
#include "Events/Event.h"
#include "Window.h"
namespace Aurora
{
class AURORA_API Application
{
public:
Application();
virtual ~Application();
void Run();
private:
std
::unique_ptr
<Window
> m_Window
;
bool m_Running
= true;
};
Application
* CreateApplication();
}
#include "aopch.h"
#include "Application.h"
#include "Aurora/Events/ApplicationEvent.h"
#include "Aurora/Log.h"
#include "GLFW/glfw3.h"
namespace Aurora
{
Application
::Application()
{
m_Window
= std
::unique_ptr
<Window
>(Window
::Create());
}
Application
::~Application()
{
}
void Application
::Run()
{
while (m_Running
)
{
glClearColor(1, 0, 1, 1);
glClear(GL_COLOR_BUFFER_BIT
);
m_Window
->OnUpdate();
}
}
}
更多修改的内容见Gitea
效果展示,Thanks for watching!