godot2D笔记

相关视频链接:YouTube(生肉),bilibili(熟肉)

https://www.bilibili.com/video/BV17Z421J7uF/?spm_id_from=333.999.0.0&vd_source=e25b71d6c243cef702fd4b55b7792d99

该文章只记录关键信息,具体操作请看视频
我用的版本:4.3

godot介绍

godot是一款开源免费的游戏制作引擎

godot的脚本语言:GD Script

最开始需要的游戏素材:立绘,模型,纹理,音效等

最开始的操作

1,创建文件夹

通用文件夹翻译:

assets:资产。包括但不限于:
fonts:字体
music:音乐
sounds:音效

scripts:代码
scenes:游戏场景

2,导入素材

拖动文件即可

3,节点

节点是一个术语,godot中的任何东西都是由节点(Nodes)组成的
不同类型的节点有不同的功能和效果
我们将很多节点进行扩展和连接组合达到不同的效果

4,场景

场景让我们把一些节点捆绑在一起,并允许被多次重复使用
把一个场景放入另一个场景称为嵌套

角色1.0

2D角色身体:ChaaracterBody2D
需要立绘,2D碰撞形状,2D相机等节点,还需要添加代码

立绘:Sprite

2D动画立绘:AnimatedSprite2D
需要添加动画帧。若为像素风请在
“项目(Project)” > “项目设置(Project Settings)” >“渲染(Rendering)” > “纹理(Textures)”
中将"默认纹理过滤器(Default Texture Filter)" 改为 “Nearest”

2D碰撞形状:CollisionShape2D
碰撞箱应比立绘略小

2D相机:Camera2D
在Zoom中改变大小

2D静态物体:StaticBody2D
需要2D碰撞形状

2D碰撞形状:CollisionShape2D

环境搭建1.0

瓷砖地图(已废弃):TileMap
目前被瓷砖地图层(TileMapLayer)所代替
在Print界面绘制物理碰撞

平台:有的会动,有的不会动

可动画化2D物体:AnimatableBody2D
既拥有动画,还能与其他物体发生碰撞
需要立绘。
单向碰撞:One Way collision

动画:AnimationPlayer

可拾取物

2D区域:Area2D
不会与其他物体碰撞的节点
需要(2D动画)立绘,2D碰撞体积(有碰撞体积≠会发生碰撞)

信号
信号允许我们根据游戏内的特定事件来触发不同的代码

死亡1.0

相机限制
在相机节点的 Limit 一栏中,设置相机的上下左右限制

区域检测
使用Area2D实现对玩家是否进入某区域进行检测
要将遮罩(Mask)调成和待检测物体一样的数值

世界边界碰撞形状:New WorldBoundaryShape2D
该形状沿着它的水平线无限延伸

计时器
设置好时间和触发次数后将该变量拖入Script文件中以创建变量

环境搭建2.0

使用节点对你的节点进行分类可以使节点树更加美观和直观易懂

加入游戏背景
(原视频方法已过时,需要建两个场景)

敌人

使用Node2D节点即可,再加上AnimatedSprite2d节点以添加动画
加上区域检测可检测待测物体是否与敌人相撞

射线投射:RayCast2D
发射不可见的光束来探测碰撞

移动
_process()函数中,每一帧都会运行一次代码
补充:_ready()函数在游戏开始时运行一次
position.x/y/z 该物体的位置
delta 衡量上一帧到这一帧的时间差
.is_colliding()是否碰撞函数
.flip_h立绘是否翻转函数

示例

extend Node2D

const SPEED = 60	#创建常量

var direction = 1	#创建变量

@onready var ray_cast_right = $RayCastRight
@onready var ray_cast_left = $RayCastLeft
@onready var animated_sprite = $AnimatedSprite2D
#这三行在拖动节点后自动创建变量,创建了变量

func _process(delta):	#自动创建的代码
	if ray_cast_right.is_colliding():
		direction = -1
		animated_sprite.flip_h = true	#检测右方是否撞墙并改变相关参数
	if ray_cast_left.is_colliding():
		direction = 1
		animated_sprite.flip_h = false	#检测左方是否撞墙并改变相关参数

	position.x += direction * SPEED * delta

死亡2.0

死亡慢放:改变游戏时间尺度

Engine.time_scale = 0.5		#游戏将以0.5倍速时间进行(记得之后调回去)

无碰撞掉落:无视地面做到死亡自然掉落

body.get_node("CollosionShape2D").queue_free()		#移除该节点

角色2.0

SPEED :玩家移动速度
JUMP_VELOCITY :玩家跳跃速度
gravity :引力

_physics_process()函数:
运行在一个固定帧率上(默认60)
用于确保物理引擎正确地模拟游戏内的物理运动

绑定按键
在 “项目(Project)” > " 项目设置(ProjectSetting)" > “输入键位(Input Map)” 中创建新键位名称并绑定按键
同一个键位可以绑多个按键

文字和计分系统

标签:Lable
用于打印文本

计分系统示例(具体代码因人而异)

extend Node

var score = 0

@onready var score_label = %ScoreLabel

func add_point():
	score += 1
	score_label.text = "You collected " + str(score) + " coins."

音乐和音效

音频流播放器:AudioStreamPlayer2D

导出