![17d21b82c603f7d30be41087916454ac.png](https://img-blog.csdnimg.cn/img_convert/17d21b82c603f7d30be41087916454ac.png)
有了前面两个文章的铺垫
kylaCpp:关于进入独立游戏的准备zhuanlan.zhihu.com![142df1892d28c9eef6e587d0b7573ddc.png](https://img-blog.csdnimg.cn/img_convert/142df1892d28c9eef6e587d0b7573ddc.png)
![d2c4e4d179dd1cdd0383dbb0b13a51c7.png](https://img-blog.csdnimg.cn/img_convert/d2c4e4d179dd1cdd0383dbb0b13a51c7.png)
你现在肯定已经有了做一个游戏方向和准备了。
呢我我将带领大家做一个放置类的小游戏,游戏虽小,但是我尽量吧godot的功能给全部展示出来。
首先在你喜欢的地方创建一个文件夹,这个文件夹以后就当作你的工作目录。
然后打开godot 新建项目
![07b924a4428e33f051fe855c2249edc3.png](https://img-blog.csdnimg.cn/img_convert/07b924a4428e33f051fe855c2249edc3.png)
玩法是这样的当我点击一下饼干,呢么就会做一块饼干,当饼干到达一定程度后,就会自动解锁一些新的东西,然后可以用饼干购买一些工具进行自动做饼干。
首先创建一个node2d节点,
![957d19ae3d8c8b0df49df98f64ceecef.png](https://img-blog.csdnimg.cn/img_convert/957d19ae3d8c8b0df49df98f64ceecef.png)
然后在文件板块创建一个assets文件夹专门用来存放资源,scene专门存放场景。
![abce3b8a48387a752b6557f99230b2a6.png](https://img-blog.csdnimg.cn/img_convert/abce3b8a48387a752b6557f99230b2a6.png)
接下来,有两种方法,第一使用按钮当作饼干,点击按钮做一次饼干。
第二使用area2d节点,他可以检测自定义区域里面的鼠标,物体进入等事件。
简单起见,使用第一种。
右键node2d 创建新节点,在绿色节点下找到button并创建。(绿色节点是ui比如按钮、文本框、弹出框、输入行等,蓝色通常是2d比如精灵、灯光、物理、粒子等,红色是3d)
然后在点击button 看到下面有个icon 可以选择这个按钮的图标,你可以选择图片拉进去,或者点击选择文件,然后吧flat勾上,他可以吧背景去掉只显示图片。
我这里简单的画了一个饼干
![d9097f32f2195aa06969016a705d9a1f.png](https://img-blog.csdnimg.cn/img_convert/d9097f32f2195aa06969016a705d9a1f.png)
![6fcfb3e63a6e4b49b1dd94c0e3f7a93e.png](https://img-blog.csdnimg.cn/img_convert/6fcfb3e63a6e4b49b1dd94c0e3f7a93e.png)
然后现在你可以点击右上角的运行了,不过它会提示你这个场景没有保存,你可以把它命名为main.tscn 然后保存进scene文件夹里,这个是主要游戏场景。(在godot里面万物皆可场景,你可以看到任何东西都能保存为场景和实例化场景)
接着在运行你会发现他说没有设置开始场景,这个意思是当你启动游戏的时候,这个引擎不知道他最先启动的是哪个场景。你可以在project setting 里面的run 里面找到然后吧刚刚保存的场景设置进去。(config 里面name 就是运行时窗口上的游戏名字,icon就是运行是窗口的小图标,默认都是godot的图标可以自己设置,boot splash里面的image 是当你运行游戏是有个大大的godot图像,你也可以自己设置自己的开始运行图像,fullsize 是是否全屏,bg color是开始运行是的背景颜色)
![fb5f56bd8e5e7e631839801a80a0badb.png](https://img-blog.csdnimg.cn/img_convert/fb5f56bd8e5e7e631839801a80a0badb.png)
现在你可以运行看一下
![ca551a7e558475876d299b1ddf6beb4a.png](https://img-blog.csdnimg.cn/img_convert/ca551a7e558475876d299b1ddf6beb4a.png)
你肯定发现了这个饼干似乎不是和编辑器里的位置一样的,没错。
当你运行的时候,用户们的可见范围是编辑器里面的紫色边框里面。
这个饼干太小了,我们可以把它拉大一点,并且放到中间一点的位置。
因为这是个ui节点,所以你手动啦的话他只会吧边框拉大,我们要把它的整体拉大。
有多种方法,你可以手动设置sclae 进行变大
![8dcca21938dd5a7129a15d4bb40337f9.png](https://img-blog.csdnimg.cn/img_convert/8dcca21938dd5a7129a15d4bb40337f9.png)
也可以
![27886bb8ee25e4cd5e19ae7ac73aefc5.png](https://img-blog.csdnimg.cn/img_convert/27886bb8ee25e4cd5e19ae7ac73aefc5.png)
选择拉升模式进行手动拖拉。
然后你发现拉达以后似乎有一点模糊
![8baf0c2ffcfc343f7318b0d1cd1c5504.png](https://img-blog.csdnimg.cn/img_convert/8baf0c2ffcfc343f7318b0d1cd1c5504.png)
图片拉大后肯定会有点失真,但是如果不想要模糊的效果。可以点击图片,在文件目录里面找到图片存放的位置,然后在import板块里面重新导入,取消filter的勾选,然后reimport
![e09059b9cb3aa5f6463a22a09917b3e3.png](https://img-blog.csdnimg.cn/img_convert/e09059b9cb3aa5f6463a22a09917b3e3.png)
filter是启用线性插值。结果是更平滑(更少块状)的纹理。但在制作像素完美游戏时通常会禁用此设置。更多的有关导入信息可以查看官方文档这里是导入的文档。
然后就发现这个饼干就很清晰了。(更多导入知识,godot的项目文件夹里面有个.import文件,打开后你会发现里面又有关图片的md5和stex文件,其实不止图片如果又音乐和场景和字体的话他也有,然后你发现每个你放进目录的图片或者音乐等资源都会生成一个对应的xxx.import文件,这是因为godot让你高度自定义你的每一种资源,你在导入里面去调整他的压缩大小,音频是否循环等参数或者使用默认自动导入,导出后的资源就会自动隐藏.import里面)点击这里可以看官方介绍
然后当你运行并点击饼干的时候你会发现有个蓝色框框,这是因为我们这个节点是按钮节点的关系,这是他的特有属性,就像你在window上点击按钮后他也会出现一个蓝色的边框来反馈出你按下了这个按钮,我们可以重新设置按下按钮提示的这个样式
![7f572bc3f6d70d168cd96d633534e258.png](https://img-blog.csdnimg.cn/img_convert/7f572bc3f6d70d168cd96d633534e258.png)
点击按钮在属性栏里面向下拉,找到control里面的custom styles 里面的focus 勾上,这个是当这个按钮获得焦点是的样式,然后新建一个style box empty 也就是一个空的样式,这样当这个按钮获得焦点时,他就什么都没了。(hover是鼠标放上去的样式,pressed是按下的样式,disabled是禁用按钮的样式,normal是默认样式)勾选后就按照勾选的后面的自定义样式显示,不勾选就是默认。
然后我们需要做一个需要写代码的操作了,首先我讲解一下脚本在godot里面的作用。
![404374d20276596465808085931f198a.png](https://img-blog.csdnimg.cn/img_convert/404374d20276596465808085931f198a.png)
脚本会向节点添加行为。它用于控制节点的功能以及它与其他节点的交互方式:子节点,父节点,兄弟节点等。脚本的位置在自己当下的这个节点。换句话说,该脚本继承了该节点提供的功能。
这句话是官网的解释,如果你是一个有代码编写经验的人并且有着游戏工作的经验你肯定能懂。但是要照顾到有可能不是技术出生或者第一次做游戏的人我需要讲解一下。
简单地说如果只有节点的话,呢么这个游戏就是一个动画片,一部电影,他无法做一些很复杂的功能和复杂的交互,而脚本就是寄生到一个节点里并且控制这个节点的属性的作用。
我们可创建一个脚本先试一下。
首先右键饼干这个按钮创建脚本。
![f10fd72d480fd936e5e9162cf9c8911b.png](https://img-blog.csdnimg.cn/img_convert/f10fd72d480fd936e5e9162cf9c8911b.png)
现在我们打开它看一下
![47a767a249b83c3aaad1a303647a1630.png](https://img-blog.csdnimg.cn/img_convert/47a767a249b83c3aaad1a303647a1630.png)
extends 翻译过来就继承,因为是在button上面创建的脚本,要控制button所以要继承button这样就可以操作button里面的属性方法。
然后是func _ready(): pass 如果你在高中的时候写过c语言的hello world的话,呢你可以把这个理解成 void main(){},当游戏运行时,并且这个按钮节点初始化好了,呢么他将会自动调用这个函数(方法)。
gdscript的语法和python很类似 没有括号 写起来更加自然 更加接近英语。我会每行都用中文注释来解释。(如果有经验的小伙伴可以直接看官方api)
Godot Engine latest documentationdocs.godotengine.orgapi 是什么呢,准确的说就是我现在不知道该这个button里面有什么方法和属性,比如我要操作这个button去移动它,但是如何做呢么官方api ctrl+f 搜索button 里面就有介绍,如果没有有可能时他的父级,看他继承谁,去看他的父级寻找移动的方法。
现在我要点一下这个按钮,按钮就往左边移动50个像素。
首先我要知道按下按钮,这个时候信号就有用了,还记得之前一章说的么,有两种方法可以连接信号,第一可视化连接,第二代码连接。
首先第一
![d692e0e9e9165c847fc143837ef3dd89.png](https://img-blog.csdnimg.cn/img_convert/d692e0e9e9165c847fc143837ef3dd89.png)
选择pressed 双击
![e10122d9503c826afd23f4ccd305d9cc.png](https://img-blog.csdnimg.cn/img_convert/e10122d9503c826afd23f4ccd305d9cc.png)
选择饼干这个节点,因为我们只有饼干加了脚本,然后下面时在method in node 里面可以该方法名然后右边可以选择增加参数,然后connect
![d6dd1c5359874ef534976031d89679a9.png](https://img-blog.csdnimg.cn/img_convert/d6dd1c5359874ef534976031d89679a9.png)
![13216ead5e8abfbf3083e537f3a914fd.png](https://img-blog.csdnimg.cn/img_convert/13216ead5e8abfbf3083e537f3a914fd.png)
可以看到他已经连接了,这个时候当你点击按钮的时候就会促发_on_pressed这个方法,但是我更喜欢用第二种方法。首先吧这个绿色的连接右键取消连接。
![9967b9548205b3bc469bf24d93f99207.png](https://img-blog.csdnimg.cn/img_convert/9967b9548205b3bc469bf24d93f99207.png)
这是通过代码连接。我在注释中写了,你会发现pressed可以换成其他的比如button down button up等 在信号和官方api中都有介绍。按钮被按下,被弹起,pressed时按下后弹起后一个轮回调用。这个时候运行一下看看。
![d22888414ae242f709c23b6a8f009127.png](https://img-blog.csdnimg.cn/img_convert/d22888414ae242f709c23b6a8f009127.png)
刚刚开始,可以自己消化下。
小练习:可以试一下如何在饼干的上边加一个数字并且当我按下饼干时,数字增加1。
提示:可以创建一个label 的节点,
再脚本里面获取其他节点的位置 get_node("名字") 或者 $名子,比如我要获取我的子节点的名字$子节点名字 比如同级$"../节点名字" 然后改label的text $label.text = xxx 记住要是字符串不能是int哦
点击这里下载本课资源kylacpp.cn如果你对这个引擎或是我的教程感兴趣的话可以加入我的qq群:691534145
虽然里面有很多水货,但这应该是国内最活跃的godot engine 并且讨论游戏的讨论群了。