看视频做的笔记 2
视频地址:【已完结】Godot4零基础入门游戏开发制作教程_哔哩哔哩_bilibili
1 RigidBody2D 使用 body_entered 和 body_exited 信号,要启用 Contact Monitor 属性
修改 Max Contacts Reported 使其大于 0,比如 10。
2 button
继承关系:
Node
└─ CanvasItem
└─ Control
└─ TextureRect
└─ TextureButton
└─ Button
Node
:是 Godot 中所有场景中对象的基类。CanvasItem
:是所有在 2D 画布上绘制的对象的基类。Control
:是继承自CanvasItem
的基类,表示用户界面上的可视控件。TextureRect
:是继承自Control
的类,用于显示纹理的 UI 控件。TextureButton
:是继承自TextureRect
的类,用于创建带有纹理的按钮控件。Button
:是继承自TextureButton
的类,表示一个可交互的按钮控件。
3 CalvasItem节点
Object
|
Node
|
CanvasItem
|
Control
|
Node2D
①CanvasItem 概括
CanvasItem 节点继承自 Node,可以用这个节点进行 2D 图画的绘制,它有 Node2D 和 Control 两个子类。Node2D 用于制作 2D 游戏对象,Control 用于制作游戏界面。
②CanvasItem 功能
▪ CanvasItem 节点提供了众多用于绘制图像的函数。
▪ 提供了部分与图像渲染相关的属性
▪ 允许使用者为此类节点(子节点)添加 shader
③初学者要掌握的部分
▪ visible 属性
修改位置:
代码修改:
self.visible = false
也可使用函数 hide() 和 show()
hide() #等同于 visible设置为false
show() #等同于 visible设置为true
▪ Modulate 属性
modulate
属性通常用于对颜色进行调节或调整。
如果有子节点,也会一起改变。修改selfModulate则不会影响子节点。
▪ 渲染顺序与 Order 属性
渲染顺序: 默认下,从根节点向下顺序渲染,包括子节点
Z Index数值 越大位置越靠前,越不会被其他遮挡。父节点的该值变化也会改变子节点的(如果Z as Relative是启用状态,例如 B是A的子节点,A的Z Index 为20 ,B的Z Index为3,Z as Relative是启用状态,则b的实际的Z Index 是A的20加上自身的3)。但如果Z as Relative 不是勾选状态,那么子节点的Z Index值是绝对的,不从父节点的Z Index的基础上计算。
Y Sort Enable属性:有更高Y值得节点会制在其他节点得上方
如:
设置上图中Node2D节点得Y Sort Enable 启用
则,子节点得两个节点,谁得y更大,谁就绘制在上面。
4 Node2D节点
①Node2D 节点概括
Node2D 节点继承自 CanvasItem,它拥有非常丰富的子类,这些子类涉及到了 2D 游戏的 图像显示、物理模拟、寻路系统、2D 音效、2D 灯光等多个领域的内容。
②Node2D 功能以及作用
▪ 提供了 2D 相关的位置 / 旋转 / 缩放 / 倾斜等属性。
▪ 提供 2D 矩阵属性,可以通过修改矩阵实现一些高级的画面操作。
▪ 内置了部分函数,可以用于修改上述属性。
③初学者要掌握的功能
▪ 了解 Node2D 以及 CanvasItem 类节点的传递性
传递性:
例如:
这样得AB节点,点击A节点并移动A节点,B节点也会一起移动
但如果修改A得直接子节点不是B,则选择A移动,B不会跟随。
▪ 了解 Node2D 的位置 / 旋转 / 缩放 / 倾斜等属性
5 Sprite2D 节点
Object
|
Node
|
CanvasItem
|
Node2D
|
Sprite (2D精灵节点)
①节点描述
显示图片的节点
②节点功能
▪ 显示图片纹理。
纹理Texture,可选多种,一般图片对应的是CompressedTexture2D
此外,常用的还有 AtlasTexture 类型(裁剪类型),可以对图片做裁剪。
NoiseTexture2D 可以生成一些噪声图片。
代码实现:
self.texture = load("res://aa.png")
▪ 提供了可以对纹理进行位置偏移、翻转等操作的属性。
偏移是针对显示图像的。
Flip H 是水平翻转,Flip V 是上下翻转
③初学者掌握功能
▪ 学会如何使用编辑器 / 代码为该节点添加图片纹理。
▪ 了解部分简单属性。
6 AnimatedSprite2D 节点
①节点描述
通过切换图像,显示不同图片的形式来显示游戏动画的节点
②节点功能
▪ 具有播放动画与停止动画的方法。
▪ 具有动画播放相关的部分属性,修改这些属性可以影响到动画播放的细节。
③初学者掌握功能
▪ 了解播放与停止动画的方法和常用的属性
▪ 学会如何使用编辑器设置动
操作:
新建一个 AnimatedSprite2D 节点,然后新建
在窗口中,新建一个动画,可以修改帧率,图片资源可以直接选择或者选择大图分割,分割中的选图,可以按住鼠标左键快速拖动选择。
动画播放: play函数
动画停止:stop函数
func _ready():
play("idle")
#stop()
类似sprite2D,可以设置镜像翻转:
水平和垂直(动画也会跟着变)
代码设置:
#设置水平翻转
$AnimatedSprite2D.flip_h = true
7 Body2D 类节点与 Area2D 节点
从上到下分别是: 静态体,角色体,刚体
①节点描述
在游戏世界中,视觉与触觉,即渲染与物理两个要素是两个互相独立的部分。 Sprite2D可以提供视觉上的游戏对象,却无法在游戏中产生“触觉”即物理意义上的对象。想要让游戏世界中出现可以感知的,且占据一定空间体积的物理对象我们就要借助其他 节点,Body 类节点主要就是用于制作游戏世界中的物理对象。而 Area 节点除了可以用于检测感觉这些物理对象以外,还可以对一个区域内的物理属性、音轨等内容造成影响。
上述二者均继承自 CollisionObject2D 节点,CollisionObject2D 节点是 2D 世界中物理 对象的基类(父类),它可以容纳任意数量的 2D 碰撞形状,这些 2D 形状用于定义 Body 代 表的实体形状和 Area 节点所规定的范围。
②节点功能
Body2D 类:
• StaticBody2D:用于制作相对静态物理对象,一般来说静止的墙壁或者是移动方式较为固定的平台均可使用此对象制作。
• RigidBody2D:拥有质量、重力缩放、受力情况等多种物理属性,可以用于制作不受代码控制而能够自由移动物理对象。
• CharacterBody2D:内置了许多与移动相关或位置相关的函数,用于制作受代 码控制的物理对象。
Area2D 节点:
Area2D:可以检测并获取他区域内的 Body2D 和 Area2D 节点,可以为区域内施加 额外的物理属性,或修改区域内的音轨情况。
1staticBody2D
可以新建物理材质,保存(一种资源),设置: 摩擦,粗糙,弹性
添加子节点 CollisionShape2D 来添加形状(其他两种body2D也需要加形状)
body2D都继承自 CollisionObject2D
CollisionObject2D 的属性
Layer 设置所在的物理层
Mask 遮罩 决定于那个物理层的物体碰撞
所在层的值表示是二进制数值(应该是方便判断,从0值开始)
代码设置:
self.collision_layer = 0
CharacterBody2D 默认的代码 可以实现左右移动和跳跃的操作 (空格跳跃)
extends CharacterBody2D
const SPEED = 300.0
const JUMP_VELOCITY = -400.0
# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
func _physics_process(delta):
# Add the gravity.
if not is_on_floor():
velocity.y += gravity * delta
# Handle jump.
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = JUMP_VELOCITY
# Get the input direction and handle the movement/deceleration.
# As good practice, you should replace UI actions with custom gameplay actions.
var direction = Input.get_axis("ui_left", "ui_right")
if direction:
velocity.x = direction * SPEED
else:
velocity.x = move_toward(velocity.x, 0, SPEED)
move_and_slide() #根绝上面设置好的velocity移动物体
Area2D
可以检测到区域相交
Array[Area2D] get_overlapping_areas() const
返回相交的 Area2D 的列表。重叠区域的 CollisionObject2D.collision_layer 必须是这个区域 CollisionObject2D.collision_mask 的一部分,这样才能被检测到。
bool has_overlapping_bodies() const
如果与其他 PhysicsBody2D 或 TileMap 相交,则返回 true,否则返回 false。重叠物体的 CollisionObject2D.collision_layer 必须是该区域 CollisionObject2D.collision_mask 的一部分,才能被检测到。
出于性能原因(所有碰撞都是一起处理的),重叠物体的列表只会在每次物理迭代时发生一次更改,不会在对象移动后立即更改。请考虑使用信号。
8 RayCast2D 与 ShapeCast2D
一、RayCast2D(射线投射检测)与 ShapeCast2D(形状投射检测)节点
①节点功能 RayCast2D 与 ShapeCast2D 节点可以检测获取 2D 世界内的 Body2D 与 Area2D 节 点。这两个节点都拥有一个靶坐标,RayCast2D 会从节点坐标出发,创建一条到靶坐标的 射线,检测这条射线上距离节点坐标最近的 Body 或 Area。ShapeCast 则会向靶坐标处创 建若干连续的 Shape 以检测距离节点坐标最近的 Body 或 Area。
类似Area2D 。也有判断相交的的函数
RayCast2D中:
Object get_collider() const
返回射线相交的第一个对象,如果没有对象与射线相交,则返回 null(即 is_colliding() 返回 false)。
ShapeCast2D中:
Object get_collider(index: int) const
返回 index 处多次碰撞之一的碰撞 Object,如果没有对象与形状相交(即 is_colliding() 返回 false),则返回 null。
另:关于碰撞信息的更新
ShapeCast2D中:
void force_shapecast_update()
立即更新形状的碰撞信息,不等待下一次的 _physics_process 调用。例如,请在形状或其父级更改状态后使用该方法。
RayCast2D中:
void force_raycast_update()
立即更新射线的碰撞信息,不等待下一次的 _physics_process 调用。例如,请在射线或其父级更改状态后使用该方法。
关于这个更新功能,看图:
②初学者需要掌握的功能
▪ 认识 RayCast2D 和 ShapeCast2D 的常用属性
▪ 区分这两个节点和 Area2D 节点的区
9 TileMap节点
①节点描述
进行 2D 贴图平铺的节点,多用于制作游戏的地图。
②节点功能
节点本身:
• 开发者可手动使用此节点内 tileset 对象所提供的图块进行地图的绘制工作。
• 开发者可手动设置绘制图块的图层分布。
• 开发者可使用代码获取、分析、设置节点绘制出的图像情况。
tileset:
• 设置图片中图块的划分方式,创建或删除图片中的图块。
• 为图块创建物理碰撞相关的形状、layer、以及 mask 属性。
• 为图块创建游戏导航功能所需的相关功能。
• 为图块创建自定义数据
• 可以将多个图块整合,设置为 Pattern 或地形(Terrain)图块。
• 可以将场景设置为“图块”。
③初学者需要掌握的功能
• 掌握最基本的图片的划分和创建图块的方式。
• 掌握为图块创建物理碰撞形状的方式。
• 掌握 Pattern 和场景图块的设置方式。
• 大致了解 Terrain 地形图块的设置流程即可
对TileSet 进行新建和保存(一种资源)
可以改变图块的形状
tileset中创建图集
TileMap选取图块绘制
添加物理对象
对单个图块添加物理形状
图案 选择把绘制的图案复制到这里,可以直接使用
添加场景块
选择多个图块,对某一属性做批量设置
地形设置:
首先,先添加一个地形
其次
选择刚添加的地形(上图),然后 添加子地形(下图)
选择子图块,然后点击对应地形的图块,然后添加掩码
类似这样子选好以后(上图)(怎么选掩码,需要后面绘制出来的,个人认为选择是作为生成的地形的模板,所以不要选则不是该地形的模板,如果掩码块里包含了别的地形,看情况选择)
然后,可以在地图上绘制了,用方块和线条 可以生成一片
比如上面这样,这个效果就是放过来调整前面地形选择图块掩码时候的参考。
创建layer(就是ps中的图层):
然后tilemap里面,可以选择绘制在哪个图层上
图块的操作:
对某一图块右键,可以删除或者新建(上图)
创建的备选图块(上图)
可以对她单独操作,不会影响到基础图块
也可以对某一透明区创建图块,点击右键
10 Control 节点
①节点描述
Control 节点继承自 CanvasItem,拥有 CanvasItem 节点所具有的所有特征,与 Node2D 节点存在许多相同类似的属性。Control 是所有界面类节点的父节点,Control 拥有非常繁多的属性、方法以及信号,这些内容都深刻影响着 Control 子类节点的工作。此外 Control 节点还定义了一套比坐标系更加复杂的布局系统,这套布局系统可以使得节点树中 父 Control 类型的节点更加便利的管控子 Control 节点的位置、大小等显示相关的属性。
②节点功能
▪ 提供了一套专属于界面类节点的布局方案,以及配套这套方案的属性与函数。
▪ 提供了特殊的输入处理函数_gui_input 和一些关于输入处理的函数。Control 类节点 的特有输入处理较为特殊,与渲染顺序、图层、可见性、聚焦等属性高度相关。
▪ 提供了界面类节点实现拖拽功能的虚函数。
▪ 提供了与语言翻译转换(本地化)、快捷切换界面节点等功能相关的属性与函数。
▪ 提供了 Theme(主题)属性和修改此属性的一系列函数,可以在其中规定各种 Control 类节点的显示效果等参数。节点树中的子 Control 节点默认继承父 Control 节 点的主题属性。
▪ 提供了移动鼠标的函数。
▪ 提供了设置自动提示文本的属性。
③初学者需要掌握的功能
▪ 了解锚点和锚偏移的基本概念,掌握 Control 类节点布局属性的使用。
▪ 掌握_gui_input 的使用,以及 Control 类节点处理特殊输入时与渲染顺序、可见性、 图层、聚焦等属性的关系
控件(以 TextureRect为例)的Layout Mode:
1 Anchor Points指的是下图中的四个绿点,是当前节点相对于父节点范围大小的参考值。其中的Left和Right参考的是父节点在x方向上的范围大小,Top和Bottom参考的是父节点在Y方向上的范围大小。都设置成最大值1后,所围成的举行矩形大小,就和父节点的大小一样
2 Anchor offset 锚偏移
在锚点基础上,对节点的范围进行修改。可以起到实质性的扩大或缩小作用
3 决定节点水平垂直的延申方向,比如水平改成Left
然后改变大小变大,就会向左变大
Anchor Preset除了设置 自定义以外 还有其他各种:
界面上类似
另外
layout Mode属性:布局模式
锚点(Anchors)比Position模式功能更强大
Control里面,还有个
需要与container连用
关于输入处理函数_gui_input
对鼠标事件的处理模式
截断,传递和忽略(对button,传递(pass)不能用)
很多control类型的节点,只有成为焦距对象时,才能接受鼠标事件。Focus可以设置上下左右邻居。
函数 grab_focus() 指定鼠标聚焦,推荐使用Callable的方式调用,例如一个button的脚本中:
func _ready():
var s = Callable(self,"grab_focus")
s.call_deferred() #延迟呼叫在空闲时间处理。
11 Container 节点
①节点描述
Container 节点是 Control 类节点的一个重要子类,当新的 Control 类节点加入成为 Container 节点的子节点时,Container 类节点会发出 pre_sort_children 信号,之后, Container 节点会根据代码设置的布局方式,排布子 Control 节点。
②节点功能
▪ 通过代码以自定义的布局方式,排布子 Control 节点。
▪ 以现有节点所规定的布局方式,排布子 Control 节点。
③初学者需要掌握的知识
▪ 认识并学会简单使用常见 Container 节点即可。
▪ 了解如何使用 pre_sort_children 以自定义布局方式。
设置布局的间隔
给container添加一个button
button的属性中:
stretch ratio可以决定占比大小
各种container,有些类似Qt的layout
手动添加控件到contain 函数 add_child()
比如,按下按钮后添加一个新的按钮
func _on_button_pressed():
var button = Button.new()
button.size = Vector2(64,64)
$Container.add_child(button)
信号pre_sort_children,每当有新的控件加入container,container就会发出这个信号
func _on_container_pre_sort_children():
var count = 1;
for i in $Container.get_children():
if i is Control:
count += 1
$Container.fit_child_in_rect(i,Rect2(Vector2(64,64)*count,Vector2(70,70)))
效果:
12 常用Control控件
textureButton
设置点击的区域:texture_click_mask
比如,圆形区域:
func _ready():
var bit_map = BitMap.new()
var img = Image.new()
img.load("res://pic/圆.png")
bit_map.create_from_image_alpha(img)
texture_click_mask = bit_map
LabelSettings 可以自定义字体显示
TextureProcessBar 进度条
VedioStreamPlayer 视频播放
CodeEdit 脚本编辑器
ColorRect 显示颜色矩形的节点
等
13 补充 3种节点 Timer 、AnimationPlayer、CanvasLayer
•Timer:
计时器节点,可用于完成游戏中的计时功能。如技能 cd、关卡通关计时等。
可以使用await
extends Node
func _ready():
# 启动异步操作
async_func()
# 定义一个异步函数
func async_func() -> String:
var timer = get_tree().create_timer(5.0)
# 等待SceneTreeTimer对象的timeout信号
await timer.timeout
print("666")
return "Operation completed."
也可用于等待信号
func awaitConfirmation():
# 等待按钮被按下
await $Button.pressed
• AnimationPlayer:
动画播放器节点,更加高级的动画节点。可以在时间轴上设置属性的改变过程,以及在某个 时间点设置函数的调用。
使用,例如
新建动画
添加轨道
添加关键帧 关键帧也可以在时间轴上拖动
点击时间帧还可以修改
设置时间轴长度(s)
• CanvasLayer:
图层节点,可以在游戏世界中创建真正意义上不同的图层。
对于 CanvasItem 类节点而言,高图层的对象在绘制时注定覆盖低图层的对象,因此高图层的 Control 类节点如 mouse_filter 属性为 stop,则可以阻断传往低图层 Control 节点的输入事件。
对于 Camera2D 节点而言,Camera2D 节点仅能影响到自己所在图层上的显示区域的位 置,而无法影响到其他图层的显示区域的位置
对于最后一点 camera2D的
camera2D跟踪的低图层的sprite
CanvasLayer下是高图层(1层),下面的sprite的贴图是一个圆球
运行效果: