本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面:
Listening to player input — Godot Engine (stable) documentation in English
监听玩家输入¶
在上一课创建您的第一个脚本的基础上,让我们看看任何游戏的另一个重要特征:将控制权交给玩家。要添加它,我们需要修改我们的sprite_2d.gd
代码。
您有两个主要工具来处理玩家在 Godot 中的输入:
-
内置的输入回调,主要是
_unhandled_input()
. 就像_process()
,它是一个内置的虚函数,每当玩家按下一个键时,Godot 就会调用它。这是您想要用来对并非每一帧都发生的事件做出反应的工具,例如按下Space【空格键】跳跃。要了解有关输入回调的更多信息,请参阅使用 InputEvent。 -
Input【单例singleton】
。单例是一个全局可访问的对象。Godot 提供对多个脚本的访问。这是检查每一帧输入的正确工具。
我们将Input
在这里使用单例,因为我们需要知道玩家是否想要转动或移动每一帧。
对于转动,我们应该使用一个新变量:direction
。在我们的_process()
函数中,用下面的代码替换之前内容【rotation += angular_speed * delta】
var direction = 0
if Input.is_action_pressed("ui_left"):
direction = -1
if Input.is_action_pressed("ui_right"):
direction = 1
rotation += angular_speed * direction * delta
我们的direction
局部变量是一个因数,表示玩家想要转向的方向。值0
表示玩家没有按向左或向右箭头键。值1
表示玩家想要右转,-1
意味着他们想要左转。
为了产生这些值,我们引入了条件判断和使用Input
. 条件以GDScript 中的关键字if
开始,以冒号结束。具体条件是关键字和行尾之间的表达式。
要检查此帧是否按下了某个键,我们调用Input.is_action_pressed()
. 该方法采用表示输入操作的文本字符串,true
如果按下操作则返回,false
否则返回。
我们上面使用的两个动作,“ui_left”和“ui_right”,在每个 Godot 项目中都是预定义的。它们分别在玩家按下键盘上的左右箭头或游戏手柄的方向键上的左右箭头时触发。
注:您可以通过转到“项目”->“项目设置”并单击“输入映射”选项卡来查看和编辑项目中的输入操作。
最后,我们用direction
作为因数来更新节点的 rotation
: rotation += angular_speed * direction * delta
如果您使用此代码运行场景,当您按下 Left和Right时,图标应该会旋转。
按“UP”时移动¶
要仅在按键时移动,我们需要修改计算速度的代码。用下面的代码替换var velocity
开头的行。
var velocity = Vector2.ZERO if Input.is_action_pressed("ui_up"): velocity = Vector2.UP.rotated(rotation) * speed
velocity
我们用值Vector2.ZERO
初始化,这是表示长度为 0 的二维向量Vector
的另一个内置类型常量。
如果玩家按下“ui_up”动作,我们就会更新速度值,使精灵向前移动。
完整脚本¶
这是完整的sprite_2d.gd
文件以供参考。
extends Sprite2D var speed = 400 var angular_speed = PI func _process(delta): var direction = 0 if Input.is_action_pressed("ui_left"): direction = -1 if Input.is_action_pressed("ui_right"): direction = 1 rotation += angular_speed * direction * delta var velocity = Vector2.ZERO if Input.is_action_pressed("ui_up"): velocity = Vector2.UP.rotated(rotation) * speed position += velocity * delta
如果您运行场景,您现在应该可以使用左右箭头键旋转并按 向前移动Up。
总结¶
总之,Godot 中的每个脚本都代表一个类,并扩展了引擎的一个内置类。您的类继承自的节点类型,使您可以访问基类属性,如sprite 示例中rotation
、position
属性。您还继承了许多我们在本示例中没有使用的功能。
在 GDScript 中,放在文件顶部的变量是类的属性,也称为成员变量。除了变量之外,您还可以定义函数,在大多数情况下,函数将是您的类的方法。
Godot 提供了几个你可以定义的虚函数来连接你的类和引擎。其中包括_process()
,每帧对节点应用更改,以及_unhandled_input()
接收来自用户的按键和按钮按下等输入事件。还有很多。
Input
单例允许您在代码中的任何位置对玩家的输入做出反应。特别是,您将在_process()
循环中使用它。
在下一课使用信号中,我们将通过让我们的节点在脚本中触发代码来构建脚本和节点之间的关系。