接前篇,在构建命令scons p=windows vsproj=yes中额外加入vsproj参数便可在当前文件夹下生成一个godot.sln供VisualStudio使用,如图
除了使用VS的编辑器,还可以用VS直接生成解决方案(F7)
要调整生成命令参数的话,在项目属性里NMAKE一栏
(而且自从换到新的godot3.1版以后用于多线程构建的-j参数也没再出过错了)
接下来就可以在熟悉的开发环境下做游戏啦
按godot文档所说的,把我们的代码当作游戏引擎的一个module是个好主意。
如何创建一个新模块?在godot-3.1-stable\modules下新建一个文件夹并命名,我直接命名为game,然后把我们的游戏代码的那些.cpp和.h放进game文件夹里就大功告成啦!才怪……
为了让构建系统编译我们的模块,还需要在game文件夹里再新建两个文件,SCsub和config.py。关于这两个文件里怎么写,官方文档里有写,相当的劝退,我在这方面耗费了大量的时间(而且文档里默认你是在类Unix、Linux下开发,真是……)。为了避免后来者头疼,最后,经过实践,我发现如果没有特殊需求的话(比如如果你受不了漫长的编译链接时间的话再自己去查查文档吧),直接把modules\bmp目录下的那两个文件拷贝过来就能用了……
那么,现在和引擎无关的部分基本就完了,(我主职还是策划,以“玩家输入指令,内部规则处理,内部数据变化和向外部反馈关键变化”这一思想设计游戏,所以也反映在了程序结构上),接下来就是以后的主要工作,使用引擎功能创建引擎相关的部分(像是输入处理、图像和声音、应该还有存档读档,等等这些),并在两部分间建立联系。
从小处开始是好的,为了理清总体流程,我写了几行临时测试代码:
#include "scene/gui/button.h" #include <functional> class game_button : public Button { GDCLASS(game_button, Button); protected: void pressed() override; public: std::function<void(void)> _on_pressed = [](){}; };
其中GDCLASS那行按文档说法似乎是向godot编辑器注册输出我们自定义类所必需的。
pressed()是我们需要的重载的点击处理函数:
#include "game_button.h" #include "scene/gui/label.h" void game_button::pressed() { Button::pressed(); // _on_pressed(); static_cast<Label*>(get_node(NodePath("../Label")))->set_text("OK!"); }
此外还需要在game文件夹下新建两个文件,register_types.h、register_types.cpp,其内容为:
void register_game_types(); void unregister_game_types(); ------------------------------------------------- #include "register_types.h" #include "core/class_db.h" #include "game_button.h" void register_game_types() { ClassDB::register_class<game_button>(); } void unregister_game_types() { }
这么做是因为除了纯文本编辑器,我们也想有效利用godot的可视化开发编辑器。
生成(debug或debug_release版)一个带有我们所写代码的新godot引擎看看会发生什么?(希望不是编译错误 > <)
我们自定义的类出现在了godot的编辑器中(嗯…明显的命名方式不同…),如图
创建一个如下布局的场景,并将其设为游戏启动时加载的main_scene (具体步骤跟官方文档里的手把手入门教程里所写的没啥大差别
最后,我们可能想要以非预览的方式看到工作成果。(其实是想要使这篇日志介绍的内容更全面。。)
先来编译出一个release版的程序来备用。
等等,还记得之前提到的修改NMake配置属性的地方吗,可以在生成命令行的末尾加一些参数,
比如如果做一个2D游戏,那就可以关闭3D功能,如果知道某些引擎模块用不到的话就可以关闭这些模块,这样会减小生成的程序的大小,会不会也会加快程序编译速度?
最后我关闭了除module_freetype外(因为去掉会出错)所有自带的模块,列表如下:
disable_3d=yes disable_advanced_gui=yes module_bmp_enabled=no module_bullet_enabled=no module_csg_enabled=no module_cvtt_enabled=no module_dds_enabled=no module_enet_enabled=no module_etc_enabled=no module_gdnative_enabled=no module_gdscript_enabled=no module_gridmap_enabled=no module_hdr_enabled=no module_jpg_enabled=no module_mbedtls_enabled=no module_mobile_vr_enabled=no module_mono_enabled=no module_ogg_enabled=no module_opensimplex_enabled=no module_opus_enabled=no module_pvr_enabled=no module_recast_enabled=no module_regex_enabled=no module_squish_enabled=no module_stb_vorbis_enabled=no module_svg_enabled=no module_tga_enabled=no module_thekla_unwrap_enabled=no module_theora_enabled=no module_tinyexr_enabled=no module_upnp_enabled=no module_visual_script_enabled=no module_vorbis_enabled=no module_webm_enabled=no module_webp_enabled=no module_websocket_enabled=no module_xatlas_unwrap_enabled=no
(更新:虽说文档上说做2d游戏可以disable_3d=yes,但关闭程序时会清理好像是3d相关的东西触发空指针错误,至少3.1.0版是这样。另外有时也会用到一些GDScript,所以现在我把disable_3d=yes和module_gdscript_enabled=no两个参数都去了)
最后一步是导出,在godot引擎编辑器里依次选择,项目、导出、添加,新建一个预设导出配置
导出路径设置要输出的文件夹,32位程序的话应该是要去掉64bits选项,CustomTemplate的Release里填上\bin文件夹里刚刚生成的release版程序,
点击导出项目,去掉导出为调试勾选框,点击保存,就会在导出路径里得到用于发布的整套程序。
打开看看,Press!
好了,以上就是探索用godot做一个小程序的完整尝试。
当然,实际制作游戏时是不会按示例临时代码那样做的,具体怎么做,我将在今后学习和使用godot各项功能开发一个完整的游戏的过程中再写一些,以后会换个工作室账号来发上大约总共十篇日志吧。(大概会吧。。。因为写日志好麻烦啊啊啊啊!)
暂无关于此日志的评论。