一个基础的Sprite左右移动

本节我们实现一个基础的Sprite移动

image.png 我们新建一个场景,设置根节点为Node2D,并从文件系统面板拖入Godot每个项目都自带的Godot图标文件,以生成一个Sprite子节点。

代码

然后我们为Sprite节点,也就是这里自动命名的Icon节点,添加一个脚本。脚本内容如下:

  1. extends Sprite
  2. var speed = 20.0 # 速度 像素/秒
  3. func _process(delta):
  4. # 通过左右按键返回水平方向上的移动方向
  5. # 普通键盘操控模式下,就只能返回1 或者-1,1表示右,而-1表示左。
  6. var dir_x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
  7. position.x += dir_x * speed

代码分析

在第2行中,var speed声明了一个变量,名叫speed,并且它被赋初始值20.0,注意这里我们写了20.0而不是20,是因为GDScript的赋值语句会根据你赋值的形式自动判断和设置变量的类型,比如这里简单的赋值20,变量speed的数据类型就被设置为整型,也就是int类型,而如果你赋值20.0,则speed的数据类型就成为了浮点数,float。数据类型的差异在一般情况下不那么重要,但是在涉及一些运算,以及使用一些函数时,就会出现运算精度或其他类型的错误。
在第7行中,get_action_strength()返回按键的力度,是一个0到1之间的数字,它在游戏手柄中可能会返回0到1之间的数字,但在普通键盘上按键时,只会返回0或1,未按键时返回0,按键时返回1。
另外因为X轴正方向向右,因此为了获得x轴上的正确方向,所以必须是右减左。
在键盘操控模式下,就只能返回1 或者-1,1表示右,而-1表示左。
这种写法比另一种单独判断Input.is_action_pressed()的方式要简化的多。这种写法也是一些初学者教程常教授的一种写法。

一种不太推荐的写法

  1. extends Sprite
  2. var speed = 20.0 # 速度 像素/秒
  3. func _process(delta):
  4. var dir_x = 0
  5. if Input.is_action_pressed("ui_right"):
  6. dir_x = 1
  7. if Input.is_action_pressed("ui_left"):
  8. dir_x = -1
  9. position.x += dir_x * speed

一种不太推荐的写法2

如果引入2D向量Vector2的话,就可以写成:

  1. extends Sprite
  2. var speed = 20.0 # 速度 像素/秒
  3. var dir = Vector2.ZERO # 方向
  4. func _physics_process(delta):
  5. dir = Vector2.ZERO
  6. if Input.is_action_pressed("ui_right"): # 右 - X轴正方向 - 1
  7. dir.x = 1
  8. if Input.is_action_pressed("ui_left"): # 左 - X轴反方向 - -1
  9. dir.x = -1
  10. position.x += dir.x * speed

运行效果

以上的3种写法基本效果都是一样的,就是让Sprite可以通过键盘上的左右方向键进行20像素/秒的移动。基础动画示例.gif