游戏引擎养成《三》 hello window!

游戏引擎养成《三》 hello window!

# 本节我们的任务是用我们的工程创建一个窗口。

我们首先整理下项目目录结构,这部分主要涉及Cmake config的调整:

首先修改 根目录CMakeLists.txt

cmake_minimum_required (VERSION 3.1)
set (CMAKE_C_STANDARD 11)
set (CMAKE_CXX_STANDARD 11)
project (PhantomEngine)
include_directories("${PROJECT_SOURCE_DIR}/PhantomCore")
include_directories("${PROJECT_SOURCE_DIR}/Dependencies/GLFW/include")
link_directories("${PROJECT_SOURCE_DIR}/Dependencies/GLFW/lib-vc2015")

link_libraries("glfw3.lib")

add_subdirectory(PhantomCore)
add_subdirectory(sample)

然后将core作为库目录存在

add_library(PhantomCore
	src/graphics/window.cpp
)

在sample目录下添加execute工程,main.cpp也挪到这里

注意: 我们这里不但加添了dependencies里的glfw3库,自己的Phantom Core库,还添加了opengl32.lib。
add_executable(sample main.cpp)
target_link_libraries(sample PhantomCore opengl32.lib glfw3.lib)

这样cmake后得到的解决方案就包含了sample ,phantomCore两个项目。

#配置mac环境

我们顺便也把mac环境搭建好。(因为晚上回家写)
if(WINDOWS)
    link_directories("${PROJECT_SOURCE_DIR}/Dependencies/GLFW/lib-vc2015")
elseif(MACOS)
	INCLUDE_DIRECTORIES ( /System/Library/Frameworks )
	FIND_LIBRARY(COCOA_LIBRARY Cocoa)
	# find_library(CoreFoundation_LIBRARY CoreFoundation)
	FIND_LIBRARY(IOKit_LIBRARY IOKit)
	FIND_LIBRARY(COREVIDEO_LIB NAMES CoreVideo)
    FIND_LIBRARY(OpenGL_LIBRARY OpenGL )

    MARK_AS_ADVANCED (COCOA_LIBRARY
    				IOKit_LIBRARY
    				COREVIDEO_LIB
                    OpenGL_LIBRARY)
    SET(EXTRA_LIBS ${COCOA_LIBRARY} ${IOKit_LIBRARY} ${COREVIDEO_LIB} ${OpenGL_LIBRARY})

    link_directories("${PROJECT_SOURCE_DIR}/Dependencies/GLFW/lib-mac")
    
    MESSAGE( STATUS "message = ${OPENGL_INCLUDE_DIR}.")
endif(WINDOWS)

在executable 处也做相应修改。

# 正式编码

我们在src/graphics中添加window类,以方面main调用。

所用的GLFW的api ,链接上官方提供的示例是很好的入门参考,我们对其进行一定的加工,抽离出部分类。

GLFW: Getting startedwww.glfw.org


class Window
	{
	private:
		const char *m_Title;
		int m_Width, m_Height;
		GLFWwindow *m_Window;
		bool m_Closed;
	public:
		Window(const char *name, int width, int height);
		~Window();
		void clear() const;
		void update();
		bool closed() const;

		inline int getWidth() const { return m_Width; }
		inline int getHeight() const { return m_Height; }
	private:
		bool init();
	};

抽出window类后即可在main.cpp中写出基础的窗口渲染循环,并相应resize与key事件。

#include "src/graphics/window.h"

int main()
{
	using namespace phantom;
	using namespace graphics;

	Window window("phantom!", 960, 540);
	glClearColor(0.2f, 0.3f, 0.8f, 1.0f);

	while (!window.closed())
	{
		window.clear();
		glBegin(GL_QUADS);
		glVertex2f(-0.5f, -0.5f);
		glVertex2f(-0.5f, 0.5f);
		glVertex2f(0.5f, 0.5f);
		glVertex2f(0.5f, -0.5f);
		glEnd();
		window.update();
	}
	window.terminate();

	return 0;
} 

运行! 初次见面,请多关照!


# 总结

本节 我们用glfw创建了一个简单的窗口。既然官方文档与示例如此完善,我们没必要在这里浪费时间。 抽离出window类是很有必要的,我们在后面的章节里也会多参考各种官方文献的示例代码,但是会加工到引擎所需的内聚程度。来保证代码结构清晰可读,因为我们要写的是一个复杂的大工程而不是某模块的示例。


下一节:游戏引擎养成《四》 添加GLEW

编辑于 2019-03-03

文章被以下专栏收录