Godot基础教程02:全都是节点

时间:2024-03-13 16:17:41

在这里先劝退一波人:本教程只会涉及2D内容,不会涉及3D内容

创建节点

接上一章,在左侧的场景面板中,可以看到:
Godot基础教程02:全都是节点
由于本教程只讲2D内容,所以这里我们应该选择2D场景
Godot基础教程02:全都是节点
可以看到,编辑器自动创建了一个名为Node2D的根节点。节点的概念将在稍后详细讲解。先点击面板上方的+按钮,弹出新建Node界面:
Godot基础教程02:全都是节点
我们新建一个Sprite类型的节点,方法可以自选一个:

  • 展开Node2D类型,在里面找到Sprite类型,选中并点击创建
  • 在搜索框中直接输入Sprite,在结果中选中并点击创建
  • 如果最近添加过此类型的节点,在左侧的最近使用中找到,选中并点击创建

节点操作

多新建几个Sprite节点,试试在场景面板中进行拖动操作:

  • 拖动以调整节点的顺序
  • 将一个节点拖放到另一个节点上,使其变成另一个节点的子节点
  • 将子节点拖离,使其成为平级节点

以下是我进行一通无聊操作后的结果:
Godot基础教程02:全都是节点

  • Node2D节点是这个场景的根节点,一个场景有且只有1个根节点
  • SpriteSprite3节点,是根节点的子节点
  • Sprite2Sprite的子节点,Sprite4Sprite3的子节点

选中Sprite节点,在右侧的属性面板中添加一张图片进行显示:
Godot基础教程02:全都是节点
点击Texture属性右侧的小箭头,在弹出的下拉列表中点击加载
Godot基础教程02:全都是节点
选择一张图片后,点击打开
同样的方法为Sprite2Sprite3Sprite4也添加上不同的图片。
在场景中进行操作,可以发现:

  • 拖动或缩放Sprite时,Sprite2会跟着移动或缩放
  • 拖动或缩放Sprite3时,Sprite4会跟着移动或缩放
  • 操作Sprite2Sprite4时,它们的父节点不会受到影响

节点的特性

根据上面的试验,我们已经知道:

父节点移动、缩放、旋转等,都会影响到子节点,而子节点移动、缩放、旋转则不会影响父节点。
当这些节点在场景中重叠时,处于下方的节点会盖住处于上方的节点

节点理论上可以有无限层,比如这样:
Godot基础教程02:全都是节点
在这种情况下,Sprite的操作会影响到Sprite2Sprite3Sprite4
假设所有Sprite都没有缩放过,而Sprite4加载进来的图片宽度是100px,这时开始进行缩放操作:

  1. 先把Sprite缩放到130%
  2. 再把Sprite2缩放到80%
  3. 再把Sprite3缩放到150%

那么现在Sprite4的宽度是多少呢?答案是:

100px × 130% × 80% × 150% = 156px

这样做有什么意义呢?我们举个例子:玩家都会拿着一把武器,我们就可以把武器当作玩家的子节点。这样当玩家进行移动时,武器会跟着玩家同时移动,就省去了我们既要控制玩家,又要控制武器的麻烦。
实际上玩家身上的挂件很多,如果你经常玩游戏的话,可以发现能列举出很多挂件,比如:

  • 玩家头顶的名称
  • 装备或武器
  • 某些游戏会有法宝在玩家身周盘旋
  • 玩家身上的buff效果
  • 氪金后身上闪闪发光的特效
  • ……

当然,虽然节点用起来很方便,但节点并不是层级越多越好,会影响效率。

相对坐标

场景中有一个原点,它的坐标是(0, 0)点,向右方是x轴,向下方是y轴:
Godot基础教程02:全都是节点
一横一竖的黄色线条表示坐标轴,蓝色方框表示游戏展示的区域。
Sprite拖放到场景中间,选中Sprite2,在右侧的属性面板中,展开Transform,可以看到里面的坐标:
Godot基础教程02:全都是节点
xy坐标都修改为0,可以看到,Sprite2并没有移动到游戏场景的原点,而是移动到了Sprite的中心。
这是因为这里的坐标是相对于它的父节点的坐标,当坐标为(0, 0)时,与它的父节点重合。

因为场景中的根节点是Node2D,根节点的坐标、缩放、旋转发生变化时,场景中所有的节点都会受到影响。