刚刚做完第一个项目,非常简单的一个过马路游戏,这里放一些碎碎念
首先就是说这个gds他的语法跟py一样很简单,反正我看了几次视频就差不多会了

角色移动

先看这段代码

var dict := Vector2(2, 2)
var speed := 200
func _physics_process(_delta: float) -> void:
    dict = Input.get_vector("left", "right", "up", "down")
    velocity = dict * speed
    animation()
    move_and_slide()

这是一段控制玩家运动的代码
前两行首先定义了两个变量,分别是Vector2的dict变量和整数的speed变量
在第四行中,首先需要到项目设置里面添加按键映射,比如"left"等是自定义的名称,以下是官方教程中给出的介绍

通过指定正负 X 和 Y 轴的四个动作来获取输入向量。

这个方法在获取向量输入时很有用,比如从操纵杆、方向盘、箭头或 WASD。向量的长度被限制为 1,并且有一个圆形的死区,这对于使用向量输入进行运动很有用。

默认情况下,死区根据动作死区的平均值自动计算。然而,你可以把死区覆盖为任何你想要的值(在 0 到 1 的范围内)。

说人话就是什么呢,就是必须在Input.get_vector后面括号中按照固定的顺序(左右上下)来处理输入逻辑,这个顺序其实对应的是坐标轴:-X, +X, -Y, +Y
来到第五行,这个velocity是 CharacterBody2D 节点内置的一个属性,通过dict这个向量乘上speed可以控制速度
第六行这个animation就是调用动画的一个函数
第七行的move_and_slide是对刚刚计算出来的内置属性velocity进行移动,这样才能发生位移

全局相关

默认在所有场景创建的变量中都是局域变量,func里的变量只能在函数里面用,场景创建的只能在那个场景用
如果你需要创建全局变量,你可以新建一个Node场景,并定义好变量,如var speed := 10在项目设置的全局选项中将Node场景的场景文件选上,如global.tscn。这样的话,你就可以通过Global.speed来调用这个变量
另外,如果你希望背景音乐不停的话切换场景,则可以用Node节点下添加AudioStreamPlayer2D这类音乐播放子节点来实现不停播放

随机生成

func _on_car_timer_timeout() -> void:
    var car = car_scene.instantiate() as Area2D
    var pos_marker = $CarSpawnPos.get_children().pick_random() as Marker2D
    car.position = pos_marker.position
    $Object.add_child(car)
    car.connect("body_entered", go_to_title)
func change_scene():
    get_tree().change_scene_to_file("res://scenes/title.tscn")
func go_to_title(_body):
    call_deferred("change_scene")

看到这段代码,第一行首先有一个计时器的信号,超时之后会进行以下行为
首先第二行定义了一个变量car,其内容是将car_scene的场景实例化,就是相当于从场景中克隆一份到代码场景,但未加到场景树里
作为一个marker2d类型,第三行定义了一个pos_marker的变量,内容是从CarSpawnPos这个子节点下面获取一个节点的列表,然后使用pick_random选择了一个随机的位置,便于编辑器提示和debug
第四行是设置之前随机抽取的位置作为汽车生成位置来使汽车放置到正确位置
第五行是使汽车在预定的位置直接挂载,使汽车的_ready脚本正常加载
第六行是连接到场景car的一个信号,是body_entered代表当物理位置被物理体2D(PhysicsBody2D)物体碰到时接受信号,然后再调用了一个函数为go_to_title
后面就是对于函数的定义之类的了,在对物理计算的场景切换场景时,需要进行延迟处理,应先从get_tree获取列表树,然后切换到标题页面这段操作封装成change_scene函数,最后使用函数call_deferred可以告诉godot说有空时立即运行后面代码