diff --git a/doc/demo01_hello/2.editor.md b/doc/demo01_hello/2.editor.md index 5bc5f18..20504a6 100644 --- a/doc/demo01_hello/2.editor.md +++ b/doc/demo01_hello/2.editor.md @@ -16,6 +16,7 @@ - 右侧面分栏具体包括: 1. 属性(Inspector),显示了场景分栏中所选节点的属性。 2. 节点(Node),显示了与当前场景分栏中所选节点对应的一些“信息”。 + 3. 历史记录(History),对场景的操作记录 ### 中间面板: @@ -53,7 +54,7 @@ Audio音频素材 ( *.mp3) - 场景视图Scene ,即场景编辑器窗口,默认地,创建了一个场景empty - 鼠标滚轮 :放大/缩小视图 -- 鼠标右键拖拽:平移视图 +- 鼠标中键拖拽:平移视图 - 网格,每一个大网格包括8*8的小网格,每个小网格8个像素 @@ -179,6 +180,9 @@ Scale Mode 对象的缩放 # 8. 智能对齐Snap和锁定节点 - 智能对齐,Smart Snap +``` +godot 4.x 版本可以按住ctrl,会临时打开智能 +``` - 网格对齐,Grid Snap - 锁定节点,使其不能移动 - 子节点不可选中 diff --git a/doc/demo01_hello/5.node2d.md b/doc/demo01_hello/5.node2d.md index e298042..3abfe34 100644 --- a/doc/demo01_hello/5.node2d.md +++ b/doc/demo01_hello/5.node2d.md @@ -26,7 +26,7 @@ Sprite用来显示一张图片,再给Sprite增加一个刚体 ![Image text](image/node2d-01.JPG) ``` -1. Pause Mode节点的暂停 +1. Process Mode节点的暂停 get_tree().paused = true 节点的三种可能状态有: @@ -56,6 +56,9 @@ func _process(delta): pass ``` +- https://github.com/godotengine/godot-proposals/issues/6424 + + # 3. CanvasItem节点 - CanvasItem节点,CanvasItem -> Node @@ -92,16 +95,22 @@ Transform ,Node2d节点的基本属性,在后面的脚本编程中,Transfo - 创建GdScrip脚本,叫MyNode,继承Node2D节点,并自定义节点的icon ``` +@icon("res://icon.svg") + extends Node2D -class_name MyNode, "res://icon.png" +class_name MyNode + +func _ready(): + print("my custom node") + pass ``` - 编写脚本,定义变量,编写代码 ``` -export var a = 1 -export var b:String +@export var a: int = 1 +@export var b: String ``` - 保存,如果不保存无法看到我们创建到的节点,这一点需要特别注意 diff --git a/doc/demo02_base/base1.md b/doc/demo02_base/base1.md index 836a5f1..f990aa7 100644 --- a/doc/demo02_base/base1.md +++ b/doc/demo02_base/base1.md @@ -67,23 +67,17 @@ z=x+y # 5.导出变量 -- export关键字可以让变量在编辑器中编辑 +- @export关键字可以让变量在编辑器中编辑,godot编辑器里的文档中有详细的用法 ``` # 导出一个数字 -export var a = 1 +@export var a = 1 # 导出一个节点路径 -export var b:NodePath -# 导出一个节点路径,不同的写法 -export(NodePath) var c +@export var b:NodePath # 导出一个文件路径 -export(String, FILE) var e +@export_file var sound_effect_path: String # 导出一个文件路径,以txt结尾 -export(String, FILE, "*.txt") var d -# 导出一个资源文件路径 -export(Resource) var f -# 导出一个颜色 -export(Color, RGB) var g +@export_file("*.txt") var notes_path: String ``` # 6.函数 @@ -257,12 +251,18 @@ func dictionaryIterator(): # 12. 静态变量和静态方法 -- const变量(静态变量) +- const常量 ``` const ANSWER = 42 ``` +- 静态变量,常量和静态变量不是一个东西,有区别的 + +``` +static var my_static_field = 42 +``` + - 静态方法 ``` @@ -293,6 +293,8 @@ class Animal: pass ``` +- 使用super关键字调用父类方法 + # 14. 调试 - 在编写 GdScript 时,如果没有调试工具将是一件很痛苦的事情。 diff --git a/doc/demo02_base/base2.md b/doc/demo02_base/base2.md index da13de4..55a55fb 100644 --- a/doc/demo02_base/base2.md +++ b/doc/demo02_base/base2.md @@ -1,8 +1,8 @@ # 1. 内存管理free - godot中的对象分为两种 - - 引用计数对象,继承于Reference,当没有引用时会被自动回收 - - 非引用计数对象,没有继承于Reference,自能自己手动回收,free或queue_free + - 引用计数对象,继承于RefCounted,当没有引用时会被自动回收 + - 非引用计数对象,没有继承于RefCounted,自能自己手动回收,free或queue_free - 在godot中,移除一个节点并不会从节点中删除,必须手动调用free或queue_free @@ -15,6 +15,7 @@ ![Image text](image/gc3.png) - GdScript没有垃圾回收,虽然有着内存泄露的风险,但是也保证了性能 +- 类似于C++的智能指针 # 3. 引用计数算法 diff --git a/doc/demo03_lifecycle/lifecycle.md b/doc/demo03_lifecycle/lifecycle.md index 517722a..deb934d 100644 --- a/doc/demo03_lifecycle/lifecycle.md +++ b/doc/demo03_lifecycle/lifecycle.md @@ -12,6 +12,19 @@ 特定节点可以具有任意数量的子节点,但只能有一个父节点。 ``` +- Godot的场景树(Scene Tree)是一种用于组织和管理游戏或应用程序场景的数据结构。它是一个树状结构,类似于DOM树,但是每个节点都是场景(Scene)或节点(Node)。 +``` +每个场景都可以包含其他节点作为子节点,这些子节点可以是其他场景、节点或特定功能的节点类型,例如精灵、物理对象、碰撞体等。 +这种层级结构的组织方式使得开发者可以很方便地组织和管理游戏场景的各个元素。 + +通过场景树,开发者可以很容易地管理和操作场景中的对象,比如添加、删除、查找节点,以及设置节点的属性、监听事件等。 +场景树也提供了一个机制,允许开发者以树的形式对游戏中的场景进行层级设计,例如在一些游戏中,玩家可以通过进入不同的房间或地图来切换场景。 + +Godot的场景树还提供了一些便利的特性,如自动管理节点的生命周期、自动调用节点的特定方法、自动处理碰撞和物理模拟等。 +这使得开发者可以更加专注于游戏的逻辑和功能实现,而无需过多关注底层的实现细节。 + +总之,场景树是Godot引擎中用于组织、管理和操作游戏场景的一种数据结构,它提供了一套高效、灵活的机制,可以帮助开发者构建各种类型的游戏和应用程序。 +``` ![Image text](image/scene-tree.png) # 2. 帧率 @@ -24,7 +37,7 @@ FPS = 60, 约 16.7ms 秒更新一次 通过代码可以设置,要求 godot 引擎尽量以此帧率运行 ,但实际帧率还是会有偏差 -Engine.target_fps = 120 +Engine.max_fps = 120 ``` ![Image text](image/场景循环.png) diff --git a/doc/demo04_signal/image/img.png b/doc/demo04_signal/image/img.png new file mode 100644 index 0000000..8795847 Binary files /dev/null and b/doc/demo04_signal/image/img.png differ diff --git a/doc/demo04_signal/image/img_1.png b/doc/demo04_signal/image/img_1.png new file mode 100644 index 0000000..3113895 Binary files /dev/null and b/doc/demo04_signal/image/img_1.png differ diff --git a/doc/demo04_signal/image/img_2.png b/doc/demo04_signal/image/img_2.png new file mode 100644 index 0000000..f26b12d Binary files /dev/null and b/doc/demo04_signal/image/img_2.png differ diff --git a/doc/demo04_signal/image/yield.JPG b/doc/demo04_signal/image/yield.JPG deleted file mode 100644 index 87008a0..0000000 Binary files a/doc/demo04_signal/image/yield.JPG and /dev/null differ diff --git a/doc/demo04_signal/image/yield.JPG.import b/doc/demo04_signal/image/yield.JPG.import deleted file mode 100644 index 75773dc..0000000 --- a/doc/demo04_signal/image/yield.JPG.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/yield.JPG-89a6f81a6f048deba903ba89a4540728.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://doc/demo04_signal/image/yield.JPG" -dest_files=[ "res://.import/yield.JPG-89a6f81a6f048deba903ba89a4540728.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=true -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 diff --git a/doc/demo04_signal/signal.md b/doc/demo04_signal/signal.md index 6c7637c..2cec0f2 100644 --- a/doc/demo04_signal/signal.md +++ b/doc/demo04_signal/signal.md @@ -24,7 +24,7 @@ func _on_Button1_pressed(): ``` # 第二种信号接受方法,通过代码控制信号的接收,更加的灵活,比较推荐方式 func _ready(): - $Button2.connect("pressed", self, "onButton2") + $Button2.connect("pressed", Callable(self, "onButton2")) func onButton2(): print("button2 pressed") @@ -50,44 +50,28 @@ emit_signal("mySignal", 1, 2) disconnect("mySignal", 1, 2) ``` -# 3. 异步回调yield +# 3. 异步await -- yield, to produce a result, answer, or piece of information,立即结束当前函数调用,无需等待 +- await + 对象.信号 -``` -其本质,就是能让一个函数在执行过程中暂停(挂起),然后在接收到恢复指令以后继续执行的机制。 -``` +- 1.消息接受支持异步操作 + ![Image text](image/img.png) -- yield(obj, signal),函数立即返回,并且保存当前执行的位置和状态 - -``` -GDScriptFunctionState yield( Object object=null, String signal="" ) -``` - -- yield返回GDScriptFunctionState类型对象,类似于Java的CompleteFuture - -``` -GDScriptFunctionState 是记录一个协程状态的对象,实际上它就代表(引用)着该协程。 -``` - -- resume恢复GDScriptFunctionState保存的调用函数状态 - -![Image text](image/yield.JPG) - -- yield的三种用法 -1. yield()和resmue()组合,yield()来挂起,用resmue()来恢复 -2. yield(对象,信号S)的形式,把这个协程(即 GDScriptFunctionState)注册为 节点N上信号S的接收者,当 节点N发出信号S以后,函数会恢复执行。 -3. yield(协程对象C,"completed")的形式,协程失效(即GDScriptFunctionState的is_valid为false)以后,它会释放一个"completed"信号,用这个信号恢复上一层协程。 +- 2.主动注册消息的接受 + ![Image text](image/img_1.png) +![Image text](image/img_2.png) # 4. 多线程 - 什么是进程? + ``` 电脑中有时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。比如QQ、浏览器 ``` - 什么是线程? + ``` 进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。 ``` diff --git a/doc/demo07_collision/collision.md b/doc/demo07_collision/collision.md index cc6cde7..dca2f50 100644 --- a/doc/demo07_collision/collision.md +++ b/doc/demo07_collision/collision.md @@ -24,7 +24,7 @@ - angular velocity,旋转速度 - applied forces,施加的力 - torque,扭矩 -- damp,衰减系数,值越大物体移动越慢,可以用来模拟空气摩擦力等效果。 +- damp,衰减系数,阻尼,值越大物体移动越慢,可以用来模拟空气摩擦力等效果。 # 3. 刚体实战 diff --git a/doc/demo08_path/path.md b/doc/demo08_path/path.md index f2bb1d3..bc355d1 100644 --- a/doc/demo08_path/path.md +++ b/doc/demo08_path/path.md @@ -39,6 +39,11 @@ The descendant nodes will then move accordingly when setting an offset in this n # 4. Tilemap 节点 +- tilemap在godot 4.x中的用法 +- https://www.bilibili.com/video/BV1cR4y1Z7Pq/?spm_id_from=333.999.0.0&vd_source=4f3b881aea002f58e78c896adbef428d +- https://www.bilibili.com/video/BV1bd4y1x7dP/?spm_id_from=333.788&vd_source=4f3b881aea002f58e78c896adbef428d + + - tilemap的由tileset组成,tileset由tile一个个单个图块组成 - 基本上通过熟练使用get_cell、set_cell、world_to_map这些函数就可以解决大多数普通关卡制作需求 diff --git a/doc/demo10_animation/animation.md b/doc/demo10_animation/animation.md index 68c7f74..f7688a4 100644 --- a/doc/demo10_animation/animation.md +++ b/doc/demo10_animation/animation.md @@ -47,12 +47,9 @@ autostart :自动开始,载入场景后计时,也可以使用 start 方法 - 渐变节点使用非常简单方便,可以对一个物体的任意属性进行动画控制,当然,也可以同时处理多个动画对象。其主要方法有以下几个: ``` -repeat :是否重复 -start() :开始渐变,结束后触发 tween_completed 信号 -interpolate_property() :设置进行动画的节点属性以及时长等,需要传递属性名称、开始结束值、时长等参数 - -这里最重要的方法是 interpolate_property() ,可以在 Godot 编辑器中按 F4搜索 Tween 类进行查看。 -当然,和 Timer 节点一样,我们完全可以在代码中动态创建Tween 对象。 +var tween: Tween = tween = create_tween() +# 无限循环动画 +tween.set_loops() Smoothly animates a node's properties over time. diff --git a/doc/demo11_particle_light/particle.md b/doc/demo11_particle_light/particle.md index acb6aa0..bc87425 100644 --- a/doc/demo11_particle_light/particle.md +++ b/doc/demo11_particle_light/particle.md @@ -9,6 +9,7 @@ # 2. 法线贴图NormalMap +- 在godot4中需要在Sprite2D中选择CanvasTexture才能够看到法线贴图 - 法线贴图的定义 ``` @@ -40,6 +41,7 @@ # 3. 光照和阴影LightOccluder2D - 光照是指光的照射,godot 中光照的实现模拟了光对真实世界的影响。在场景中添加光源可以使场景产生相应的光照和阴影效果,获得更好的视觉效果。 +- 在godot4中,光线分为两个,点光源PointLight2D和全局光源DirectionalLight2D ![Image text](image/light_shadow_main.png)