Godot引擎 4.0 文档 - 循序渐进教程 - 监听玩家输入
本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面:
Listening to player input — Godot Engine (stable) documentation in English
监听玩家输入¶
在上一课创建您的第一个脚本的基础上,让我们看看任何游戏的另一个重要特征:将控制权交给玩家。要添加它,我们需要修改我们的sprite_2d.gd
代码。
您有两个主要工具来处理玩家在 Godot 中的输入:
-
内置的输入回调,主要是
_unhandled_input()
. 就像_process()
,它是一个内置的虚函数,每当玩家按下一个键时,Godot 就会调用它。这是您想要用来对并非每一帧都发生的事件做出反应的工具,例如按下Space【空格键】跳跃。要了解有关输入回调的更多信息,请参阅使用 InputEvent。 -
Input【单例singleton】
。单例是一个全局可访问的对象。Godot 提供对多个脚本的访问。这是检查每一帧输入的正确工具。
我们将Input
在这里使用单例,因为我们需要知道玩家是否想要转动或移动每一帧。
对于转动,我们应该使用一个新变量:direction
。在我们的_process()
函数中,用下面的代码替换之前内容【rotation += angular_speed * delta】
var direction = 0
if Input.is_action_pressed("ui_left"):direction = -1
if Input.is_action_pressed("ui_right"):direction = 1rotation += angular_speed * direction * delta
我们的direction
局部变量是一个因数,表示玩家想要转向的方向。值0
表示玩家没有按向左或向右箭头键。值1
表示玩家想要右转,-1
意味着他们想要左转。
为了产生这些值,我们引入了条件判断和使用Input
. 条件以GDScript 中的关键字if
开始,以冒号结束。具体条件是关键字和行尾之间的表达式。
要检查此帧是否按下了某个键,我们调用Input.is_action_pressed()
. 该方法采用表示输入操作的文本字符串,true
如果按下操作则返回,false
否则返回。
我们上面使用的两个动作,“ui_left”和“ui_right”,在每个 Godot 项目中都是预定义的。它们分别在玩家按下键盘上的左右箭头或游戏手柄的方向键上的左右箭头时触发。
注:您可以通过转到“项目”->“项目设置”并单击“输入映射”选项卡来查看和编辑项目中的输入操作。
最后,我们用direction
作为因数来更新节点的 rotation
: rotation += angular_speed * direction * delta
如果您使用此代码运行场景,当您按下 Left和Right时,图标应该会旋转。
按“UP”时移动¶
要仅在按键时移动,我们需要修改计算速度的代码。用下面的代码替换var velocity
开头的行。
var velocity = Vector2.ZERO if Input.is_action_pressed("ui_up"):velocity = Vector2.UP.rotated(rotation) * speed
velocity
我们用值Vector2.ZERO
初始化,这是表示长度为 0 的二维向量Vector
的另一个内置类型常量。
如果玩家按下“ui_up”动作,我们就会更新速度值,使精灵向前移动。
完整脚本¶
这是完整的sprite_2d.gd
文件以供参考。
extends Sprite2Dvar speed = 400 var angular_speed = PIfunc _process(delta):var direction = 0if Input.is_action_pressed("ui_left"):direction = -1if Input.is_action_pressed("ui_right"):direction = 1rotation += angular_speed * direction * deltavar velocity = Vector2.ZEROif Input.is_action_pressed("ui_up"):velocity = Vector2.UP.rotated(rotation) * speedposition += velocity * delta
如果您运行场景,您现在应该可以使用左右箭头键旋转并按 向前移动Up。
总结¶
总之,Godot 中的每个脚本都代表一个类,并扩展了引擎的一个内置类。您的类继承自的节点类型,使您可以访问基类属性,如sprite 示例中rotation
、position
属性。您还继承了许多我们在本示例中没有使用的功能。
在 GDScript 中,放在文件顶部的变量是类的属性,也称为成员变量。除了变量之外,您还可以定义函数,在大多数情况下,函数将是您的类的方法。
Godot 提供了几个你可以定义的虚函数来连接你的类和引擎。其中包括_process()
,每帧对节点应用更改,以及_unhandled_input()
接收来自用户的按键和按钮按下等输入事件。还有很多。
Input
单例允许您在代码中的任何位置对玩家的输入做出反应。特别是,您将在_process()
循环中使用它。
在下一课使用信号中,我们将通过让我们的节点在脚本中触发代码来构建脚本和节点之间的关系。
相关文章:

Godot引擎 4.0 文档 - 循序渐进教程 - 监听玩家输入
本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Listening to player input — Godot Engine (stable) documentation in English 监听玩家输入 在上一课创建您的第一个脚本的基础上,让我们看看任何游戏…...

Docker笔记9 | Docker中网络功能知识梳理和了解
9 | Docker中网络功能知识梳理和了解 1 外部访问容器1.1 访问方式1.2 映射所有接口地址1.3 映射到指定地址的指定端口1.4 映射到指定地址的任意端口1.5 查看映射端口配置 2 容器互联2.1 新建网络2.2 连接容器 3 配置DNS 简单说:Docker 允许通过外部访问容器或容器互…...

生态系统模型:SolVES、DNDC、CMIP6、GEE林业、APSIM、InVEST、无人机遥感、ArcGIS Pro模型等
基于R语言APSIM模型高级应用及批量模拟实践技术 CMIP6 数据处理方法与典型案例分析实践技术 Python 与 Noah-MP 陆面过程模型融合技术及在站点、区域模拟实践应用 双碳目标下基于“遥感”融合技术在碳储量、碳收支、碳循环等多领域监测与模拟实践应用 基于Citespace和vosvi…...

常见分布函数。
一维常见分布函数 1.离散型 ① 0 - 1分布 记 X~B(1,p) 如果X的概率分布为 ( 1 0 p 1 − p ) \begin{pmatrix} 1 & 0 \\ p & 1-p \end{pmatrix} (1p01−p),则称X服从参数为P的0-1分布(0<p<1)。 注:0-1分布又称一次伯努利试…...

【网络安全】红队攻防之基础免杀
引言 本文主要介绍“反射型 dll 注入”及“柔性加载”技术。 反射型 dll 注入 为什么需要反射型 dll 注入 常规的 dll 注入代码如下: int main(int argc, char *argv[]) {HANDLE processHandle;PVOID remoteBuffer;wchar_t dllPath[] TEXT("C:\\experimen…...

CTF入门指南
何为CTF ? CTF(Capture The Flag)夺旗比赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。…...
C:入门级积累(4)
(int *)malloc(10 * sizeof(int))memory allocate动态分配内存,malloc的出现时为了弥补静态内存分配的缺点,传统数组的长度一旦定义之后,就不能更改,比如说,如果我有一个业务在这之前给分配的大小为100,但是࿰…...

基于DBSCAN密度聚类的风电-负荷场景削减方法
目录 1 主要内容 基于密度聚类的数据预处理: 场景提取: 算法流程: 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《氢能支撑的风-燃气耦合低碳微网容量优化配置研究》第三章内容,实现的是基于DBSCAN…...

服务(第二十七篇)squid-传统、穿透、反向代理
squid代理服务器: 主要提供缓存加速、应用层过滤控制的功能。 代理的工作机制: 1、代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址。 2、将获得的网页数据(静态 Web 元素)保存到缓存中并发送给客户机&#x…...
golang yaml 解析问题
golang 中解析 yaml 格式内容可以使用 yaml.v3 库来解决。下载 go 依赖 go get -u gopkg.in/yaml.v31. 示例 yaml 数据 config_mail_template:description: 验证码one: Verification Codeother: Verification Codeconfig_mail_template_reset_code:description: 重置密码one:…...

setContentHuggingPriority和setContentCompressionResistancePriority的使用
需求: 两个label并排显示,文字内容由服务器返回,label宽度以文字内容自适应,label之间间距大于等于10. 需要考虑以下情况: 当两个label的宽度和 < 屏幕宽度时,各自设置约束,无需处理&#…...

java springboot yml文件配置 多环境yml
如果是properties改用yml,直接改后缀,原文件中的配置语法改用yml的语法即可,系统会自动扫描application.properties和application.yml文件(注意:改了之后需要maven 命令 clean一下,清个缓存)。 …...

DMBOK知识梳理for CDGA/CDGP——第一章数据管理(附常考知识点)
第一章 数据管理 第一章在 CDGA|CDGP考试中分值占比均不是很高,主要侧重点是考概念性的知识,理解数据管理的目标原则、还有与其他概念的区别点,同时掌握几个关键核心的图(车轮图、六边形图、语境关系图)。总体来说难度…...

065:cesium设置带有箭头的线材质(material-9)
第065个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置带有箭头的线材质,请参考源代码,了解PolylineArrowMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共82行)相关API参考…...
Java常用API
1 常用API API(:Application Programming Interface ):应用程序编程接口1.1 Math类 Math中没有构造方法,类的成员都是静态的(static修饰),通过类名就可以直接调用常用方法方法名说明public static int abs(int a)获取参数a的绝对值public static double ceil(double a) …...

【C++ 学习 ⑥】- C++ 动态内存管理详解
目录 一、new 表达式和 delete 表达式的工作机理 二、operator new 和 operator delete 函数 2.1 - 标准库定义 2.2 - 重载 三、定位 new 表达式 四、常见面试题 4.1 - malloc/free 和 new/delete 的区别 4.2 - 内存泄漏 在 C 中,new 和 delete 既是关键字&…...
【5.21】六、自动化测试—常见技术
目录 6.2 自动化测试常见技术 1. 录制与回放测试 2. 脚本测试 3. 数据驱动测试 6.2 自动化测试常见技术 自动化测试技术有很多种,这里介绍3种常见的技术: 1. 录制与回放测试 录制是指使用自动化测试工具对桌面应用程序或者是Web页面的某一项功能进…...
JavaScript中的事件循环机制,包括事件循环的原理、宏任务和微任务、事件队列和调用栈、以及如何优化事件循环
JavaScript中的事件循环机制是JavaScript运行引擎的核心之一,它决定了代码的执行方式和效率。本文将从几个方面介绍JavaScript中的事件循环机制,包括事件循环的原理、宏任务和微任务、事件队列和调用栈、以及如何优化事件循环。 一、事件循环的原理 事…...
【华为OD机试c++】解压报文【2023 B卷 |200分】
题目描述 为了提升数据传输的效率,会对传输的报文进行压缩处理。 输入一个压缩后的报文,请返回它解压后的原始报文。 压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。 注意 n 为正整数(0 < n < 100&a…...
JS中Array的forEach、map、filter方法区别?
一:基本用法 1、forEach()函数用于对数组中的每个元素执行给定的函数,而它不返回任何值,它只是对每个元素调用传入的函数。这个函数可以接受三个参数:当前元素的值、当前元素的索引和整个数组。 const arr [1, 2, 3]; arr.forE…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...