如何做一个跨平台的游戏编辑器(一)
嗯,这玩意没啥营养,纯属是有这方面的兴趣的程序员问了我相关的问题。这个事儿说复杂不复杂,一两句话又说不清楚,干脆写下来。
首先,技术选型
跨平台也不是说跨多远,windows linux macos
涉及的图形api 分别是 dx gl vulkan metal
根据这些线索,首先开发语言c/cpp是没跑了,虽然为了开发效率,大型项目一般都是混合语言开发,上层弄个python lua c# 啥的,这是后话。
结论一、底层c/cpp没跑
其次,绘图接口这部分分别写实现也挺麻烦的,找个开源库来解决好了,我们选型bgfx,他就是一个渲染器,用兼容的方式抹平了不同的api差距。当然兼容肯定就利用不上 vulkan metal dx12 等的高级独家特性了。我们对这些高级独家的玩意儿也不是特别感兴趣,兼容最高。
结论二、绘图部分用bgfx
https://github.com/bkaradzic/bgfx.cmake
然后,每个操作系统有一点自己独立的东西,这其中开发编辑器最头疼的就是窗口管理了,各个操作系统自己一套,适配很烦,这里我们请出一位玩兼容的祖师爷SDL,打从我第一天写代码的时候SDL就存在了,历史真的悠久。我们主要用SDL来管理窗口,键盘鼠标事件这些。SDL还提供其它声音视频等多媒体内容,但对我们一般没啥用。
结论三、窗口管理用SDL
编辑器上各种各样的UI,我这里选了IMGUI
https://github.com/ocornut/imgui/tree/docking
为什么选择IMGUI
1.因为他是基于我们自己的渲染器来画的,混合内容方便
2.他是一种类似Unity OnGUI的实现,搞UI特别快。
结论四、UI系统用IMGUI(docking分支)
最后还有个问题,cpp的开发环境每个平台也不尽相同,windows上最常用的肯定是vc,虽然也能用gcc,总归费劲一些。linux 和 mac 就是gcc了。
为了抹平开发环境的问题,我们引入一个构建工具cmake
结论五、使用cmake做构建工具
构建基础代码
cmake 安装,开发环境安装
略
这是我的cmake 版本
vs 和 windowssdk安装 略
我的版本 如图
bgfx 构建
抓取代码 git clone https://github.com/bkaradzic/bgfx.cmake
这个仓库只是 bgfx的cmake配置文件,他关联了三个仓库,才是真正的代码
cd bgfx.cmake git submodule init git submodule update
进入仓库目录,通过submodule 把这些代码拉回来,第一次要拉很久,bgfx仓库贼大
涉及到的仓库是这三个
https://github.com/bkaradzic/bgfx
https://github.com/bkaradzic/bimg
https://github.com/bkaradzic/bx
等不及就用其它方式把这仨弄回来
我肯定是懒得熟悉git命令行的,用小乌龟一样
之后在仓库目录新建一个build 目录 仓库目录指bgfx.cmake
就是有CMakeLists.txt这个文件的目录
cmake 默认输出文件夹是当前文件夹,我们在build这里执行,就会在build目录产生vc项目,然后我们编译vc项目就行。
cmake就是用来产生各种开发开发工具用的项目文件
cmake在linux 和 macos 就会产生标准的make 文件,后续make命令就能编译。
当你增加了新的源码,需要再执行一次cmake
IMGUI构建
IMGUI没几个源码,不用单独构建,直接丢进主项目就好
注意我们要的代码不在主干上
SDL构建
SDL不用构建,release整理的很清楚,随时去拿就好
https://github.com/libsdl-org/SDL/releases
https://github.com/libsdl-org/SDL/releases/download/release-2.0.22/SDL2-2.0.22-win32-x64.zip
这里我下载了一个2.0.22的
整合到一起
整合的東西有點零散,直接看代碼吧
https://gitee.com/lightsever/TTEngine/tree/master/purecpp
這裏整合了一份純粹的 bgfx+sdl2+imgui_dock,使用cmake 構建的項目
簡單説明一下
建議直接進入editorwin 目錄 cmake . 產生項目
然後直接編譯就可以
目前只配置了windows,但是所有的庫和工具都支持linux,配置上下點功夫就可以
脚手架代碼不用動,在appeditor裏面搞事情就可以了。
後面可以把c#實現的那樣一個多窗口環境反著弄回來,代碼量不大,直接在cpp環境工作,不用切來切去。