Godot学习中的问题及思考、学习笔记

【持续更新中】
1、 GDScript这个词的GD 就是Godot里面的G和D,笑死。
func 动态 官方文档说是像Python,我目前没有学习了解过Python,我看它的用法, 像是lua语言中的,能传递不同类型的东西(应该是元组吧,lua我只是简单看了一下), 没有C#,c++那么看重数据类型。

( 引用_摘抄自GodotEngine中文官方文档

因为 GDScript 用缩进来做代码块的结构化,所以它看上去像 Python,不过实际上这两者的原理截然不同。GDScript 是从 Squirrel、Lua、Python 等诸多语言中得到的灵感。

备注

我们为什么不直接使用 Python 或者 Lua?

很多年前,Godot 使用过 Python,后来也用过 Lua。这两个语言的集成花费了大量精力,并且还存在局限性。例如,在 Python 中做多线程支持是非常大的挑战。

开发专属语言不会花费更多的时间,我们还能针对游戏开发者的需求去量体裁衣。我们现在在做性能优化工作,以及用第三方语言难以实现的特性。

)

关于func函数的我的一个疑问,没有像C#,C++的 花括号形式,怎么确定这个函数包含了哪几个语句,命令、哪里是结束?

GDScript介绍—— Godot Engine 4.2 简体中文文档

GDScript 是一门面向对象的指令式编程语言,专为 Godot 构建。是游戏开发者为游戏开发者制作的,目的是节省编写游戏代码的时间。

它的特性包括:

简单的语法,让文件更短。

极快的编译和加载速度。

紧密的编辑器集成,包括节点、信号、所附加场景更多信息的代码补全。

内置向量和变换类型,让海量线性代数计算更高效,游戏必备。

支持多线程,与静态类型的语言一样高效。

没有垃圾回收,因为最终会影响游戏的开发。引擎会默认进行引用计数,在大多数情况下为你管理内存,但你也可以在需要时自行控制内存。

缓类型。变量默认是动态类型,但你也可以使用类型提示来做强类型检查。

 

 

因为 GDScript 用缩进来做代码块的结构化,所以它看上去像 Python,不过实际上这两者的原理截然不同。

GDScript 是从 Squirrel、Lua、Python 等诸多语言中得到的灵感。


继承:
extends BaseClass



也有两种长得像字面量,但实际上不是字面量的量:

示例

$NodePath
get_node("NodePath") 的简写

%UniqueNode
get_node("%UniqueNode") 的简写



void _process(delta: float) virtual

在主循环的处理步骤中被调用。处理发生在每一帧,并且尽可能快,所以从上一帧开始的 delta 时间不是恒定的。delta 的单位是秒。

只有在启用处理的情况下才会被调用,如果这个方法被重写,会自动进行处理,可以用 set_process() 来切换。

对应于 Object._notification() 中的 NOTIFICATION_PROCESS 通知。

注意:这个方法只有在节点存在于场景树中时才会被调用(也就是说,如果它不是“孤儿”)。



● void _ready() virtual

当该节点“就绪”时被调用。子节点的 _ready() 回调会首先被触发,而父节点会在之后收到就绪通知。

对应于 Object._notification() 中的 NOTIFICATION_READY 通知。也请参阅变量的 onready 关键字。

通常用于初始化。对于更早的初始化,可以使用 Object._init()。也请参阅 _enter_tree()。

注意:_ready() 对于每个节点只会调用一次。在从场景树中删除一个节点并再次添加后,_ready 将不会被第二次调用。这可以通过请求再次调用 request_ready() 来绕过,它可以在再次添加节点之前的任何地方调用。

(就像Unity里面的start函数)

 

bool move_and_slide ( )

 

根据 velocity 移动该物体。该物体如果与其他物体发生碰撞,则会沿着对方滑动(默认只在地板上滑动),不会立即停止移动。

如果对方是 CharacterBody2D 或 RigidBody2D,还会受到对方运动的影响。可以用于制作移动、旋转的平台,也可用于推动其他节点。

 

发生滑动碰撞时会改变 velocity。要获取最后一次碰撞,请调用 get_last_slide_collision,要获取碰撞的更多信息,请使用 get_slide_collision。

该物体接触到移动平台时,平台的速度会自动加入到该物体的运动中。平台运动所造成的碰撞始终为所有滑动碰撞中的第一个。

通用行为和可用属性会根据 motion_mode 发生改变。

如果该物体发生了碰撞,则返回 true,否则返回 false。

 


#velocity   (沿某一方向的)速度;高速;快速;
Vector2 velocity = Vector2(0, 0)

void set_velocity ( Vector2 value )

Vector2 get_velocity ( )

当前速度向量,单位为像素每秒,调用 move_and_slide 期间会进行使用并修改。

 

 

【新手向教程】GDScript从入门到基础_2020年贴吧讨论_
这个文档写的挺好玩的,但是是2020年的 可以参考着看。

可视化得看到这个相机的界限

摄像机:落地时移动镜头-Godot3-2D教程 作者:唯一 来源:知乎



【花10分钟开发平台跳跃游戏【Godot教程】】


【设置屏幕大小】
项目设置 ->显示-> 窗口-> 模式
模式有 2d、viewPort、 disabled

disabled 禁用的
2d
viewPort 表现上来说 角色边缘效果较差,按照设定好的大小渲染,然后把渲染好的图片 拉伸到窗口的范围

Aspect 比例 默认是ignore 忽略长宽比 expand 保持长宽比,但是会把多余的部分显示出来。
Keep 会把多余的部分用黑边来遮住。



Godot会把左右两侧的颜色点混合。

Filter 过滤的



**做视差**

【如何实现视差背景滚动【Godot教程】】

视差造成的现象:移动相机,近处的物体,在相机中的显示出来的移动距离较大, 远处的物体在相机中显示移动的位置较小。

ParallaxBackground 用于创建视差滚动背景的节点。
ParallaxBackground _Godot中文文档 跳转链接

抽象的管理节点,感知场景中camera的移动,


ParallaxLayer 使用 ParallaxBackground 的视差滚动层。

摄像机的移动 是按照摄像机的原点和坐标系原点的距离 来计算的。

x=相机中心到原点的偏移量,把这个x给到其他三个ParallaxLayer。


Canvas Layers(画布层)_Godot 游戏引擎 v3.3 中文文档

CanvasItem
继承: Node < Object



extends Area2D

func _on_Coin_body_entered(body):
$AudioStreamPlayer.play(0)

等待声音的播放之后,再执行释放操作

yield($AudioStreamPlayer,"finished")  
#释放队列  
queue_free()



创建一个Lable的方法。 Node2D(Node) > Control >Lable

for i in 3 print(i)

match语句

match语句 _Godot中文文档

给熟悉 switch 语句的人提供的速成课程¶
将 switch 替换为 match。

1、删除 case。
2、删除 break。
3、将 default 替换为单个下划线。

通配符模式

这个模式匹配所有内容. 它被写成一个下划线.

它可以与其他语言的 switch 语句中的 default 等效:

match x:
1:
print("It's one!")
2:
print("It's one times two!")
_:
print("It's not 1 or 2. I don't care to be honest.")

绑定模式

绑定模式引入一个新的变量,与通配符模式类似匹配所有通配内容,并为该通配值提供一个名称,在数组和字典模式中特别有用:

var x=0
match x:
	1:
		print("It's one!")
        # 加了continue 会继续判断x是否等于2   但是这是3.x 版本中的, continue 在 match 语句中起着特殊作用,而在4.0版本中则移除了这一特殊作用。
        continue
	2:
		print("It's one times two!")
	var new_var:
		print("It's not 1 or 2, it's ", new_var)




物理介绍

物理介绍——Godot Engine 4.2 简体中文文档


  • Godot的四种碰撞对象类型
  • 每个碰撞对象的工作原理
  • 何时以及为何选择这种类型而不是另一种类型

Area2D
Area2D 节点提供 检测 和 影响 . 它们可以检测物体何时重叠, 并在物体进入或离开时发出信号.
Area2D 也可用于覆盖物理属性, 例如一定区域内的重力或阻尼.

StaticBody2D
静态主体是物理引擎不移动的主体. 它参与碰撞检测, 但不会响应碰撞而移动.
它们通常用于属于环境的对象或不需要任何动态行为的对象.

碰撞层与遮罩

碰撞层与遮罩——Godot Engine 4.2 简体中文文档

collision_layer
表示该对象位于哪些层。默认情况下,所有实体都在图层 1 上。

collision_mask
表示该对象会对哪些层上的实体进行扫描。如果对象不在任何遮罩层中,则该实体将其忽略。默认情况下,所有实体都会扫描图层 1。

游戏中有四种节点类型:墙(Wall)、玩家(Player)、敌人(Enemy)、金币(Coin)。
玩家和敌人都应该与墙碰撞。

玩家节点应该检测与敌人和硬币的碰撞,
敌人和硬币应该互相忽略。

首先将 1 至 4 层分别命名为“walls”(墙)“player”(玩家)“enemies”(敌人)“coins”(金币)并使用“Layer”属性将每个节点类型放在其各自的层中。然后通过选择它应该与之互动的层来设置每个节点的“Mash”属性。例如,玩家的设置将看起来像这样:

CollisionObject2D

继承: Node2D < CanvasItem < Node < Object
派生:Area2D, PhysicsBody2D

2D 物理对象的抽象基类。

描述

2D 物理对象的抽象基类。CollisionObject2D 能够容纳任意数量的 Shape2D 用作碰撞形状。每个形状必须分配给一个形状所有者。形状所有者不是节点,也不会出现在编辑器中,但可以通过代码使用 shape_owner_* 方法访问。

注意:仅支持相同画布中不同对象的碰撞(Viewport 画布或 CanvasLayer)。不同画布中的对象之间的碰撞行为是未定义的。

Hitbox攻击判定框
Hurtbox 受创判定框

● void emit_signal(signal: String, ...) vararg

发射给定的信号 signal。这个信号必须存在,所以它应该是这个类或其父类中的一个内置信号,或者是一个用户定义的信号。这个方法支持可变数量的参数,所以参数是以逗号分隔的列表形式传递。例子:

emit_signal("hit", weapon_type, damage)
emit_signal("game_over")

Player的hitbox 设置成Layer勾选EnemyHurtbox
它的 Hurtbox(受击) 设置成EnemyHurtbox

【如何让玩家掉进坑里【Godot教程】】 哔哩哔哩_作者:timothyqiu

screen 屏幕
viewport视口



Godot里面的onready var background=$DayBackground,这里的onready是什么意思?


在Godot引擎中,onready 是一个关键字,用于在脚本加载时, 确保某个变量或节点在场景树中正确初始化之后再进行访问。
它通常用于确保在 _ready 函数执行之前,相关的节点或资源已经准备好使用。

onready var background = $DayBackground

这样做的好处是避免了在 _ready 函数中手动检查节点是否为 null 的步骤,因为 onready 会确保在 _ready 执行前,相应的节点已经被正确初始化。

示例中的 $DayBackground 可能是一个场景中的节点引用,通过 onready var background = $DayBackground,您可以在 _ready 函数中直接使用 background 变量,而无需在每次使用之前检查是否为 null。



monitoring
n.
监视,[自]监控;检验,检查

v.
监视,[通信][军]监听,监督(monitor 的 ing 形式)


monitorable
adj.
可监控(或监听)的;可检测的


screen 屏幕
viewport视口

如果是左右分屏的游戏, 那么就是1个屏幕,两个视口。

Godot里面会先screen_entered() 后viewport_entered



[Godot] [转载] onready 关键字

var my_label

func _ready():
    my_label = get_node("MyLabel")

这可能会有些麻烦,尤其是当节点和外部引用堆积时。为此,GDScript 具有关键字 onready,将成员变量的初始化推迟到调用 _ready()。它可以用一行替换上面的代码:

onready var my_label = get_node("MyLabel")
posted @ 2024-01-14 12:09  专心Coding的程侠  阅读(89)  评论(0编辑  收藏  举报