Windows 构建 Acid Game Engine 的坑

下载 OpenAL 的话,配置环境变量到 OpenAL 1.1 SDK 就好了

我的 cmake 的 FindOpenAL 里面会添加 OpenAL 的库,所以我不知道为什么原仓库会把那个判断是否已经存在 OpenAL 库的语句注释掉……我就加回来了

Sources\CMakeLists.txt

# OpenAL must be installed on the system, env "OPENALDIR" must be set
find_package(OpenALSoft)
find_package(OpenAL)
if(OPENALSOFT_FOUND)
	#if(OPENALSOFT_FOUND AND NOT TARGET OpenAL::OpenAL)
		add_library(OpenAL::OpenAL UNKNOWN IMPORTED)
		set_target_properties(OpenAL::OpenAL PROPERTIES
				IMPORTED_LOCATION "${OPENALSOFT_LIBRARY}"
				INTERFACE_INCLUDE_DIRECTORIES "${OPENALSOFT_INCLUDE_DIR}"
				)
	#endif()
elseif(OPENAL_FOUND)
	if(NOT TARGET OpenAL::OpenAL)
		add_library(OpenAL::OpenAL UNKNOWN IMPORTED)
	endif()
	set_target_properties(OpenAL::OpenAL PROPERTIES
	IMPORTED_LOCATION "${OPENAL_LIBRARY}"
	INTERFACE_INCLUDE_DIRECTORIES "${OPENAL_INCLUDE_DIR}"
	)
else()
	message(FATAL_ERROR "Could not find OpenAL or OpenAL-Soft")
endif()

配置了环境变量之后,记得要重新打开 VS Code 才能更新到最新的环境变量

然后是配置 pkg config

https://stackoverflow.com/questions/1710922/how-to-install-pkg-config-in-windows

然后是安装 bzip2

我已经用 vcpkg 安装了 bzip2,我也确定安装的是 x64 的,设置了环境变量 VCPKG_DEFAULT_TRIPLET=x64-windows

然后是在 Acid\build\Tests\Editor 中找不到 EditorTest.dll

但是我在 bin 文件夹中是可以找到的,于是我就手动复制过去了

然后就是没有 glfw window 的错误

这个创建 glfw window 的时机也是有讲究的,需要在创建了 Windows module 之后,在那些连接到 onAddWindow 信号的 module 的创建之后,在那些需要 glfw window 的 module 之前

一个 hack 的方法是记住需要 glfw window 的 module 的序号,在那个序号的位置之前调用 AddWindow()

Sources\Engine\Engine.cpp

void Engine::CreateModule(Module::TRegistryMap::const_iterator it, const ModuleFilter &filter) {
	if (modules.find(it->first) != modules.end())
		return;
	
	if (!filter.Check(it->first))
		return;

	// hack
	if (modules.size() == 10)
		Windows::Get()->AddWindow();

但是这样肯定是跟原仓库的设计者的设计思路是相违背的

还有一种方法是在获取 glfw window 的时候,判断如果自己没有 glfw window,那么就创建一个

虽然照样不太优雅,但是比把 Window 逻辑写到引擎初始化的底层更好

Sources\Devices\Windows.cpp

Window *Windows::GetWindow(WindowId id) {
	// hack
	if (windows.size() == 0 && id == 0)
		AddWindow();

	if (id >= windows.size())
		return nullptr;
	return windows.at(id).get();
}

你可能感兴趣的:(GameEngineDev,windows,c++,game,engine)