用的是默认断句,只勾选视频慢速对齐,以前4.02版本没有出现过问题,更新到4.05之后,才出现,有的视频可以,有的就不行。
1
00:00:00,020 --> 00:00:03,460
And now we can write a couple of lines of code
1
00:00:00,020 --> 00:00:03,953
好,现在我们来写几行代码
2
00:00:03,953 --> 00:00:08,186
对于玩家,首先我要声明几个基本变量
3
00:00:08,186 --> 00:00:11,586
需要一个方向变量
4
00:00:11,586 --> 00:00:14,852
类型必须是 Vector2
5
00:00:14,852 --> 00:00:22,485
设成 Vector2 类型的话,默认就是一个 x 和 y 都为 0 的 Vector2
6
00:00:22,485 --> 00:00:30,618
这正是我想要的。当然如果想写得更明确一点,也可以写成 Vector2(0, 0)
7
00:00:30,618 --> 00:00:39,551
效果一样,看你喜欢。然后玩家还需要一个速度变量,类型设成整数
8
00:00:39,551 --> 00:00:44,884
默认值设为 200。好了,有了这些之后
9
00:00:44,884 --> 00:00:48,417
我要调用一个每帧都会运行的函数
10
00:00:48,417 --> 00:00:52,217
可以写 func process
11
00:00:52,217 --> 00:00:57,983
也可以写 func physics process
12
00:00:57,983 --> 00:01:08,683
我选 physics process,因为后面处理碰撞时,会涉及一点物理运算。不过目前用哪个都一样
13
00:01:08,683 --> 00:01:15,949
在这个函数里,我们要移动玩家的位置,其实就是获取当前节点的坐标
......
住键盘 Ctrl 键,鼠标点击 Input,就能打开它的文档
114
00:10:44,322 --> 00:10:50,222
往下翻一点,能看到所有相关的方法
115
00:10:50,222 --> 00:10:56,588
方法挺多的。其中我们最常用的方法是 get vector
116
00:10:56,588 --> 00:11:01,088
点进去,然后我们来做个小练习
117
00:11:01,088 --> 00:11:15,254
请大家阅读文档,搞清楚 Input.get vector 到底做了什么、怎么用。现在暂停视频,看看你能掌握多少
118
00:11:15,254 --> 00:11:21,087
希望你读了这段文档。我觉得整体来说挺直观的
119
00:11:21,087 --> 00:11:24,522
简单来说,get vector 需要传入四个参数
120
00:11:24,522 --> 00:11:32,297
负 X、正 X、负 Y 和正 Y。用通俗的话说就是左、右、上、下
121
00:11:32,297 --> 00:11:36,097
把这四个方向传到 get vector 里就行
122
00:11:36,097 --> 00:11:45,797
把这些方向传给 get vector,它就会返回一个 Vector2,自动帮我们处理好所有方向
123
00:11:45,797 --> 00:11:52,763
换句话说,回到玩家脚本里,我要删掉所有这些
124
00:11:52,763 --> 00:11:59,463
改成用 Input.get vector() 来更新 direction
125
00:11:59,463 --> 00:12:03,896
四个方向参数:负 X 是 left
126
00:12:03,896 --> 00:12:10,962
正 X 是 right,负 Y 是 up
127
00:12:10,962 --> 00:12:19,362
正 Y 是 down。填好之后运行游戏,就可以自由移动玩家了
128
00:12:19,362 --> 00:12:26,628
就像魔法一样。松开按键,玩家就停下,效果非常好
129
00:12:26,628 --> 00:12:35,028
get vector 在开发中会频繁使用,实用性极强。它的逻辑并不复杂
130
00:12:35,028 --> 00:12:40,828
只需传入四个方向参数,返回的向量可以直接赋值给 direction
131
00:12:40,828 --> 00:12:48,994
最后再来一个练习:再创建一个输入,这次用空格键。然后在 GDScript 里监听按键
132
00:12:48,994 --> 00:12:56,327
当空格键被按下时打印一些内容。额外挑战:确保按一次只打印一次
133
00:12:56,327 --> 00:13:00,860
而不是多次
134
00:13:00,860 --> 00:13:11,260
这个可能又要查文档了。现在暂停视频,看看你能做到哪一步
135
00:13:11,260 --> 00:13:19,060
回到 Godot,进入 Project、Project Settings、Input Map,创建一个新操作
136
00:13:19,060 --> 00:13:27,060
命名为 Confirm。因为后面在标题画面按这个键会跳转到游戏主界面
137
00:13:27,060 --> 00:13:30,393
Confirm 这个名字可能不是最好的,但够用
138
00:13:30,393 --> 00:13:34,426
关键是要给这个操作绑定一个按键
139
00:13:34,426 --> 00:13:38,845
按下空格键,点 OK,现在就有了 Space Physical
140
00:13:38,845 --> 00:13:47,078
足够了。接下来在玩家脚本里调用 Input
141
00:13:47,078 --> 00:13:52,015
用 is action pressed 检测 confirm 按键是否被按下
142
00:13:52,015 --> 00:13:55,248
如果按下了就打印一些内容
143
00:13:55,248 --> 00:14:00,017
你可能觉得这样就够了。但如果现在运行游戏,按一下空格
144
00:14:00,017 --> 00:14:07,483
即使只按了一次,结果却打印了多次
145
00:14:07,483 --> 00:14:14,083
这不行。问题出在哪?is action pressed 会持续检测按键是否处于按住状态
146
00:14:14,083 --> 00:14:20,049
而且是每帧都检测。physics process 每秒运行 60 帧
147
00:14:20,049 --> 00:14:26,415
也就是说这个函数每 60 毫秒就检查一次按键是否被按住
148
00:14:26,415 --> 00:14:31,948
即使只按了 0.1 秒,对 Godot 来说也是很多次输入了
149
00:14:31,948 --> 00:14:39,048
有几种修复方法,最简单的是改用 is action just pressed
150
00:14:39,048 --> 00:14:45,048
这样 Godot 只检测按键是否被按下,不检测是否被按住
151
00:14:45,048 --> 00:14:52,314
现在再运行,按一次空格只输出一次,好多了
152
00:14:52,314 --> 00:14:59,547
好了,现在有了用户输入。但游戏看起来还是不太好
153
00:14:59,547 --> 00:15:04,513
最主要的是所有东西都太小了,只能看到背景的一小部分
154
00:15:04,513 --> 00:15:09,066
这些问题在这一部分都会解决,我们要添加摄像机
155
00:15:09,066 --> 00:15:16,032
这样就能放大画面,让摄像机跟随玩家在场景中移动