<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>游戏 on 我的博客</title>
    <link>https://tech-blog-17j.pages.dev/categories/%E6%B8%B8%E6%88%8F/</link>
    <description>Recent content in 游戏 on 我的博客</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <atom:link href="https://tech-blog-17j.pages.dev/categories/%E6%B8%B8%E6%88%8F/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title></title>
      <link>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/2d-%E6%B8%B8%E6%88%8F/%E7%AC%AC%E4%B8%80%E6%AC%BE%E6%B8%B8%E6%88%8F/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/2d-%E6%B8%B8%E6%88%8F/%E7%AC%AC%E4%B8%80%E6%AC%BE%E6%B8%B8%E6%88%8F/</guid>
      <description>&lt;h1 id=&#34;1创建游戏&#34;&gt;1、创建游戏&lt;/h1&gt;
&lt;p&gt;创建项目&lt;/p&gt;
&lt;h1 id=&#34;2创建-player&#34;&gt;2、创建 Player&lt;/h1&gt;
&lt;p&gt;先创建 &lt;code&gt;Area2D&lt;/code&gt; 节点作为场景的&lt;strong&gt;根节点&lt;/strong&gt;
然后再创建两个子节点&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605241534018.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;AnimatedSprite2D&lt;/code&gt; 节点用作显示动画效果的角色节点，我们添加对应状态的&lt;strong&gt;动画帧&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605241538228.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;使用资源的动画帧拖入分组为 up 和 walk，这代表两个状态，每个状态两帧&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605241540916.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后，&lt;code&gt;CollisionShape2D&lt;/code&gt; 节点为动画节点套上碰撞体，选择胶囊体&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605241541577.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;通过拖拽，把动画节点包裹住&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;screen008.gif&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605241543816.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;3编写-player-脚本&#34;&gt;3、编写 Player 脚本&lt;/h1&gt;
&lt;p&gt;选择 Player 节点，为其添加脚本&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605282315426.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;使用默认&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605282316641.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;编写脚本&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Area2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; speed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; screen_size
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;@export&lt;/code&gt; 标注的变量可以在检查器中进行编辑，编辑器中如果赋值会覆盖脚本的值&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_ready&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	screen_size &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_viewport_rect&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;size
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当&lt;strong&gt;节点进入场景树&lt;/strong&gt;的时候，&lt;code&gt;_ready()&lt;/code&gt; 函数会被调用，此时我们查看游戏窗口大小&lt;/p&gt;
&lt;p&gt;接下来使用 &lt;code&gt;_process()&lt;/code&gt; 函数定义玩家的行为，&lt;code&gt;_process()&lt;/code&gt; 函数每一帧都会被调用，可以用来更新我们希望经常变化的游戏元素，通常执行如下操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查输入&lt;/li&gt;
&lt;li&gt;沿给定方向移动&lt;/li&gt;
&lt;li&gt;播放合适的动画&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;输入动作在项目设置中的“输入映射”下定义，先输入一个动作 move_right，并进行添加&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605282332330.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后为这个动作分配按键&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605282334712.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;在事件那边按键盘上的方向键，会监听，选中后确定&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605282335584.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;此时，完成按键和动作的绑定&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605282337894.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;继续补充剩余几个方向的内容&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605282339651.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;继续，回到脚本，使用 &lt;code&gt;Input.is_action_pressed()&lt;/code&gt; 检测是否按下了某个按键，按下会返回 &lt;code&gt;true&lt;/code&gt;，否则返回 &lt;code&gt;false&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_process&lt;/span&gt;(delta: &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; velocity &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vector2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ZERO
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Input&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_action_pressed&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;move_right&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		velocity&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;x &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Input&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_action_pressed&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;move_left&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		velocity&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;x &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Input&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_action_pressed&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;move_down&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		velocity&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;y &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Input&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_action_pressed&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;move_up&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		velocity&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;y &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; velocity&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		velocity &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; velocity&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;normalized&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; speed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;$AnimatedSprite2D&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;play&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;$AnimatedSprite2D&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;stop&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Vector2.ZERO&lt;/code&gt; 对应的是（0，0）向量，因为默认情况下玩家不移动
然后根据 &lt;code&gt;if&lt;/code&gt; 分支去每帧检验用户的输入，这里根据方向分为 &lt;code&gt;x&lt;/code&gt; 和 &lt;code&gt;y&lt;/code&gt; 两个维度，如果同时按右和下，则对应（1，1）向量，表示右下&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/gdscript-%E7%BC%96%E7%A8%8B/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/gdscript-%E7%BC%96%E7%A8%8B/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://gdquest.github.io/learn-gdscript/?ref=godot-docs&#34;&gt;https://gdquest.github.io/learn-gdscript/?ref=godot-docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;所有游戏都是计算机程序&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;游戏的指令有：移动角色、绘制血条、播放音效等&lt;/p&gt;
&lt;h1 id=&#34;1概述&#34;&gt;1、概述&lt;/h1&gt;
&lt;p&gt;GDScript 意思是 Godot Script，即 Godot 脚本
这是一门&lt;strong&gt;由游戏开发者开发、为游戏开发者而生的语言&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;2报错&#34;&gt;2、报错&lt;/h1&gt;
&lt;p&gt;对于计算机而言，&lt;strong&gt;报错是好事&lt;/strong&gt;
这些错误可以帮助你编写正确的程序&lt;/p&gt;
&lt;h1 id=&#34;3站在巨人的肩膀上&#34;&gt;3、站在巨人的肩膀上&lt;/h1&gt;
&lt;p&gt;我们将&lt;strong&gt;其他开发人员创建的代码包&lt;/strong&gt;称为&lt;strong&gt;库&lt;/strong&gt;
Godot 引擎将许多库捆绑在一起，提供了一个庞大的工具集，可以节省制作游戏的时间&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;函数&lt;/strong&gt;是具有确切名称的一系列&lt;strong&gt;指令&lt;/strong&gt;，使用该名称会命令计算机按&lt;strong&gt;顺序&lt;/strong&gt;执行&lt;strong&gt;一系列指令&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;31调用函数&#34;&gt;3.1、调用函数&lt;/h2&gt;
&lt;p&gt;调用函数是让计算机执行某段已有代码的操作，称为“调用该函数”
写出函数名并加上一对小括号，例如调用名为 &lt;code&gt;show&lt;/code&gt; 的函数写作 &lt;code&gt;show()&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;32函数参数&#34;&gt;3.2、函数参数&lt;/h2&gt;
&lt;p&gt;函数参数是放在调用时括号内传入函数的值，用来控制函数行为（数字、字符串等）。&lt;/p&gt;
&lt;h1 id=&#34;4编写函数&#34;&gt;4、编写函数&lt;/h1&gt;
&lt;p&gt;对一些&lt;strong&gt;指令序列&lt;/strong&gt;起个名字就是一个函数，而这个名字就是&lt;strong&gt;标识符&lt;/strong&gt;
使用标识符，可以让计算机根据需要&lt;strong&gt;多次执行&lt;/strong&gt;函数内的所有指令，这就是&lt;strong&gt;函数调用&lt;/strong&gt;的作用&lt;/p&gt;
&lt;h2 id=&#34;41定义函数&#34;&gt;4.1、定义函数&lt;/h2&gt;
&lt;p&gt;函数定义以 &lt;code&gt;func&lt;/code&gt; 关键字开头，后跟空格、函数名称、括号和冒号&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;函数中的指令必须都以&lt;strong&gt;制表符&lt;/strong&gt;开头缩进，计算机使用这种缩进来判断哪些指令属于同一个&lt;strong&gt;代码块&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	instruction_1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	instruction_2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	instruction_3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;42标识符&#34;&gt;4.2、标识符&lt;/h2&gt;
&lt;p&gt;函数标识符&lt;strong&gt;不能包含空格&lt;/strong&gt;，通常，编程语言中的名称都不能包含空格
计算机使用空格来检测不同关键字和标识符之间的分隔&lt;/p&gt;
&lt;p&gt;在 GDScript 中，我们使用下划线 &lt;code&gt;_&lt;/code&gt; 代替空格，比如 &lt;code&gt;move_forward()&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;标识符&lt;strong&gt;必须以字母或下划线开头，不能以数字开头&lt;/strong&gt;，但可以在第一个字符后使用数字&lt;/p&gt;
&lt;h1 id=&#34;5函数参数&#34;&gt;5、函数参数&lt;/h1&gt;
&lt;p&gt;参数就像函数代码中的“占位符“，这个函数的定义就成为一个&lt;strong&gt;模板&lt;/strong&gt;，每次可以向其中传入不同的值
在调用函数的时候，使用实际的参数去替代定义时占位的参数&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;draw_square&lt;/span&gt;(length):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在函数体内部所有参数的拷贝都会在调用时被具体的传值替代，参数如果有多个单词组成，一般会使用 &lt;code&gt;_&lt;/code&gt; 进行分隔&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;draw_square&lt;/span&gt;(side_length):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然，函数也可以有多个参数，使用 &lt;code&gt;,&lt;/code&gt; 给多个参数进行分隔&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;(parameter_1, parameter_2, &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;6成员变量&#34;&gt;6、成员变量&lt;/h1&gt;
&lt;p&gt;变量是用于访问随事件变化的值的&lt;strong&gt;标签&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/godot-%E7%95%8C%E9%9D%A2%E4%BB%8B%E7%BB%8D/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/godot-%E7%95%8C%E9%9D%A2%E4%BB%8B%E7%BB%8D/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.godotengine.org/zh-cn/4.x/tutorials/editor/index.html#doc-editor-introduction&#34;&gt;编辑器手册&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;1项目管理器&#34;&gt;1、项目管理器&lt;/h1&gt;
&lt;p&gt;项目管理器页面可以管理已有项目、导入或创建新项目等等&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161752130.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;另外，还有资产库选项卡，可以在这里浏览到各种开源社区开发的项目&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161754018.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;点击这个页面的设置按钮，可以修改一些其他条目，像语言、界面主题等&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161756464.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.godotengine.org/zh-cn/4.x/tutorials/editor/project_manager.html#doc-project-manager&#34;&gt;使用项目管理器&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;2godot-编辑器&#34;&gt;2、Godot 编辑器&lt;/h1&gt;
&lt;p&gt;打开新建项目或者已有项目，都可以进入 Godot 编辑器界面&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161800676.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;默认情况下，左侧为&lt;strong&gt;主菜单&lt;/strong&gt;，中间为&lt;strong&gt;工作区切换按钮&lt;/strong&gt;，右侧为&lt;strong&gt;游戏测试按钮和电影制作模式切换按钮&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161805765.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;在中间的工作区切换按钮下方，是场景标签，点击 &lt;code&gt;+&lt;/code&gt; 可以新建场景，右侧是专注模式&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161808742.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;21中间区域&#34;&gt;2.1、中间区域&lt;/h2&gt;
&lt;p&gt;在中间位置，场景选择器下方是&lt;strong&gt;视口&lt;/strong&gt;，其顶部是工具栏，可以用于移动、缩放或锁定场景中的节点&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161811081.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;工具栏会&lt;strong&gt;根据上下文和所选节点改变&lt;/strong&gt;，这里是 &lt;strong&gt;2D 工具栏&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161814662.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后，这个是 &lt;strong&gt;3D 工具栏&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161814796.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.godotengine.org/zh-cn/4.x/getting_started/introduction/first_look_at_the_editor.html#doc-intro-to-the-editor-interface-five-screens&#34;&gt;五个屏幕&lt;/a&gt;
&lt;a href=&#34;https://docs.godotengine.org/zh-cn/4.x/tutorials/3d/introduction_to_3d.html#doc-introduction-to-3d&#34;&gt;3D 简介&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;视口的两边是&lt;strong&gt;停靠面板&lt;/strong&gt;，窗口的底部则是&lt;strong&gt;底部面板&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;22停靠面板&#34;&gt;2.2、停靠面板&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161822443.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;文件系统&lt;/strong&gt;面板会列出项目中的文件，包括脚本、图片、音频采样等&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161830978.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;面板中会列出活动场景中的&lt;strong&gt;节点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161832719.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;在&lt;strong&gt;检查器&lt;/strong&gt;面板中可以查看所选节点的属性&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.godotengine.org/zh-cn/4.x/tutorials/editor/inspector_dock.html#doc-editor-inspector-dock&#34;&gt;检查器面板&lt;/a&gt;
&lt;a href=&#34;https://docs.godotengine.org/zh-cn/4.x/tutorials/editor/customizing_editor.html#doc-customizing-editor-moving-docks&#34;&gt;面板的移动和大小调整&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;23底部面板&#34;&gt;2.3、底部面板&lt;/h2&gt;
&lt;p&gt;视口底部的&lt;strong&gt;底部面板&lt;/strong&gt;中包含了调试控制台、动画编辑器、混音器等，默认都是折叠状态&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161839838.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;点击对应的 Tab 会纵向展开对应功能的面板，也可以使用快捷键&lt;/p&gt;
&lt;h1 id=&#34;3四个主屏幕&#34;&gt;3、四个主屏幕&lt;/h1&gt;
&lt;p&gt;工作区有5个选项卡：2D、3D、Script、Game、AssetLib&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2D 屏幕&lt;/strong&gt;可以用于任何类型的游戏，除了 2D 游戏，2D 屏幕也会用于&lt;strong&gt;界面的构造&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161912530.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3D 屏幕&lt;/strong&gt;可以操作网格、灯光、设计 3D 游戏的关卡&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161914246.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Script 屏幕&lt;/strong&gt;是一个完整的代码编辑器，包含调试器、丰富的自动补全、以及内置的代码参考手册&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161916523.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AssetLib 屏幕&lt;/strong&gt;是插件、脚本、资产的仓库，这些内容是开源的，可以直接在项目中使用&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605161921797.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.godotengine.org/zh-cn/4.x/community/asset_library/what_is_assetlib.html#doc-what-is-assetlib&#34;&gt;关于资产库&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;4内置类参考手册&#34;&gt;4、内置类参考手册&lt;/h1&gt;
&lt;p&gt;Godot 自带内置的类参考手册
搜索类、方法、属性、常量、信号相关的信息，可以使用以下任意方法：&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%85%B3%E9%94%AE%E6%A6%82%E5%BF%B5%E6%9C%89%E4%B8%AA%E5%A4%A7%E4%BD%93%E5%8D%B0%E8%B1%A1%E5%B0%B1%E8%A1%8C/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%85%B3%E9%94%AE%E6%A6%82%E5%BF%B5%E6%9C%89%E4%B8%AA%E5%A4%A7%E4%BD%93%E5%8D%B0%E8%B1%A1%E5%B0%B1%E8%A1%8C/</guid>
      <description>&lt;p&gt;任何游戏引擎都围绕着用于构建应用程序的抽象概念展开。
在 Godot 中，游戏就是一棵由&lt;strong&gt;节点&lt;/strong&gt;构成的&lt;strong&gt;树&lt;/strong&gt;，节点可以分组形成&lt;strong&gt;场景&lt;/strong&gt;。然后你还可以将这些节点连起来，让它们通过&lt;strong&gt;信号&lt;/strong&gt;进行通信。&lt;/p&gt;
&lt;h1 id=&#34;1场景&#34;&gt;1、场景&lt;/h1&gt;
&lt;p&gt;在 Godot 中，可以将游戏分解成&lt;strong&gt;可重复使用的场景&lt;/strong&gt;，可以是角色、武器、用户界面的菜单等
Godot 中的场景很&lt;strong&gt;灵活&lt;/strong&gt;，既能充当预制件（Prefab），又能作为其他游戏游戏引擎中那种关卡对应的场景&lt;/p&gt;
&lt;p&gt;并且场景还可以&lt;strong&gt;嵌套&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;2节点&#34;&gt;2、节点&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;场景由一个或多个节点组成&lt;/strong&gt;
节点是游戏中&lt;strong&gt;最小的构建块&lt;/strong&gt;，可以将其排列成树&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;节点和场景在编辑器中看起来是一样的，把一棵节点树保存为场景时，就只显示为单个节点&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Godot 提供了&lt;strong&gt;丰富的基础节点类型库&lt;/strong&gt;，可以通过&lt;strong&gt;组合和扩展&lt;/strong&gt;来建立更强大的节点，这足以做很多事&lt;/p&gt;
&lt;h1 id=&#34;3场景树&#34;&gt;3、场景树&lt;/h1&gt;
&lt;p&gt;游戏的所有场景都汇集在&lt;strong&gt;场景树&lt;/strong&gt;中，&lt;strong&gt;场景本身是节点树&lt;/strong&gt;，场景树自然也是节点树
从语义和游戏内容的角度上，场景树更好理解，每个场景会有其在游戏中具体的含义，会表示角色、武器、建筑等&lt;/p&gt;
&lt;h1 id=&#34;4信号&#34;&gt;4、信号&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;节点在发生某件事情的时候会发出信号&lt;/strong&gt;，这种机制使得无需将节点在代码中进行硬连接就可以相互进行通信&lt;/p&gt;
&lt;p&gt;信号其实就是 Godot 版的&lt;strong&gt;观察者模式&lt;/strong&gt;，就比如按下按钮触发事件，监听的一方可以进行响应来对事件做出反应&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9/%E4%BD%BF%E7%94%A8%E4%BF%A1%E5%8F%B7/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9/%E4%BD%BF%E7%94%A8%E4%BF%A1%E5%8F%B7/</guid>
      <description>&lt;p&gt;信号是 Godot 内置的委派机制，允许一个游戏对象对另一个游戏对象的变化做出反应，而&lt;strong&gt;无需相互引用&lt;/strong&gt;
使用信号可以&lt;strong&gt;限制耦合&lt;/strong&gt;，并保持代码的灵活性&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GDScript&lt;/strong&gt;：类（节点）使用 PascalCase（大驼峰命名法），变量和函数使用 snake_case（蛇形命名法），常量使用 ALL_CAPS（全大写）（请参阅 &lt;a href=&#34;https://docs.godotengine.org/zh-cn/4.x/tutorials/scripting/gdscript/gdscript_styleguide.html#doc-gdscript-styleguide&#34;&gt;GDScript 编写风格指南&lt;/a&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;1场景设置&#34;&gt;1、场景设置&lt;/h1&gt;
&lt;p&gt;先新建一个场景&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605202333186.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;在场景面板中，选择 &lt;strong&gt;2D 场景&lt;/strong&gt;，作为根节点&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605202335065.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后将 &lt;code&gt;sprite_2d.tscn&lt;/code&gt; 文件拖动到 Node2D 上&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605202338617.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;再添加一个 Node2D 节点的子节点，&lt;code&gt;Button&lt;/code&gt; 节点&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605202340376.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;创建完进行拖拽调整大小，再添加文本&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605202344208.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;2在编辑器中连接信号&#34;&gt;2、在编辑器中连接信号&lt;/h1&gt;
&lt;p&gt;需要将按钮的“pressed”信号连接到 Sprite2D，通过调用一个新函数来控制其运动状态
选中按钮节点，在检查器旁边的节点 Tab 下找到&lt;strong&gt;可用的信号&lt;/strong&gt;，里面有 &lt;code&gt;pressed()&lt;/code&gt; 信号&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605202349727.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;选中后点击“连接”，这里会要选一个接收信号的方法，这里用默认，连接到 Sprite2D 节点上&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605202352243.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;点击“连接”，自动跳转到对应节点的脚本&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605202355734.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;点击左侧绿色箭头，可以看到函数的详情，包括信号接受者，信号来源等信息&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605202356661.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Node 的另一个方法 &lt;code&gt;is_processing()&lt;/code&gt; ，如果空闲处理处于活动状态，则返回 &lt;code&gt;true&lt;/code&gt;。我们可以使用 &lt;code&gt;not&lt;/code&gt; 关键字来反转该值。
另外，将 &lt;code&gt;_process&lt;/code&gt; 改为自动运行&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Sprite2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; speed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; angular_speed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;PI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_process&lt;/span&gt;(delta: &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	rotation &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; angular_speed &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; delta
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; velocity &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vector2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;UP&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rotated&lt;/span&gt;(rotation) &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; speed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	position &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; velocity &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; delta
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_on_button_pressed&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;set_process&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;is_processing&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;screen006.gif&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605210005083.gif&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9/%E5%88%9B%E5%BB%BA%E5%AE%9E%E4%BE%8B/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9/%E5%88%9B%E5%BB%BA%E5%AE%9E%E4%BE%8B/</guid>
      <description>&lt;p&gt;使用 &lt;code&gt;Ctrl + Shift + Q&lt;/code&gt; 退出到项目列表&lt;/p&gt;
&lt;h1 id=&#34;1导入项目&#34;&gt;1、导入项目&lt;/h1&gt;
&lt;p&gt;在项目管理器中点击“导入”&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171233303.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;在弹出的窗口中，导航到对应的项目目录下，选择 &lt;code&gt;project.godot&lt;/code&gt; 文件来打开这个项目&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171233723.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;项目中包含两个场景：&lt;code&gt;Main.tscn&lt;/code&gt; 和 &lt;code&gt;Ball.tscn&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171239575.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;打开 &lt;code&gt;Main.tscn&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171242784.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;为 &lt;code&gt;Main.tscn&lt;/code&gt; 节点添加小球作为子节点
先选中 Main 节点，点击场景面板左上角的&lt;strong&gt;实例化&lt;/strong&gt;按钮（为当前选中节点添加另一个场景的实例作为子节点）&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171245025.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;选择小球对应的场景 &lt;code&gt;Ball.tscn&lt;/code&gt; 实例化&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171246332.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;此时，小球实例出现在 Main 的左上角&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171248932.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;稍微调整其位置&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171249372.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后使用 F5 运行，会看到小球滚落&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171250802.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;如果想要多创建几个小球，选中小球，按下 &lt;code&gt;Ctrl + D&lt;/code&gt; 创建副本，然后调整各个小球的位置&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171253120.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171253533.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;小球实例各自下落，&lt;strong&gt;每一个都是模板场景的独立副本&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;2编辑场景和实例&#34;&gt;2、编辑场景和实例&lt;/h1&gt;
&lt;p&gt;实例还有许多用法，可以：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用&lt;strong&gt;检查器&lt;/strong&gt;修改一个小球的属性，这样不会影响到其他的小球（个体独立，直接修改）&lt;/li&gt;
&lt;li&gt;打开 &lt;code&gt;ball.tscn&lt;/code&gt; 场景修改 Ball 节点，从而修改所有 Ball 的默认属性。在保存时，项目中所有 Ball 的实例都会更新其属性值（修改模板同步所有个体）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;21修改模板&#34;&gt;2.1、修改模板&lt;/h2&gt;
&lt;p&gt;选中 &lt;code&gt;Ball.tscn&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171259437.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;修改检查器中的 &lt;strong&gt;Physics Material&lt;/strong&gt; 的 &lt;strong&gt;Bounce&lt;/strong&gt; 为 0.5，然后按 Enter 确认&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9/%E5%88%9B%E5%BB%BA%E7%AC%AC%E4%B8%80%E4%B8%AA%E8%84%9A%E6%9C%AC/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9/%E5%88%9B%E5%BB%BA%E7%AC%AC%E4%B8%80%E4%B8%AA%E8%84%9A%E6%9C%AC/</guid>
      <description>&lt;h1 id=&#34;1项目设置&#34;&gt;1、项目设置&lt;/h1&gt;
&lt;p&gt;新建一个全新的空项目，然后创建一个 Sprite2D 节点&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171351889.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sprite2D 节点需要一个贴图来显示，在检查器中，找到 &lt;strong&gt;Texture&lt;/strong&gt; 属性，将 icon.svg 拖到 Texture 属性上&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171357046.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后，拖动节点到视口中央&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171359361.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;2新建脚本&#34;&gt;2、新建脚本&lt;/h1&gt;
&lt;p&gt;右键场景面板中的 Sprite2D 节点，选择“添加脚本&amp;hellip;”创建并将脚本附加到该节点上&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171401114.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;此时，弹出窗口，将模板选择为 &lt;code&gt;Object: Empty&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171406579.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;此时，创建了一个 &lt;code&gt;sprite_2d.gd&lt;/code&gt; 脚本文件&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171451418.png&#34;&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Sprite2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;每个 GDScript 文件都是一个&lt;strong&gt;隐含的类&lt;/strong&gt;，&lt;code&gt;extends&lt;/code&gt; 关键字定义了这个脚本所&lt;strong&gt;继承或扩展的类&lt;/strong&gt;
根据这里的代码，意味脚本将获得 &lt;code&gt;Sprite2D&lt;/code&gt; 节点&lt;strong&gt;所有的属性和方法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;继承的属性&lt;strong&gt;包括在检查器中能够看到的属性&lt;/strong&gt;，将鼠标悬停在检查器的属性上，可以看到其描述以及在代码中对应的标识符&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171506857.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;3hello-world&#34;&gt;3、Hello World&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Sprite2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_init&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;func&lt;/code&gt; 关键字定义了一个名为 &lt;code&gt;_init&lt;/code&gt; 的新函数，这是&lt;strong&gt;类构造函数的一个特殊名称&lt;/strong&gt;
如果定义了这个函数，&lt;strong&gt;引擎会在内存中创建每个对象或节点时调用 &lt;code&gt;_init()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GDScript 是基于缩进的语言，需要注意编写时的代码缩进&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用 F6 运行当前的场景，在输出选项卡里会显示输出的结果&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171517733.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;4四处旋转&#34;&gt;4、四处旋转&lt;/h1&gt;
&lt;p&gt;需要向脚本添加两个成员变量：移动速度（像素/秒）和角速度（弧度/秒）&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; speed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 速度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; angular_speed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;PI&lt;/span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;# 角速度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;为了移动图标，需要在游戏循环中&lt;strong&gt;每一帧&lt;/strong&gt;更新其位置和旋转，使用 &lt;code&gt;Node&lt;/code&gt; 类中的虚函数 &lt;code&gt;_process()&lt;/code&gt;
如果在任何继承 &lt;code&gt;Node&lt;/code&gt; 类的类中定义这个函数，Godot 引擎将&lt;strong&gt;在每一帧中调用该函数&lt;/strong&gt;，并传递给它一个名为 &lt;code&gt;delta&lt;/code&gt; 的参数（&lt;strong&gt;从上一帧开始经过的时间&lt;/strong&gt;）&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9/%E7%9B%91%E5%90%AC%E7%8E%A9%E5%AE%B6%E7%9A%84%E8%BE%93%E5%85%A5/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9/%E7%9B%91%E5%90%AC%E7%8E%A9%E5%AE%B6%E7%9A%84%E8%BE%93%E5%85%A5/</guid>
      <description>&lt;p&gt;在 Godot 中，有两个主要工具处理玩家的输入：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;内置的输入回调&lt;/strong&gt;，主要是 &lt;code&gt;_unhandled_input()&lt;/code&gt; ，和 &lt;code&gt;_process()&lt;/code&gt; 一样，也是一个内置的虚函数，Godot &lt;strong&gt;每次在玩家按下一个键时都会调用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Input&lt;/code&gt; 单例，单例是一个全局可访问的对象&lt;/strong&gt;，Godot 在脚本中提供对几个对象的访问，它是&lt;strong&gt;每一帧&lt;/strong&gt;检查输入的有效工具&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_process&lt;/span&gt;(delta: &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; direction &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Input&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_action_pressed&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ui_left&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		direction &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Input&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_action_pressed&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ui_right&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		direction &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	rotation &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; angular_speed &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; direction &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; delta
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;Input&lt;/code&gt; 进行 &lt;code&gt;if&lt;/code&gt; 判断，调用 &lt;code&gt;Input.is_action_pressed()&lt;/code&gt; 检查玩家按下某个键，使用字符串表示一个输入动作，该按键被按下时返回 &lt;code&gt;true&lt;/code&gt; ，其他时候返回 &lt;code&gt;false&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这里对应的就是响应左右两个方向按键&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;screen004.gif&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605182245995.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;1按上时移动&#34;&gt;1、按“上”时移动&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;screen005.gif&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605192358352.gif&#34;&gt;&lt;/p&gt;
&lt;p&gt;添加了对于“上”的事件响应&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; velocity &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vector2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ZERO
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Input&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_action_pressed&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ui_up&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	velocity &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vector2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;UP&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rotated&lt;/span&gt;(rotation) &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; speed
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;2完整脚本&#34;&gt;2、完整脚本&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gd&#34; data-lang=&#34;gd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Sprite2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; speed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; angular_speed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;PI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_process&lt;/span&gt;(delta: &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; direction &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Input&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_action_pressed&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ui_left&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		direction &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Input&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_action_pressed&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ui_right&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		direction &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	rotation &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; angular_speed &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; direction &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; delta
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; velocity &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vector2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ZERO
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Input&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_action_pressed&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ui_up&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		velocity &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vector2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;UP&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rotated&lt;/span&gt;(rotation) &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; speed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	position &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; velocity &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; delta	
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Godot中的&lt;strong&gt;每个脚本都代表一个类&lt;/strong&gt;，并扩展了引擎的一个内置类&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9/%E8%8A%82%E7%82%B9%E4%B8%8E%E5%9C%BA%E6%99%AF/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tech-blog-17j.pages.dev/posts/%E6%B8%B8%E6%88%8F/godot/%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9/%E8%8A%82%E7%82%B9%E4%B8%8E%E5%9C%BA%E6%99%AF/</guid>
      <description>&lt;h1 id=&#34;1节点&#34;&gt;1、节点&lt;/h1&gt;
&lt;p&gt;节点是游戏的&lt;strong&gt;基本构件&lt;/strong&gt;，Godot 引擎包含很多种节点，可以用来显示图像、播放声音、表示摄像机等&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605162334934.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;所有节点具备以下特性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;名称&lt;/li&gt;
&lt;li&gt;可编辑的属性&lt;/li&gt;
&lt;li&gt;每帧都可以接收回调以进行更新&lt;/li&gt;
&lt;li&gt;可以使用新的属性和函数进行扩展&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可以将它们添加为其他节点的子节点&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;节点会组成一棵树&lt;/strong&gt;，组织起项目时非常强大
不同的节点有不同的功能，将它们组合起来可以产生更加复杂的行为&lt;/p&gt;
&lt;h1 id=&#34;2场景&#34;&gt;2、场景&lt;/h1&gt;
&lt;p&gt;场景允许以想要的方式来构造游戏代码，通过&lt;strong&gt;组合节点&lt;/strong&gt;来创建自定义和复杂的节点类型&lt;/p&gt;
&lt;p&gt;本质上来说，Godot 编辑器就是一个&lt;strong&gt;场景编辑器&lt;/strong&gt;，Godot 项目中可以包含任意数量的场景
引擎只要求将其中之一设置为程序的&lt;strong&gt;主场景&lt;/strong&gt;，这也就是运行游戏时，Godot &lt;strong&gt;最初加载的场景&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;除了像节点一样工作外，场景还具有以下特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;始终有一个&lt;strong&gt;根节点&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;可以将他们保存到本地驱动器并稍后加载&lt;/li&gt;
&lt;li&gt;可以根据需要创建任意数量的场景实例&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;3创建第一个场景&#34;&gt;3、创建第一个场景&lt;/h1&gt;
&lt;p&gt;创建新的项目，此时空场景会提供几个快速选项，用于创建&lt;strong&gt;场景根节点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605170017524.png&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2D 场景：Node2D 节点&lt;/li&gt;
&lt;li&gt;3D 场景：Node3D 节点&lt;/li&gt;
&lt;li&gt;用户界面：Control 节点&lt;/li&gt;
&lt;li&gt;其他节点：自行选择，等同于点击“创建根节点”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来，我们搜索并添加“Label”节点&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605170023893.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;添加节点时，场景自动切换到 2D 工作区，这是因为 Label 是 2D 节点类型
刚添加的 Label 节点自动以选中状态出现在了视口的左上角，同时左侧场景面板和右侧的检查器面板也同步显示了 Label 的信息&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171037077.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;4修改节点的属性&#34;&gt;4、修改节点的属性&lt;/h1&gt;
&lt;p&gt;修改 Label 的 Text 属性&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171038191.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.godotengine.org/zh-cn/4.x/tutorials/editor/inspector_dock.html#doc-editor-inspector-dock&#34;&gt;检查器面板&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;选择工具栏上的&lt;strong&gt;移动工具&lt;/strong&gt;（W）&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171040375.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;点击并拖拽可以移动 Label 节点，放到视口中心位置&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171043843.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;5运行场景&#34;&gt;5、运行场景&lt;/h1&gt;
&lt;p&gt;点击“运行当前场景”（F6）&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171044185.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;由于还没有保存场景的修改，需要先保存一下&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;http://image-blog-001.test.upcdn.net/images/202605171045257.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;此时，程序会打开新窗口&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
