1、创建游戏 创建项目 2、创建 Player 先创建 Area2D 节点作为场景的根节点 然后再创建两个子节点 AnimatedSprite2D 节点用作显示动画效果的角色节点,我们添加对应状态的动画帧 使用资源的动画帧拖入分组为 up 和 walk,这代表两个状态,每个状态两帧 然后,CollisionShape2D 节点为动画节点套上碰撞体,选择胶囊体 通过拖拽,把动画节点包裹住 3、编写 Player 脚本 选择 Player 节点,为其添加脚本 使用默认 编写脚本 extends Area2D @export var speed = 400 var screen_size 使用 @export 标注的变量可以在检查器中进行编辑,编辑器中如果赋值会覆盖脚本的值 func _ready(): screen_size = get_viewport_rect().size 当节点进入场景树的时候,_ready() 函数会被调用,此时我们查看游戏窗口大小 接下来使用 _process() 函数定义玩家的行为,_process() 函数每一帧都会被调用,可以用来更新我们希望经常变化的游戏元素,通常执行如下操作: 检查输入 沿给定方向移动 播放合适的动画 输入动作在项目设置中的“输入映射”下定义,先输入一个动作 move_right,并进行添加 然后为这个动作分配按键 在事件那边按键盘上的方向键,会监听,选中后确定 此时,完成按键和动作的绑定 继续补充剩余几个方向的内容 继续,回到脚本,使用 Input.is_action_pressed() 检测是否按下了某个按键,按下会返回 true,否则返回 false func _process(delta: float) -> void: var velocity = Vector2.ZERO if Input.is_action_pressed("move_right"): velocity.x += 1 if Input.is_action_pressed("move_left"): velocity.x -= 1 if Input.is_action_pressed("move_down"): velocity.y += 1 if Input.is_action_pressed("move_up"): velocity.y -= 1 if velocity.length() > 0: velocity = velocity.normalized() * speed $AnimatedSprite2D.play() else: $AnimatedSprite2D.stop() Vector2.ZERO 对应的是(0,0)向量,因为默认情况下玩家不移动 然后根据 if 分支去每帧检验用户的输入,这里根据方向分为 x 和 y 两个维度,如果同时按右和下,则对应(1,1)向量,表示右下 ...

1 min

https://gdquest.github.io/learn-gdscript/?ref=godot-docs 所有游戏都是计算机程序 游戏的指令有:移动角色、绘制血条、播放音效等 1、概述 GDScript 意思是 Godot Script,即 Godot 脚本 这是一门由游戏开发者开发、为游戏开发者而生的语言 2、报错 对于计算机而言,报错是好事 这些错误可以帮助你编写正确的程序 3、站在巨人的肩膀上 我们将其他开发人员创建的代码包称为库 Godot 引擎将许多库捆绑在一起,提供了一个庞大的工具集,可以节省制作游戏的时间 函数是具有确切名称的一系列指令,使用该名称会命令计算机按顺序执行一系列指令 3.1、调用函数 调用函数是让计算机执行某段已有代码的操作,称为“调用该函数” 写出函数名并加上一对小括号,例如调用名为 show 的函数写作 show() 3.2、函数参数 函数参数是放在调用时括号内传入函数的值,用来控制函数行为(数字、字符串等)。 4、编写函数 对一些指令序列起个名字就是一个函数,而这个名字就是标识符 使用标识符,可以让计算机根据需要多次执行函数内的所有指令,这就是函数调用的作用 4.1、定义函数 函数定义以 func 关键字开头,后跟空格、函数名称、括号和冒号 func name(): 函数中的指令必须都以制表符开头缩进,计算机使用这种缩进来判断哪些指令属于同一个代码块 func name(): instruction_1 instruction_2 instruction_3 4.2、标识符 函数标识符不能包含空格,通常,编程语言中的名称都不能包含空格 计算机使用空格来检测不同关键字和标识符之间的分隔 在 GDScript 中,我们使用下划线 _ 代替空格,比如 move_forward() 标识符必须以字母或下划线开头,不能以数字开头,但可以在第一个字符后使用数字 5、函数参数 参数就像函数代码中的“占位符“,这个函数的定义就成为一个模板,每次可以向其中传入不同的值 在调用函数的时候,使用实际的参数去替代定义时占位的参数 func draw_square(length): # ... 在函数体内部所有参数的拷贝都会在调用时被具体的传值替代,参数如果有多个单词组成,一般会使用 _ 进行分隔 func draw_square(side_length): # ... 当然,函数也可以有多个参数,使用 , 给多个参数进行分隔 func name(parameter_1, parameter_2, ...): 6、成员变量 变量是用于访问随事件变化的值的标签 ...

1 min

编辑器手册 1、项目管理器 项目管理器页面可以管理已有项目、导入或创建新项目等等 另外,还有资产库选项卡,可以在这里浏览到各种开源社区开发的项目 点击这个页面的设置按钮,可以修改一些其他条目,像语言、界面主题等 使用项目管理器 2、Godot 编辑器 打开新建项目或者已有项目,都可以进入 Godot 编辑器界面 默认情况下,左侧为主菜单,中间为工作区切换按钮,右侧为游戏测试按钮和电影制作模式切换按钮 在中间的工作区切换按钮下方,是场景标签,点击 + 可以新建场景,右侧是专注模式 2.1、中间区域 在中间位置,场景选择器下方是视口,其顶部是工具栏,可以用于移动、缩放或锁定场景中的节点 工具栏会根据上下文和所选节点改变,这里是 2D 工具栏 然后,这个是 3D 工具栏 五个屏幕 3D 简介 视口的两边是停靠面板,窗口的底部则是底部面板 2.2、停靠面板 文件系统面板会列出项目中的文件,包括脚本、图片、音频采样等 场景面板中会列出活动场景中的节点 在检查器面板中可以查看所选节点的属性 检查器面板 面板的移动和大小调整 2.3、底部面板 视口底部的底部面板中包含了调试控制台、动画编辑器、混音器等,默认都是折叠状态 点击对应的 Tab 会纵向展开对应功能的面板,也可以使用快捷键 3、四个主屏幕 工作区有5个选项卡:2D、3D、Script、Game、AssetLib 2D 屏幕可以用于任何类型的游戏,除了 2D 游戏,2D 屏幕也会用于界面的构造 3D 屏幕可以操作网格、灯光、设计 3D 游戏的关卡 Script 屏幕是一个完整的代码编辑器,包含调试器、丰富的自动补全、以及内置的代码参考手册 AssetLib 屏幕是插件、脚本、资产的仓库,这些内容是开源的,可以直接在项目中使用 关于资产库 4、内置类参考手册 Godot 自带内置的类参考手册 搜索类、方法、属性、常量、信号相关的信息,可以使用以下任意方法: ...

1 min

任何游戏引擎都围绕着用于构建应用程序的抽象概念展开。 在 Godot 中,游戏就是一棵由节点构成的树,节点可以分组形成场景。然后你还可以将这些节点连起来,让它们通过信号进行通信。 1、场景 在 Godot 中,可以将游戏分解成可重复使用的场景,可以是角色、武器、用户界面的菜单等 Godot 中的场景很灵活,既能充当预制件(Prefab),又能作为其他游戏游戏引擎中那种关卡对应的场景 并且场景还可以嵌套 2、节点 场景由一个或多个节点组成 节点是游戏中最小的构建块,可以将其排列成树 节点和场景在编辑器中看起来是一样的,把一棵节点树保存为场景时,就只显示为单个节点 Godot 提供了丰富的基础节点类型库,可以通过组合和扩展来建立更强大的节点,这足以做很多事 3、场景树 游戏的所有场景都汇集在场景树中,场景本身是节点树,场景树自然也是节点树 从语义和游戏内容的角度上,场景树更好理解,每个场景会有其在游戏中具体的含义,会表示角色、武器、建筑等 4、信号 节点在发生某件事情的时候会发出信号,这种机制使得无需将节点在代码中进行硬连接就可以相互进行通信 信号其实就是 Godot 版的观察者模式,就比如按下按钮触发事件,监听的一方可以进行响应来对事件做出反应

1 min

信号是 Godot 内置的委派机制,允许一个游戏对象对另一个游戏对象的变化做出反应,而无需相互引用 使用信号可以限制耦合,并保持代码的灵活性 GDScript:类(节点)使用 PascalCase(大驼峰命名法),变量和函数使用 snake_case(蛇形命名法),常量使用 ALL_CAPS(全大写)(请参阅 GDScript 编写风格指南)。 1、场景设置 先新建一个场景 在场景面板中,选择 2D 场景,作为根节点 然后将 sprite_2d.tscn 文件拖动到 Node2D 上 再添加一个 Node2D 节点的子节点,Button 节点 创建完进行拖拽调整大小,再添加文本 2、在编辑器中连接信号 需要将按钮的“pressed”信号连接到 Sprite2D,通过调用一个新函数来控制其运动状态 选中按钮节点,在检查器旁边的节点 Tab 下找到可用的信号,里面有 pressed() 信号 选中后点击“连接”,这里会要选一个接收信号的方法,这里用默认,连接到 Sprite2D 节点上 点击“连接”,自动跳转到对应节点的脚本 点击左侧绿色箭头,可以看到函数的详情,包括信号接受者,信号来源等信息 Node 的另一个方法 is_processing() ,如果空闲处理处于活动状态,则返回 true。我们可以使用 not 关键字来反转该值。 另外,将 _process 改为自动运行 extends Sprite2D var speed = 400 var angular_speed = PI func _process(delta: float): rotation += angular_speed * delta var velocity = Vector2.UP.rotated(rotation) * speed position += velocity * delta func _on_button_pressed() -> void: set_process(not is_processing()) ...

2 min

使用 Ctrl + Shift + Q 退出到项目列表 1、导入项目 在项目管理器中点击“导入” 在弹出的窗口中,导航到对应的项目目录下,选择 project.godot 文件来打开这个项目 项目中包含两个场景:Main.tscn 和 Ball.tscn 打开 Main.tscn 为 Main.tscn 节点添加小球作为子节点 先选中 Main 节点,点击场景面板左上角的实例化按钮(为当前选中节点添加另一个场景的实例作为子节点) 选择小球对应的场景 Ball.tscn 实例化 此时,小球实例出现在 Main 的左上角 稍微调整其位置 然后使用 F5 运行,会看到小球滚落 如果想要多创建几个小球,选中小球,按下 Ctrl + D 创建副本,然后调整各个小球的位置 小球实例各自下落,每一个都是模板场景的独立副本 2、编辑场景和实例 实例还有许多用法,可以: 使用检查器修改一个小球的属性,这样不会影响到其他的小球(个体独立,直接修改) 打开 ball.tscn 场景修改 Ball 节点,从而修改所有 Ball 的默认属性。在保存时,项目中所有 Ball 的实例都会更新其属性值(修改模板同步所有个体) 2.1、修改模板 选中 Ball.tscn 修改检查器中的 Physics Material 的 Bounce 为 0.5,然后按 Enter 确认 ...

1 min

1、项目设置 新建一个全新的空项目,然后创建一个 Sprite2D 节点 Sprite2D 节点需要一个贴图来显示,在检查器中,找到 Texture 属性,将 icon.svg 拖到 Texture 属性上 然后,拖动节点到视口中央 2、新建脚本 右键场景面板中的 Sprite2D 节点,选择“添加脚本…”创建并将脚本附加到该节点上 此时,弹出窗口,将模板选择为 Object: Empty 此时,创建了一个 sprite_2d.gd 脚本文件 extends Sprite2D 每个 GDScript 文件都是一个隐含的类,extends 关键字定义了这个脚本所继承或扩展的类 根据这里的代码,意味脚本将获得 Sprite2D 节点所有的属性和方法 继承的属性包括在检查器中能够看到的属性,将鼠标悬停在检查器的属性上,可以看到其描述以及在代码中对应的标识符 3、Hello World extends Sprite2D func _init(): print("Hello, World!") 使用 func 关键字定义了一个名为 _init 的新函数,这是类构造函数的一个特殊名称 如果定义了这个函数,引擎会在内存中创建每个对象或节点时调用 _init() GDScript 是基于缩进的语言,需要注意编写时的代码缩进 使用 F6 运行当前的场景,在输出选项卡里会显示输出的结果 4、四处旋转 需要向脚本添加两个成员变量:移动速度(像素/秒)和角速度(弧度/秒) var speed = 400 # 速度 var angular_speed = PI # 角速度 为了移动图标,需要在游戏循环中每一帧更新其位置和旋转,使用 Node 类中的虚函数 _process() 如果在任何继承 Node 类的类中定义这个函数,Godot 引擎将在每一帧中调用该函数,并传递给它一个名为 delta 的参数(从上一帧开始经过的时间) ...

1 min

在 Godot 中,有两个主要工具处理玩家的输入: 内置的输入回调,主要是 _unhandled_input() ,和 _process() 一样,也是一个内置的虚函数,Godot 每次在玩家按下一个键时都会调用 Input 单例,单例是一个全局可访问的对象,Godot 在脚本中提供对几个对象的访问,它是每一帧检查输入的有效工具 func _process(delta: float): var direction = 0 if Input.is_action_pressed("ui_left"): direction = -1 if Input.is_action_pressed("ui_right"): direction = 1 rotation += angular_speed * direction * delta 使用 Input 进行 if 判断,调用 Input.is_action_pressed() 检查玩家按下某个键,使用字符串表示一个输入动作,该按键被按下时返回 true ,其他时候返回 false 这里对应的就是响应左右两个方向按键 1、按“上”时移动 添加了对于“上”的事件响应 var velocity = Vector2.ZERO if Input.is_action_pressed("ui_up"): velocity = Vector2.UP.rotated(rotation) * speed 2、完整脚本 extends Sprite2D var speed = 400 var angular_speed = PI func _process(delta: float): var direction = 0 if Input.is_action_pressed("ui_left"): direction = -1 if Input.is_action_pressed("ui_right"): direction = 1 rotation += angular_speed * direction * delta var velocity = Vector2.ZERO if Input.is_action_pressed("ui_up"): velocity = Vector2.UP.rotated(rotation) * speed position += velocity * delta Godot中的每个脚本都代表一个类,并扩展了引擎的一个内置类

1 min

1、节点 节点是游戏的基本构件,Godot 引擎包含很多种节点,可以用来显示图像、播放声音、表示摄像机等 所有节点具备以下特性: 名称 可编辑的属性 每帧都可以接收回调以进行更新 可以使用新的属性和函数进行扩展 可以将它们添加为其他节点的子节点 节点会组成一棵树,组织起项目时非常强大 不同的节点有不同的功能,将它们组合起来可以产生更加复杂的行为 2、场景 场景允许以想要的方式来构造游戏代码,通过组合节点来创建自定义和复杂的节点类型 本质上来说,Godot 编辑器就是一个场景编辑器,Godot 项目中可以包含任意数量的场景 引擎只要求将其中之一设置为程序的主场景,这也就是运行游戏时,Godot 最初加载的场景 除了像节点一样工作外,场景还具有以下特点: 始终有一个根节点 可以将他们保存到本地驱动器并稍后加载 可以根据需要创建任意数量的场景实例 3、创建第一个场景 创建新的项目,此时空场景会提供几个快速选项,用于创建场景根节点 2D 场景:Node2D 节点 3D 场景:Node3D 节点 用户界面:Control 节点 其他节点:自行选择,等同于点击“创建根节点” 接下来,我们搜索并添加“Label”节点 添加节点时,场景自动切换到 2D 工作区,这是因为 Label 是 2D 节点类型 刚添加的 Label 节点自动以选中状态出现在了视口的左上角,同时左侧场景面板和右侧的检查器面板也同步显示了 Label 的信息 4、修改节点的属性 修改 Label 的 Text 属性 检查器面板 选择工具栏上的移动工具(W) 点击并拖拽可以移动 Label 节点,放到视口中心位置 5、运行场景 点击“运行当前场景”(F6) 由于还没有保存场景的修改,需要先保存一下 此时,程序会打开新窗口 ...

1 min