From e5c527f6512bab6c52da58570c7ce47cd80d6bc4 Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Mon, 10 Jan 2022 17:55:22 +0800 Subject: [PATCH] doc --- doc/demo03_lifecycle/lifecycle.md | 64 +++++++++++++++++++++++++++- scene/demo02_base/base4.tscn | 6 +++ script/demo02_base/base4.gd | 33 ++++++++++++++ script/demo03_lifecycle/sub_node1.gd | 2 +- 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 scene/demo02_base/base4.tscn create mode 100644 script/demo02_base/base4.gd diff --git a/doc/demo03_lifecycle/lifecycle.md b/doc/demo03_lifecycle/lifecycle.md index e9f986d..1980a23 100644 --- a/doc/demo03_lifecycle/lifecycle.md +++ b/doc/demo03_lifecycle/lifecycle.md @@ -1,5 +1,17 @@ # 1. 场景树 +- Nodes(节点)是在Godot中创建游戏的基本构建块。当一组节点被添加到树中时,它被称为sence(场景),树被称为sence tree(场景树) + +``` +节点是可以表示各种专用游戏功能的对象。给定类型的节点可以显示图形,播放动画或表示对象的3D模型。 +该节点还包含一组属性,允许你自定义其行为。 +你添加到项目中的节点取决于你需要的功能。 +它是一个模块化系统,旨在为你提供构建游戏对象的灵活性。 + +在项目中,你添加的节点将组织为树结构。在树中,节点被添加为其他节点的子节点。 +特定节点可以具有任意数量的子节点,但只能有一个父节点。 +``` + ![Image text](image/scene-tree.png) ![Image text](image/场景循环.png) @@ -32,13 +44,63 @@ Engine.target_fps = 120 # 3. 节点的生命周期 +- 在Godot中,一个游戏的启动大致流程如下: + +``` +Godot的main启动一个进程,加载所需的驱动设备(如渲染设备:GL/GLES/Vulkan等)、音频设备,输入控制器设备等等; + +然后进入主循环,加载一个自动创建的对象——SceneTree(场景管理系统对象,它用户管理场景图), +这个对象包含一个RootViewPort节点(它是一个Node),该节点包含一个默认的ViewPort(以便提供默认渲染的输出视口)。 + +当用户用Godot编辑器创建一个关卡(或场景文件),并设置默认的启动的场景文件,Godot将该场景文件的根节点附加到RootViewPort节点上, +当节点进入场景树(SceneTree),变为活动状态。 +按场景树顺序依次回调各个子节点的_init(),_ready()等声明函数。 +``` + ![Image text](image/godot_process.jpg) ![Image text](image/godot_node.jpg) ![Image text](image/godot_lifecycle.jpg) -# 4. process和physics_process +# 4. 节点的获取方式 + +``` +# 获取当前节点 +var currentNode1 = $"." +var currentNode2 = self + +# 获取父节点 +var parentNode1 = get_parent() +var parentNode2 = $"../" + +# 获取子节点 +var subNode1 = $SubNode2 +var subNode2 = $"SubNode2" +var subNode3 = get_node("SubNode2") + +# 根节点查找法,会返回节点树从上到下找到的第一个节点 +var subNode4 = get_tree().root.find_node("SubNode2", true, false) +``` + +# 5. process和physics_process + +- 平时我们看到的动画,实际上是由很多静止的画面连续切换组成的 +- 其中每个静止的画面,我们都称为一帧,比如60帧的动画,就是一秒播放60个静止的画面,组成的动画 +- godot 的 _process 相当于 unity 的 Update + +``` +内部对代码就会在每一帧之前被执行,也就是引擎每渲染一幅的画面之前,都会执行它里面的代码 +``` + +- godot 的 _physics_process 相当于 unity 的 FixedUpdate + +``` +内部的代码会在每个物理帧之前被执行, +因为godot的物理模拟是单独进行的,每次进行物理模拟的时候,如计算一个刚体小球的运动轨迹,每进行一次计算,我们就称为是一进行了一个物理帧, +而每次进行物理模拟之前,都会执行_physics_process中的代码 +``` ![Image text](image/process.png) ![Image text](image/process-1.png) ![Image text](image/physics.png) ![Image text](image/physics-1.png) + diff --git a/scene/demo02_base/base4.tscn b/scene/demo02_base/base4.tscn new file mode 100644 index 0000000..76abb7b --- /dev/null +++ b/scene/demo02_base/base4.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://script/demo02_base/base4.gd" type="Script" id=1] + +[node name="Node2D" type="Node2D"] +script = ExtResource( 1 ) diff --git a/script/demo02_base/base4.gd b/script/demo02_base/base4.gd new file mode 100644 index 0000000..6a28ab7 --- /dev/null +++ b/script/demo02_base/base4.gd @@ -0,0 +1,33 @@ +extends Node2D + + +func _ready(): + createNodeByScript() + pass + + +func createNodeByScript(): + # new一个Sprite节点 + var sprite = Sprite.new() + + # 设置图片 + var icon = preload("res://icon.png") + sprite.set_texture(icon) + + # 修改名称 + sprite.name = "mynode" + + # 修改坐标居中 + sprite.position.x = 200 + sprite.position.y = 200 + + # 添加到当前的场景中 + add_child(sprite) + pass # Replace with function body. + + + +func _process(delta): + var sprite = $mynode + sprite.rotate(0.1) + pass diff --git a/script/demo03_lifecycle/sub_node1.gd b/script/demo03_lifecycle/sub_node1.gd index 3aff6b4..7752695 100644 --- a/script/demo03_lifecycle/sub_node1.gd +++ b/script/demo03_lifecycle/sub_node1.gd @@ -13,7 +13,7 @@ func _ready(): # that all children nodes have also entered the Scene Tree, # and became active. print("sub node1 _ready") - nodeUsage() + #nodeUsage() func _exit_tree(): # When the node exits the Scene Tree, this function is called.