精华内容
下载资源
问答
  • Godot引擎本身支持键盘和游戏手柄(Xbox,DualShock和Nintendo)。 Xbox按钮显示在下面的方括号中。 一般游戏玩法: 移动:箭头键,Vi键,ASDW,[方向盘]。 等待:空格,回车,Z,句点(。),[A]。 帮助:Esc,...
  • Alley Cat是引擎的程序员友好游戏框架。 状态 在现阶段,它是高度试验性的,因此,甚至不要考虑将其用于任何严重的事情! 但是,如果您喜欢冒险,欢迎您对其进行测试并提交错误报告,甚至发送请求请求。 用法 安装 ...
  • 本文作为我的 Godot 系列文章的第二篇,是一篇翻译文作为 Godot 的优点说明吧,虽然文章发布于去年,但还是很有借鉴意义,翻译的不是很好请海涵! :smile: 作者简介:Rock Milk来自 Brasil 的另一个游戏开发高手。...

    前言

    本文作为我的 Godot 系列文章的第二篇,是一篇翻译文作为 Godot 的优点说明吧,虽然文章发布于去年,但还是很有借鉴意义,翻译的不是很好请海涵! :smile:

    作者简介:Rock Milk来自 Brasil 的另一个游戏开发高手。在此体验 Reakt 游戏:https://play.google.com/store/apps/details?id=co.rockmilk.reakt发布时间:2017 年 9 月 27 日原文链接: https://medium.com/@rockmilkgames/why-godot-engine-e0d4736d6eb0

    原文:我们为什么选择 Godot 引擎

    现在是开发游戏的最好时机。第一个理由就是:你还活着,你如果挂了那就不能再开发游戏了。第二个理由是:获取开发工具从没有这么民主过啊。(哭)

    那段美好的回忆

    我仍然还记得在 2004 年,那是我的计算机毕业课程的第一堂课。一个长大了的男孩,非常激动的学习如何开发并开始尝试创建一个模糊地存在我头脑中的蹩脚小游戏。我并不是想说我有多老或者多怀旧(尽管两者都有),但是回溯到那个时代,既没有推特( Twitter ),没有脸书( Facebook ),更没有其他所谓你现在正在使用的“信息分享”工具。

    在巴西我们所拥有最好的东西就是那些隐蔽的网络论坛,聚集了一大堆有着共同兴趣爱好的匿名伙伴们,互相分享着那点点滴滴游戏开发的经验和知识。我都不知道那个时候我是怎么开始使用谷歌搜索去学习游戏开发的。尽管 GameMaker 已经有 17 岁了,而且RPG Maker 都已经 24 岁了(!),我还从未听说过他们或者使用过他们的某些产品。

    我在大学里的第一堂课就是计算机编程基础,教的是 C 语言。那个时候我学会了一点基本的语法,兴奋而又傻逼的我就决定做一个 Zelda 游戏:类似过去的克隆 / 启发型游戏。确实,每一个初学者都有点傻傻的。

    这门课程的期末考试是要求使用 Allegro 克隆一个 Pac-Man 吃豆游戏 ,但其实并不止于此!在我内心来说,贪婪的游戏开发者会觉得吃豆游戏又简单又单调,我想要做的是一个 Zelda 类型的大游戏!后来我发现,对于我这种才学会一个 for 循环的人来说(这都可以作为另一个文章主题来讨论了),吃豆子游戏竟然是一个非常耗时的任务。

    像我这种情况,无知就是幸运,没有什么东西可以阻挡我下载 Zelda 游戏中的射击图片,在一个我自己创造的简单粗暴的地图里,用来做移动和碰撞实验(这已经让我感觉自己就像程序上帝了)。不必说,我的吃豆子游戏从未见过天日,开发一个 Zelda 游戏简直有趣多了。

    游戏引擎……到处都是游戏引擎

    回到现在的日子,到处有着上亿数量的书籍、文章、开发日志,社交网络传播着相关的各种知识和各种引擎。一切都是免费或者类似免费的。按某种分类列举一些我头脑里所能想到的引擎:

    因为太多的选择,我们内心通常是矛盾的,到底应该选择哪个呢?

    屌丝: Godot 引擎

    在自我拼搏的这些年里,我和 Matheus 在引擎和编程语言上积累了大量的经验,不得不说,我们必须提到 Unity 这个引擎,我敢说这是目前在小工作室和独立开发者中最流行的引擎了。 2013 年,在我们深爱的 Critical Studio 工作室,我们使用它开发了Dungeonland 游戏,在当时来看,相对于其他引擎, Unity 是非常棒的选择。

    Some Dungeonland gameplay! Go play with 2 more friends, it's fun and free!

    现在来看它仍然是一个很棒的引擎,特别是在 3D 方面。但是在 Critical Studio 工作室关闭后,我需要一个更为简单的工具来做开发。 Unity 体积膨胀大了,加载速度变得缓慢,开发 2D 游戏要 hack 很多东西。

    接着我发现了 HaxeFlixel (它更像一个框架而不是引擎),它非常适合快速高效地进行原型设计和小游戏开发,我也能够在多平台上重用同一个代码集,另外它还能够使用 Flash 快速地发布游戏,给我的朋友们进行玩赏尝试。

    但是,我觉得还是有什么东西缺失了,或许是某个本地平台和游戏框架之间的桥梁?我想要一个简单地类似 HaxeFlixel 的工具,但是却又拥有更多的自定义控制,就像 WYSIWYG 编辑器或者像 Unity 编辑器那样。

    godot

    接下来的事情,一个名不见经传的新屌丝出现在城里,它就是 Godot 引擎。 Godot 于 2007 年开始作为一个私有引擎被开发,一直到 2014 年开源。经过 10 年的沉淀,已经变得非常成熟。

    当我们发现它的时候,我们的感觉是它很可能拥有我和 Rock Milk 所正在搜寻的一切。我们把 Reakt 打造成了 Godot 测试用的实验项目,并定义了一套全新的产品开发流程。最终我们喜欢上了它,因为我们发现在其他引擎上的缺点都在这里完美解决了。

    声明

    Starting a Flame War 101

    我并没有引发与其他编程语言、框架或者引擎口水战的意思,因此:

    • 我们并没有表示 Godot 比其他引擎更好、更强;(即使如此,也是个人观点而已)
    • 我们并没有表示其他引擎就很差
    • 我们并没有表示对于他们的缺点并不是没有任何解决方案
    • 我们并没有表示 Godot 的解决方案是完美无缺的

    这里的关键点在于:说明我们为什么喜欢它,以及它为什么更适合我们的商业和程序风格。如果我有冒犯的地方,请谅解,真的。(但是请不要动怒,没必要,是吧)

    OK ,开始吧……

    开源和社区

    Godot 开源并永久免费。通俗点说就是:

    • 没有个税,也没有所谓的年度、季度收入上限要求
    • 不强求使用它们的启动画面、他们的附加服务或者使用它们的云服务托管你的项目

    在 2015 年, Godot 加入了软件自由保护协会 Software Freedom Conservancy ,可以看出 Godot 对此非常关注。

    它的开发社区非常活跃,更别说它们的仓库提交量了,经常会有新的文章进度报告。在 Discord 上能看到大家发挥出的热情互助,也有他们自己的一些游戏讨论。

    跨平台编辑和发布

    Godot 针对每一个操作系统都有一个对应版本的编辑器: Windows, Mac 和 Linux 。甚至还有一个由 cam12win 放出的树莓派实验版本

    其他一切如常:

    • 桌面发布平台: Windowx, Mac, Linux
    • 手机发布平台: Android, iOS, Windows Phone (实验阶段) 以及黑莓系统(我没有开玩笑哦)
    • 网页版发布,使用 Emscripten ( WebGL 2.0 和 WebAssembly 正在开发中)

    当然还有一些其他平台的构建计划,甚至 Shin-Nil 已经让他的 2D 平台展示游戏在他的 XBox One 中运行了:

    https://www.youtube.com/embed/Uyw--v8EcWk

    并且 Deponia Playstation 4 也是使用的 Godot 制作。

    轻量级

    构建好的 Godot 只需要占用你的硬盘的 30M 空间,包含(几乎)了所有内容。如果你需要构建手机版本,你需要下载额外的 200M 的构建模板,仅此而已。

    这里我并不是因为下载速度快或者因为其他引擎占用了 3 到 30GB 的大空间而提出这点,而是为了说明 Godot 团队对性能的关注程度。 Godot 打开只需要一眨眼的功夫,我那用了 4 年的旧笔记本打开或者加载时间甚至都没超过 5 秒钟。我所等待过的最长时间大约是 1 分钟,那是发生在点击一个按钮发布到安卓手平台的 Debug 版本之间的时间开销。

    当然,最重要的是:它能反应出你的游戏的性能。当我发现 Godot 引擎本身就是一个 Godot 开发的游戏的时候,我被深深地震惊了!

    友好的版本控制

    你是否曾经遇到过在使用 Unity 或者 Unreal 的时候发生了场景或者预制体或者其他的对象文件在仓库的版本冲突问题?如果有的话,难么你应该知道这是多么痛苦的一件事了,特别是在大型团队里。

    在 Godot 中任何对象都是以文本文档的形式保存,对于合并冲突来说是绝对是一种非常友好而且可读性强的文件格式。因为我们能非常轻松地区别开多个场景中的多个对象(关于这个之后会谈论更多),使得每一个团队成员都能够专注于自己的工作。

    动画系统

    Godot 的动画系统是我见过的最强大而又简单易用的一个系统,我曾经使用过的所有动画工具具有的功能设置它都包含了。你可以对某个对象的任意属性进行动画设置,甚至包括函数的调用。除此之外,它还包含了一个非常简易的动画创建工具。

    动手比解释更能体会它的工作原理,我推荐你访问 GDQuest 和 Heartbeast 的视频,两位大牛利用他们的业余时间讲授创建游戏相关经验的视频,大部分是免费的。他们俩各自做了一个关于 Godot 的动画系统的介绍视频:

     

    动画工具介绍

     

    使用剪切动画技巧打造一个蝙蝠动画

     

    真实2D vs 假2D

    经常会遇到 Rock Milk 的哲学理论问题。为了弄清楚这个东西,我们创建了一个小而简单的游戏,尝试突破未开发的那些区域和一些创新机制。由于我们是两个家庭的普通人,经常一天只能抽出个把小时来开发我们的游戏,所以我们只专注于 2D 游戏开发。

    Godot 的 2D 引擎可圈可点,它不是假的 2D ,就像在 3D 空间把 Z 轴*平放*一样的假 2D 。对于 Godot 来说这意味着什么呢?

    • 像素作为坐标和单位使用,包括物理引擎中的使用
    • 更加高效、更加易用地 API ,无需在第三个轴上处理逻辑或者数学问题
    • 某些其他引擎上的典型解决方案在这里都变得没必要(例如:把 1 个像素设为一个单元,完美像素渲染, Z 轴分层和相机缩放问题等)

    换句话说,我们能很好的控制每个游戏物体的尺寸、位置、速度和碰撞,包括皮肤( HUD ),这经常是需要进行一个完整的 PITA 设置。(不过我们还是蛮喜欢 Unity 的新 GUI 系统的说)

    GDScript 脚本和 API

    GDScript 是 Godot 中代码处理的默认编程语言,能和引擎的相关特性非常吻合的结合在一起。

    通常只需要编写一点点代码就能做出一大堆动作效果,这是由于它那丰富的 API 。我曾以为每个对象都需要从头开始创建,但是 Godot 已经帮我们做好了,包括每一个操作和我所需要的自定义功能。

    另外,我觉得 GDScript 是让新用户拒而远之的最主要原因。我重点列举以下我所听见的抱怨中的几条:

    我是不是必须要学习一门只能在 Godot 中使用的编程语言?

    是的,朋友,但是这并不会多花费你多于两天的时间。这门语言非常简单,就像 Python 的兄弟版。

    最糟糕的情况是:至少你也将会学会另一门编程语言,而且学习新的语言能有助于你进行和别人不一样的思考方式(那是更好的方式)。

    我讨厌编程语言

    好吧,没有理由一定要尝试,我也没有什么可抱怨的。但是,如果你愿意的话,你可以完全使用 C++ 模块来编写代码然后轻松地导出为 GDScript 脚本。

    或许,你可能更希望等待 Godot 3.0 版本的发布(其实它就在 Godot 的社区……开个玩笑),因为 3.0 版将会支持 C# 以及 GDNative 脚本,也就是说到时候你可以使用Python , Go , D , Rust 甚至 Nim (或者任意其他你想绑定的编程语言)等语言编写代码。

    那么它的性能怎样呢?游戏代码如何?额

    一般对于你所能想到的 95% 的游戏我相信性能都足够满足了。如果你还是持有怀疑态度,那么像我刚才提到的,你完全可以使用 C++ 模块编写然后获得 C++ 的性能。

    如果在你的游戏里,某个部分算法有着极高的性能需求,那么你可以在此部分上单独使用 C++ 进行编程,在其他部分继续采用 GDScript 脚本。

    你可以阅读更多 Shin-Nil 的关于性能测试之类的文章。

    我的编程工具和软件并支持 GDScript 脚本

    Godot 有一个集成的代码编辑器,而且除了基本的脚本编写之外它还具有漂亮的智能代码提示功能(也就是说代码自动完成功能),以及强大的 debug 功能,另外包括运行时编辑功能,你可以看看 Juan Linietsky ( 也叫 Reduzio )的视频,他是 Godot 的主要开发者,视频地址在此:

    https://www.youtube.com/embed/50Vw4e6JPOI

    到目前为止,对于外部代码编辑器,完全支持的只有 Visual Studio Code ,使用的是Godot 工具,由 Geequlim 开发,但是其他软件包括 Sublime Text , Atom 以及GEdit 都能支持语法高亮功能。

    我的建议是:在批评之前先尝试使用 GDScript 脚本吧。如果你在一周之后还是不能顺利上手,效率也不高,那我赔你一颗糖吧。哈哈。(?)

    到这里还是不相信?那看一看 Juan 关于创造 GDScript 脚本的理由吧,或许它能让你改变主意:

    https://www.redditmedia.com/r/gamedev/comments/36u80q/godot_engine_11_out/crhjrw6/?embed=true&context=0&depth=1&showedits=false&created=null&uuid=null&showmore=false

    节点和场景系统

    节点是游戏中能够进行属性编辑的一个基本对象。它可以使一个 2D 精灵,一个 3D 模型,一些 GUI 控件元素或者仅声音的播放功能。 Godot 包含了大量节点可供使用和扩展,因此你可以完全创建属于你自己的节点类型。场景是由一组节点有层次的组织在一起构建而成,如同一棵大树。

    这也是我们最喜欢的特性,关于节点这个图做出了最好的解释:

    抱歉,对于这门语言(我撒了个谎)

    Godot 中一切都是场景。每一个场景都能包含其他场景和节点。你可以轻松地提取子节点作为一个场景,提高它的复用性, fracteed 先生在管道上就聪明地利用了这个特性:

     

    Sceneception = a scene within a scene within a scene. Nested scenes are perfect for items such as pipes #GodotEngine #gamedev#indiedev #b3d pic.twitter.com/KkxC2kAUcK

    — fracteed (@fracteed)  September 3, 2017

     

    为了让你更好的理解,我这里拿 Unity 来作对比:

    • 在 Unity 中一个*游戏物体*的行为是通过添加多个组件实现的。每一个组件都是一个脚本,所以一个对象可以有很多个脚本;(噢)
    • 在 Godot 中,每个节点只能拥有一个脚本,当然它本身已经拥有了一些基本的功能。你可以在场景中定义一个*游戏物体*,它由多个节点和其他的场景组成。这也就意味着默认情况下你可以使用预制体嵌套( prefabs )。下面这个例子来自 Godot 的官方文档,表示的是一个 Player 游戏物体

    godot_why_node_tree.png

    如果你想要阅读更多相关的内容,你可以读一下官方文档页面的:从 Unity 到 Godot > 场景系统

    小缺陷,但是解决方案已经在进行中

    在 Reakt 的开发过程中,我们使用 Godot 2.1.3 版本,发现了一些小的 Bug 和一些怪异的地方:

    • 我有一台 13 寸的 Macbook Pro Retina 。鉴于我所使用的 Godot 软件工具,有些 GUI 面板显得非常紧凑,一些按钮出现在了其他的 GUI 元素的上层,但是没有任何东西可以阻止继续使用它们
    • 当关闭动画工具的时候,它会把当前的编辑节点的默认状态设置为最后我所使用过的状态,我们不得不多次进行重置节点到原始的配置状态。最新的解决方案是,我们在关闭动画工具之前会先创建了一个*默认状态*并选中它。

    除了这点,我们的开发瓶颈在于整合手机平台第三方库,主要有:分析工具、广告中间网络以及崩溃报告。在 Godot 中创建原生模块非常繁琐:你不得不下载引擎源码,在指定的文件夹中创建并包含原生模块,编译 Godot 引擎,接着编译测试版和发布版。如果没问题的话,这些操作会生成一个可以在你的游戏中使用的手机平台模板,如果有问题,那么你不得不使用 USB 接头继续连接到你的手机上重新 debug 测试你的代码模块。啊哈……

    所有程序设置好之后你就可以使用它了,重新生成所有模块还是非常快的。在我们的第一个游戏上我们仅仅使用了 Frog-Square 创建的 Godot-Firebase 模块(感谢帮助和支持!)。

    我们想实现我们自己的中间网络层(鉴于 Firebase 只含有 AdMob ),但是投入-产出比暂时还是不值得我们这么去做,因为我之前已经提到过, Reakt 仅仅是一个实验项目,而且 GDNative 已经在 Godot 3 引擎中开始使用了,它也修复了一个我们遇到的一个问题,将来我们可以直接使用它,而不需要像我之前提到的那样从头到尾进行一次手动的编译过程。

    OK , Godot 3.0 即将到来……

    当然,目前还没有任何借口不去尝试一下它的!你可以使用它做些小 Demo ,这有助于你理解我所说的东西。

    另外,看下这个视频,了解一下 3.0 版本中正在开发的所有新特性:

    https://www.youtube.com/embed/XptlVErsL-o

    如果需要的话你可以下载一个 Alpha 版本 玩玩。还有,关注下这个引擎的开发路线,这真是游戏开发者的福音啊!

    除此之外, Godot 来到了它的第一个里程碑,它已经有了赞助商,这使得 Juan 可以全职全身心地投入到引擎的开发中来。

    我真心希望我能劝服你加入到这个激情的社区,帮助提升 Godot 引擎的成长速度。我是否已经打动你了呢?如果是的话,那么开始学习吧:

    https://www.youtube.com/embed/eHtIcbrii2Y

    Rock Milk 的目标是成为 Godot 提到的第一个推荐者,就像 P1X (自由坦克的创造者)和 Okam ( Godot 出生的地方,以及小狗 Mendonça 和 Pizzaboy 的互动历险记® 的创造者)。我真心希望在我们的旅程中能够遇到你,有任何疑问欢迎随时和我们来交流吧!

    Diego Machado ,一位万事通牛人:@Rock Milk

    三、其他

    太多的视频地址和链接,本文已经发布到微信公众号,如果需要查看相关链接和视频,请点击下方的阅读原文并开启翻墙模式吧。 :sunglasses:

    我的博客地址: http://liuqingwen.me ,欢迎关注我的微信公众号:IT自学不成才

    展开全文
  • Godot引擎具有坚如磐石的内置编辑器,但在(g)(n)vim环境中,我仍然感觉更舒适。 该插件提供: GDScript和GSL语法高亮化 折叠式的 运行命令: 运行当前场景:GodotRunCurrent 运行最后一个场景:GodotRunLast 选择...
  • Godot引擎中控制移动的几种方式 1。我们要讲什么? 本篇我们要梳理一下游戏中常见的几种角色移动的控制方式,比如: 使用键盘或手柄: 八个方向移动 旋转(左右键控制) + 移动(上下键控制) 使用鼠标: 自由...

    Godot引擎中控制移动的几种方式

    cover-02

    1。我们要讲什么?

    本篇我们要梳理一下游戏中常见的几种角色移动的控制方式,比如:
    使用键盘手柄

    • 八个方向移动
    • 旋转(左右键控制) + 移动(上下键控制)

    使用鼠标

    • 自由移动(点击位置)
    • 旋转(始终朝向鼠标) + 移动(上下键控制)

    2。准备一个简单的演示

    本篇为了聚焦我们要研究的问题,我们不再给角色加入动画等其它效果,仅使用godot引擎的图标作为精灵,之后的一切控制演示都由它承担。
    在这里插入图片描述

    • 首先建立一个以KinematicBody2D为载体的精灵,其包含的节点和层级关系如上图。
    • KinematicBody2D是一个运动学性质的节点。(在另一篇文章里会详细说)
    • Sprite是一个精灵节点,把godot的图标(icon.png)拖到它的Texture属性上。
    • CollisionShape2D是一个碰撞检测盒,我们给了它一个矩形形状。本篇文章中可以不使用。(加上是为了消除警告)
    • 给KinematicBody2D节点附加一个脚本。(选中此节点,然后点击右上角的在这里插入图片描述
      图标)
    • 最后我们可以看到如下效果,因为精灵默认处于(0,0)处,所以会展示在窗口的角落。因为我们脚本里什么都没做,所以图标也只是静静的躺在那里。
      在这里插入图片描述

    3。配置输入映射(Input Map)

    输入映射可以理解成什么东西呢?它相当于提前把我们可能按的键,比如键盘的W A S D、手柄的某个键或鼠标的某个键绑定到一个字符串,而godot提供了一个方便的函数,我们只要把我们绑定的字符串提供给这个函数,根据返回值真假(true or false)就可以知道与这个字符串绑定的的键是否被按下。

    • 找到配置的对话框:Project -> Project Settings… -> Input Map选项卡
      在这里插入图片描述
    • 从上面的图中可以知道,我们配置了5个映射关系:
      在这里插入图片描述
    • 好,现在如果我们要检测上、下、左、右键是否有按下,我们可能写出这样的代码:
    func get_input():
        ...
        if Input.is_action_pressed('move_right'):
            velocity.x += 1
        if Input.is_action_pressed('move_left'):
            velocity.x -= 1
        if Input.is_action_pressed('move_down'):
            velocity.y += 1
        if Input.is_action_pressed('move_up'):
            velocity.y -= 1
        ...
    
    • 下面是输入映射的基本操作:在Action文本框中输入你想绑定的字符串名字,一般是提示性的(比如:move_left、attack等等);点击Add按钮后,你要绑定的字符串会出现在下面的列表里;最后在你的字符串右边,点击"+"号来添加你要将哪些键映射到这个字符串。
      在这里插入图片描述
    • 能不能对godot所有支持的键做一个基本的介绍,比如:
      在这里插入图片描述
    • 其中Joy Axis(轴)的标记会多一点,因为一般手柄上会有左右两个摇杆,所以:0表示左摇杆横轴,1表示左摇杆纵轴,2表示右摇杆横轴,3表示右摇杆纵轴;“+” 表示正半轴,"-"表示负半轴;这两组标记组合一下得到下面的所有输入:
      在这里插入图片描述
    • 复习一遍。所以,下面这个映射的含义是:当第0号玩家(Device x表示第x号玩家,用于多个人玩的时候)的手柄的左摇杆的横轴推向正半轴的时候,表示它要往右移动(呼~)
      在这里插入图片描述
    • 总结一下。引入这种输入映射的机制有什么好处,相信大家也都能有点体会:
    • 比较明显的一点是,可以将多个键映射到一个字符串上,拿移动来说,即支持键盘同时支持手柄的游戏很常见,也非常方便且必要的,用这种多对一的关系可以很自然的实现,而不用在代码中写两套检测输入的逻辑;
    • 第二,明确了语义,如果我们直接在代码里检测X键是否被按下,如果被按下就执行一系列动作,那到底是什么动作呢?通过将X键绑定到“jump”这个字符串,当代码中再遇到它时,并不是X键被按下,而是跳跃键被按下了。恩!我不用自己瞎猜了~
    • 还有,godot帮我们做这一切,这意味着,当我们想改变某个键的含义时,只需要在Input Map里把名字改了,非常灵活~
    • 输入映射已经讲的足够多了,下面我们正式开始~

    4。八个方向的移动

    八个方向的移动,也就是我们理解的那样,先看一眼下面的图来确认一下:
    在这里插入图片描述
    上下左右这个好理解,根据我们第【3。】部分对输入映射的讲解,在检测到"按下键盘的W S A D" 或 “手柄摇杆扳向对应方向” 时分别往对应的方向移动即可。
    另外四个方向呢?这个我们结合代码来讲,在之前附加的脚本中键如下面的代码:

    extends KinematicBody2D
    
    export (int) var speed = 200
    
    var velocity = Vector2()
    
    func get_input():
        velocity = Vector2()
        if Input.is_action_pressed('move_right'):
            velocity.x += 1
        if Input.is_action_pressed('move_left'):
            velocity.x -= 1
        if Input.is_action_pressed('move_down'):
            velocity.y += 1
        if Input.is_action_pressed('move_up'):
            velocity.y -= 1
        velocity = velocity.normalized() * speed
    
    func _physics_process(delta):
        get_input()
        velocity = move_and_slide(velocity)
    
    • 明确一点很重要:速度是一个矢量!
    • 我们用了4个if分支,而不是if…elif…elif…else。这就造成了一种效果,速度会累加起来(再次明确,速度是一个矢量,累加的不只是大小,还有方向)
    • 结合一个具体过程来理解:
    • 某次,我们同时按下了向右和向下(W&&D键或摇杆右下扳),也就是说先后命中了两个if语句(如下代码):
        if Input.is_action_pressed('move_right'):
            velocity.x += 1
        ...
        if Input.is_action_pressed('move_down'):
            velocity.y -= 1
    
    • 速度累加过程如下图:步骤1,给速度的横轴正向增1;步骤2,给速度的纵轴正向增1(godot的y坐标增向和数学中的相反);步骤3,这时这两个矢量相加的方向是指向(1,1)但大小是“根2”,这是不行的,这样的效果是,精灵斜向(比如,右下)运动要比正向(比如,上下左右)运动快!;所以有了步骤4,将速度重新规范化到1,整体运动速度的大小则靠乘一个因子speed来实现。
      在这里插入图片描述
    • 最后看看演示效果:
      在这里插入图片描述

    5。旋转(左右键控制) + 移动(上下键控制)

    有了第【4。】中对各种概念的把握,其它几种控制运动的方式也就更好理解了,我们要梳理的第二种控制方式可以产生类似于行星的轨迹,这在好多星球大战的游戏中可以用到。将下面的代码键入脚本:

    extends KinematicBody2D
    
    export (int) var speed = 200
    export (float) var rotation_speed = 1.5
    
    var velocity = Vector2()
    var rotation_dir = 0
    
    func get_input():
        rotation_dir = 0
        velocity = Vector2()
        if Input.is_action_pressed('move_right'):
            rotation_dir += 1
        if Input.is_action_pressed('move_left'):
            rotation_dir -= 1
        if Input.is_action_pressed('move_down'):
            velocity = Vector2(-speed, 0).rotated(rotation)
        if Input.is_action_pressed('move_up'):
            velocity = Vector2(speed, 0).rotated(rotation)
    
    func _physics_process(delta):
        get_input()
        rotation += rotation_dir * rotation_speed * delta
        velocity = move_and_slide(velocity)
    
    • 我们的控制方式是:按左右旋转(键盘的A、W键或摇杆往左右扳),按上下移动。
    • 我们引入了控制旋转速度的变量rotation_speed和记录旋转方向的变量rotation_dir
    • 发现有什么不同了吗?不同的本质在于旋转多少度是一个标量,rotation_dir我们只是想要它的符号,它的+-两个符号分别代表了顺时针或逆时针旋转;rotation_speed表示旋转多少度。
    • rotation是KinematicBody2D节点本身的属性,所以修改了它就可以让精灵转动起来了。
    • 最后两个问题:velocity为什么没有规范化?速度为什么要调用rotated()?这两个问题都可以用下面的代码解答:
    velocity = Vector2(speed, 0).rotated(rotation)
    
    • Vector2(speed, 0)可以写成Vector2(1 * speed, 0)所以速度本身就是已经规范化好的。
    • 调用rotated(rotation)的原因是我们始终想让精灵朝旋转的方向运行,所以也叫“小行星轨迹”!
    • 下面是“小行星轨迹”的演示:
      在这里插入图片描述

    6。自由移动(鼠标点击位置)

    这种控制方式是最直观的一种,适合很多RPG游戏,因为我们希望我们点到哪,我们控制的角色就在地图上走到哪。整顿一下思路,首先需要有个方法来得到当前用户鼠标点击的位置,我们之前绑定了一个click字符串可以直接拿来用,然后用当前精灵所在的位置和点击的位置(目标位置)构造出一个速度,大功告成!

    extends KinematicBody2D
    
    export (int) var speed = 200
    
    var target = Vector2()
    var velocity = Vector2()
    
    func _input(event):
        if event.is_action_pressed('click'):
            target = get_global_mouse_position()
    
    func _physics_process(delta):
        velocity = position.direction_to(target) * speed
        # look_at(target)
        if position.distance_to(target) > 5:
            velocity = move_and_slide(velocity)
    
    • 如果发生了一个鼠标左键的点击事件,紧接着我们就可以用get_global_mouse_position()函数得到点击的位置。
    • position是KinematicBody2D本身的一个属性,也就是精灵当前所在位置。
    • point_A.direction_to(Point_B)可以得到点A到点B的方向向量(自然是规范化后的单位向量)
    • 得到的单位方向向量 * speed,speed是因子,从而控制整体运动速度
    if position.distance_to(target) > 5:
    	...
    
    • 最后一个问题,也就是为什么要加上面这句条件代码?目的是为了防止抖动。为什么会产生抖动?因为每次执行到move_and_slide(velocity)这个运动函数时所走过的距离之和并不一定正好等于精灵位置和目的位置间的距离。不太懂?没关系,我们试着举一个实例:
    • 假设我们将speed提高到36000,那么速度velocity = 1 * 36000 = 36000,单位是像素/秒(pps)
    • 假设我们的每秒帧数(fps)是60左右,那么一帧所用时间大概稳定在1/60秒左右,也就是说从上一次move_and_slide(velocity)执行到这一次move_and_slide(velocity)大概是1/60秒
    • 由以上两个假设,我们可以推出:每次执行到move_and_slide(velocity)时,我们走过的距离基本是36000 * 1/60 = 600个像素的倍数。
    • 现在,在距离精灵300个像素处点击,过程如下图:
      在这里插入图片描述
      在这里插入图片描述
    • 圈1,我们本应该走300像素,可是我们起步就是600像素。圈2中,再次执行到函数体时,我们的确还没有到达目标位置(因为超了300像素),但是计算出的速度与之前相反,于是我们本想反向走300像素,但是起步还是600像素,所以很不幸,我们回到了原来的位置。圈3与圈1发生一样的情况,后来的圈4圈n则不断重复这一过程,精灵由此表现为在两个位置不断切换,当速度不那么大时(此处为了效果明显,我们用了一个较大的速度 ),两个精灵的位置重叠,便感觉精灵在不停的“抖动”。
    • 这就好像,你的步子恒为1米,但是在你想踩到你前方半米处的地面,结果是你总是在原处和你前面一米处踱步,永远也踩不到半米的那个地,原因是你的步子迈的太大了!
    • 还是看看最终的效果:
      在这里插入图片描述

    7。旋转(始终朝向鼠标) + 移动(上下键控制)

    有了前面几种控制运动的铺垫,这种只不过是前面两种的组合情况罢了。很多枪战类游戏中使用了把玩家与鼠标的连线方向来做为弹轨方向的控制方式。

    extends KinematicBody2D
    
    export (int) var speed = 200
    
    var velocity = Vector2()
    
    func get_input():
        look_at(get_global_mouse_position())
        velocity = Vector2()
        if Input.is_action_pressed('move_down'):
            velocity = Vector2(-speed, 0).rotated(rotation)
        if Input.is_action_pressed('move_up'):
            velocity = Vector2(speed, 0).rotated(rotation)
    
    func _physics_process(delta):
        get_input()
        velocity = move_and_slide(velocity)
    
    • get_global_mouse_position()之前说过是为了得到鼠标的位置;look_at()(是根类Node的方法)函数很方便,可以将精灵转动适当的角度,以朝向目标点;这两个函数组合起来产生的效果就是,精灵始终朝向我们鼠标所在位置,好像它在监视我们鼠标动作的一举一动!其它的代码没有什么新东西,都在之前涉及到了,这里就不再重复了。
    • 还是看看最终的效果:
      在这里插入图片描述

    8。总结

    • 我们讲了很多,很多点可以运用到自己的游戏设计中,也可以帮助我们更好的理解代码做了什么,最大化godot引擎的威力。
    • 本文参考:https://docs.godotengine.org/en/stable/tutorials/2d/2d_movement.html#
    • 估计大家也读累了(其实是我写累了),总结就自己脑补吧~
    • 如果觉的文章对你有帮助,就走波关注吧,之后继续分享,谢谢支持~

    公众号:Dawo

    展开全文
  • 适用于Godot引擎MySQL连接器模块 要求: C ++ MySQL连接器库,可以使用以下命令安装在Unix / Linux系统上:apt-get install libmysqlcppconn-dev 安装: 为您的Godot版本使用特定的分支,master分支应该为Godot的...
  • Godot引擎Godot引擎】是一款免费且开源的游戏引擎。 Godot is completely free and open source under the very permissive MIT license. No strings attached, no royalties, nothing. The users’ games are ...

    Godot引擎

    【Godot引擎】是一款免费且开源的游戏引擎。

    Godot is completely free and open source under the very permissive MIT license. No strings attached, no royalties, nothing. The users’ games are theirs, down to the last line of engine code.

    GitHub:https://github.com/godotengine/godot
    官网:https://godotengine.org/

    它看起来很“小巧”,我觉得很多事情用它或许能更方便实现。另外它作为一个开源的引擎也很值得研究其源代码。

    本篇的目标:

    • A. 下载引擎并运行
    • B. 编译源代码

    A. 下载引擎并运行

    如果不关注引擎的源代码,而只是想使用引擎的话,则可以直接在官网下载页面里下载引擎。

    它提供了两个版本:“Standard version”和“Mono version”
    在这里插入图片描述
    关于二者的区别,在这篇帖子中有人解释,区别在于脚本语言:“Standard version”使用的脚本语言是Godot创造的GDScript,而“Mono version”可以使用 C# 作为脚本语言。
    我这里想体验下它自己的脚本语言,因此我选择“Standard version”。

    下载之后,解压,是一个单独的exe:
    在这里插入图片描述
    不过这并不是安装程序,而是直接可以运行的引擎:
    在这里插入图片描述

    正如官方,所说,解压之后就可以直接运行,Godot是“自包含的”(self-contained)而且不需要安装。
    在这里插入图片描述
    如果运行时遇到了问题,可以去Troubleshooting

    B. 编译源代码

    引擎源码:https://github.com/godotengine/godot
    官方文档指导如何编译引擎源码:Compiling — Godot Engine (latest) documentation

    0. 准备

    官方文档中有指出所需要准备的工具:
    在这里插入图片描述
    我结合自己当前的环境,做了以下准备:

    • VS2019,当前已安装。(在微软VS官网上可下载)
    • Python 3.8,当前已安装(在python官网上可下载)
    • SCons 4.0.1(通过python的pip下载,见后续步骤)
    1. 设置Python的环境变量

    确保环境变量PATH中有Python的exe所在的路径:
    在这里插入图片描述
    如果设置正确,在cmd中输入python应该可以有提示:
    在这里插入图片描述

    2. 安装SCons

    在 Cmd中输入python -m pip install scons来安装SCons
    在这里插入图片描述
    正如黄字Warning所提示的,scons.exe所在的目录没有在PATH中,因此我需要将其加入。

    随后在Cmd中输入scons --version应该会显示信息:
    在这里插入图片描述

    3. 运行SCons

    打开Cmd。
    cd到godot引擎源码的目录
    然后输入scons platform=windows vsproj=yes,即开始编译(并生成vs的工程)
    在这里插入图片描述
    最终,经历过一段时间后,编译完成,并且生成了VS工程
    在这里插入图片描述
    在这里插入图片描述
    随后,可以在VS中编辑代码了,并运行了。
    在这里插入图片描述

    也可以在VS中构建工程,不过可以看到,背后还是用NMake配置,使用了SCons:
    在这里插入图片描述

    展开全文
  • 首先,在setup.py中将变量GODOT_PATH更改为godot引擎源的根目录。 然后运行: python setup.py 这个脚本做了几件事: 下载 libtorch cpu only 版本,解压 复制GodotSharedMemory模块并编译标准godot编辑器(x11 ...
  • Godot节点扩展,又名Godot NExt,是Godot 3.1+存储库,专用于收集当前在香草Godot中不可用的基本脚本类。 您可能已经注意到,Godot Engine的初始节点产品是通用的,有意不针对特定类型的游戏。 该存储库的目的是...
  • 一个简单的用于 godot 引擎的 php 主服务器 服务器设置 您必须创建一个新数据库(我使用 mysql,但您只需稍作更改即可使用您想要的): 表:游戏领域: ip char(15) 唯一 名称字符(35) 时间戳整数(11) 在您的...
  • Minecraft,但使用godot引擎 资产 如果要自己运行它,则需要下载Minecraft资产,并将其放入用户文件夹中的mcassets文件夹中。 对我来说,它位于C:\Users\Martin\AppData\Roaming\Godot\app_userdata\Godotcraft 。 ...
  • Godot 引擎的库存组件 演示 (非常简单的)演示包括: 4 个“项目生成器”(是的,4 个“GoBot”图标):从它们拖拽,它们会生成一个项目。 4 个库存窗口。 您可以抓住它们的标题来移动它们,并在这些窗口之间...
  • Nakama Godot演示 该演示演示了如何在上使用 。 它展示了以下Nakama功能: 身份验证,会话和断开连接。 。 套接字和管理连接。 。 带有弹出窗口的应用内。 字符颜色自定义。 平台化机制和同步玩家。 多个...
  • 一款免费开源的2D精灵编辑器,使用Godot引擎制作!可在Windows、Linux和MacOS上使用。可在Windows、Linux和MacOS上使用 Pixelorama - 您的免费开源精灵编辑器! 由 Orama Interactive 使用 Godot 引擎制作,用 ...
  • 本人整理的GDScript教程(英文版),PDF版本,带目录,不喜欢的同学可以移步至http://www.reddit.com/r/godot/comments/1vcnen/notes_on_undocumented_tidbits/查看英文原版!
  • Godot的Voxel工具 一个用于在Godot Engine中创建体积世界的C ++模块。 特征 实时3D地形可在游戏中进行编辑(与基于高度图的地形不同,它允许悬垂,隧道以及用户创建/破坏) Godot物理整合+交替的类似于Minecraft的...
  • godot引擎

    2019-12-28 11:19:13
    小巧,精干的引擎,支持2D/3D开发,内置GDScript脚本,类python语法。 https://godotengine.org/

    小巧,精干的引擎,支持2D/3D开发,内置GDScript脚本,类python语法。

    https://godotengine.org/

    展开全文
  • 使用godot引擎和node.js制作在线多人游戏的样板是什么? 支持的平台它是如何工作的如何启动它是什么? 这是一个模板,您可以从中启动任何(非AAA)多人项目。 它实现了非常受欢迎的游戏室和密码连接系统。 您当然...
  • 用于godot引擎的动态skydome和ToD插件。 状态: Beta。 感言: 配置良好的反射探头可以实现最佳反射。 拉取请求: 目前,我不接受请求请求。 欢迎反馈。 安装: 克隆或下载存储库。 在您的项目中创建一个名为...
  • Godot引擎制作的简单塔防游戏 要求 Godot Engine 3.x 资料来源 asset /:用于生成资产的源文件(.blend,.xcf等) TowerDefense /:Godot项目(project.godot,场景和gdscripts) TowerDefense /资产/:处于最终...
  • Wwise Godot集成 欢迎! 该存储库将集成到。 目前,支持Wwise版本2019.2.1.7250。 特征 Wwise包装器库可用于Windows,macOS,Linux,iOS和Android的游戏和应用程序中。 这些作为提供。 集成应用程序可简化将Wwise...
  • 戈多尔 在godot中进行类似rogue的实验
  • 注意:这仅与 Godot 3.0 或更高版本兼容。 对于 Godot 2.x,使用。 如果您喜欢我的工作,请考虑在上给我买杯咖啡。 安装 只需从 Godot Asset Library 下载: : 。 或者,下载或克隆此存储库并将addons文件夹的...
  • godot-arpg:在YouTube上使用Heartbeast制作的Godot引擎中的ARPG教程
  • Lua 5.4 language support for Godot Engine 3.2.x-stable (4.0-dev too unstable to work with for now) WIP (heavily updated so you can expect constants changes - no commitment with feature freezing at ...
  • Godot Trail System是Godot Engine的高级Trail / ribbon插件,类似于Unity3D的系统。 该插件提供3D和基本2D功能的完整功能(稍后会更新)。 特征 使用曲线可变宽度。 使用渐变可变颜色。 拉伸和平铺的纹理。 对齐...
  • ProtonTrail-Godot的3D Trail插件 概述 Godot Engine的3D Trail自​​定义节点 在运行时生成 可调分辨率 它只是一个网格,因此您可以在其上应用自己的材料 如何使用 将存储addons到您的addons文件夹 转到Project ...
  • 戈多脚本 Godot 引擎有用脚本的集合
  • GoDot Engine 模块,用于加载 SAM(超级动画格式)代码从 cocos2d-x 加载器移植到 GoDot 引擎。 这是在行动: : #Super Animation:Super Animation Format 是一种自定义的 Flash 动画导出格式。 该格式的 cocos...
  • godot-isometric-framework:等轴测游戏的Godot引擎插件集合

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 898
精华内容 359
关键字:

godot引擎