在 Area2D 中覆盖 KinematicBody2D 运动?

2023-12-20

I'm trying to create a windy area within which the player would be pushed continuously to the left <-
enter image description here

到目前为止,这就是我想出的WindyArea:

extends Area2D

var bodies_within=[] # saves bodies within the area which have "direction" property

func _physics_process(delta): # the "wind" process
    for body in bodies_within:
        body.direction.x-=50 # constantly pushing x back by 50
        body.direction=body.move_and_slide(body.direction) 

func _body_entered(body):
    if("direction" in body): # if body has direction then append it to the array
        bodies_within.append(body)
        set_physics_process(true) # turn on the "wind"

func _body_exited(body):
    if(body in bodies_within):
        bodies_within.erase(body)
    
    if!(len(bodies_within)): # if no bodies are left within the area then turn off the "wind"
        set_physics_process(false)

func _ready():
    set_physics_process(false)
    
    self.connect("body_entered",self,"_body_entered")
    self.connect("body_exited",self,"_body_exited")

对于我的 Player 主体(仅供参考,我试图不更改此脚本并必须在其中创建一个新的 Windy 函数):

extends KinematicBody2D

var direction:Vector2
var gravity_speed=4500
var jump_speed=-1500
var descend_speed=50
var horizontal_speed=600

func _physics_process(delta):
    direction.x=Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
    direction.x*=horizontal_speed
    
    if(is_on_floor()):
        if(Input.is_action_just_pressed("ui_up")):
            direction.y=jump_speed
    
    ## Movement ##
    direction.y += gravity_speed * delta + descend_speed * Input.get_action_strength("ui_down")
    direction=move_and_slide(direction,Vector2.UP)

但它只在玩家没有得到任何用户输入并且身体是静态时才起作用,但是当玩家得到用户输入时它似乎不起作用,相反它开始移动得更快(我猜是因为move_and_slide被叫了两次?)

那么是否有任何修复或替代解决方案涉及相同的方法,无需(太多)更改玩家脚本,而是将运动更改交给 Area2D?


我将提供一种完全不同的方法:重力覆盖。

大多数教程都会对玩家角色的重力进行硬编码。事实上,你正在这样做。好吧,正如邪恶博士所说:“不”怎么样?


您可以从项目设置中获得全局引力。你可以这样得到:

var g_scale:float = ProjectSettings.get("physics/2d/default_gravity")
var g:Vector2 = ProjectSettings.get("physics/2d/default_gravity_vector") * g_scale

也许你不想要。但是,您可能会发现将所需的重力表示为该重力的倍数很有用。

var g_scale:float = ProjectSettings.get("physics/2d/default_gravity")
var g:Vector2 = ProjectSettings.get("physics/2d/default_gravity_vector") * g_scale

gravity = g * g_factor

为什么?因为我们要使用Area2D修改重力,然后您可以对获得的重力应用相同的乘数。

因此,正如您可能知道的那样,Area2D具有“物理覆盖”属性,允许您修改重力。

这引出了这个问题?如何查询运动体所处的重力?嗯,像这样:

var gravity = Physics2DServer.body_get_direct_state(get_rid()).total_gravity

是的,你可以应用一个因素:

gravity = Physics2DServer.body_get_direct_state(get_rid()).total_gravity * g_factor

现在您可以使用此重力进行运动。你做了一个Area2D用水平分量覆盖默认重力。玩家角色根据修改后的重力下落,这也意味着它会侧向移动。哒哒! “风”。

请注意,这意味着放弃重力沿着y轴。你可以这样做:direction += gravity * delta.


好吧,好吧,好吧,让我们说你不想这样做。您可以做的是公开速度或加速度属性Area2D可以设置进入的实体。

例如:

var area_effect_velocity:Vector2

然后Area2D做这个:

func _body_entered(body):
    if("area_effect_velocity" in body):
        bodies_within.append(body)
        body.area_effect_velocity = Vector2(-50.0, 0.0)

func _body_exited(body):
    if(body in bodies_within):
        bodies_within.erase(body)
        body.area_effect_velocity = Vector2.ZERO

然后您可以将其添加到您的动议中。例如:

direction += area_effect_velocity

关于重叠的附录Area2D:

通过重力覆盖方法,您可以将空间覆盖设置为“组合”,Godot 会为您解决这个问题。

使用另一种方法,您可以通过偏移量来处理它:

var effect_velocity := Vector2(-50.0, 0.0)

func _body_entered(body):
    if("area_effect_velocity" in body):
        bodies_within.append(body)
        body.area_effect_velocity += effect_velocity

func _body_exited(body):
    if(body in bodies_within):
        bodies_within.erase(body)
        body.area_effect_velocity -= effect_velocity

这将避免额外的检查。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Area2D 中覆盖 KinematicBody2D 运动? 的相关文章

  • 【Godot】对 Godot 节点设计的思考

    对 Godot 中节点设计的思考 单个节点的功能设计的想法 xff0c 体会 Godot 的设计思想 低耦合 设计单个节点可复用的节点时 xff0c 调用方法尽量只对当前节点可获取到的变量或方法进行使用 xff0c 比如我写一个可以控制 K
  • 【Godot】行为树(一)了解与设计行为树代码

    行为树介绍 行为树是个节点树 xff0c 父节点通过不断遍历子节点 xff0c 根据不同类型的节点执行不同的分支 最终调用叶节点执行功能 行为树也不难理解 xff0c 他就像代码逻辑一样 xff0c 只是用节点的方式展现出来 xff0c 而
  • Godot 4 应用 - 图形绘制

    花了两天时间 做了一个初步的图形软件效果 先占个坑 以后再叙
  • Godot 4 源码分析 - 文件读入编码处理

    今天需要读入xml文件进行处理 结果读入一个带中文的文件时 出错了 当然程序还能运行 但编译器一直报错 而且XML解析也不正确 单步调试发现读入的内容出现乱码 具体逻辑 String FileAccess get as text bool
  • 戈多3.2.1。刷新查询时无法更改此状态。使用 call_deferred() 或 set_deferred() 来更改监控状态

    在我的 2D 游戏中 玩家能够摧毁箱子 具有两种碰撞形状的物体 当被摧毁时 板条箱会产生也具有碰撞形状的物品 但是当调用以下函数时 Godot控制台中会显示许多类似的错误 Code func on Crate item dropped co
  • 如何创建没有 setter 函数的 getter 函数?

    我的脚本中有多个导出的变量 每当更改一个变量时 我想调用一个通用的 getter 并让值自动设置 tool export float var sample1 setget smthn changed export float var sam
  • 合并多个精灵节点?

    例如 假设我有 2 个精灵节点 但也可以超过 2 个 如下所示 每个人都有自己独立的图像我想要的是将它们组合起来并用单个图像创建一个新的精灵节点 在工具模式下 like this 也许可以通过使用Image 毫无疑问涉及计算 或者也许使用一
  • 如何检测 Godot 中的碰撞?

    我有3个场景 一个名为 KinematicBody2D tscn 的 KinematicBody2D 节点 该场景是一个玩家在屏幕上从左向右移动 我还有一个名为 mob tscn 的场景 它是一个igidbody2d节点 这个场景只有精灵和
  • 在 Area2D 中覆盖 KinematicBody2D 运动?

    I m trying to create a windy area within which the player would be pushed continuously to the left lt 到目前为止 这就是我想出的Windy
  • 如何在Godot 4.0游戏引擎中实现可组合的角色/技能系统?

    我目前正在使用 Godot 尝试 MOBA 风格游戏的原型 我正在努力寻找一种管理角色及其技能的方法 所有角色都将具有相似的属性 姓名 生命值 奔跑速度 力量等 然而 所有角色的技能都会有所不同 尽管有些角色非常相似 例如基于投射物的技能将
  • 在 godot 游戏引擎中使用不同的编程语言?

    我想要将不同的编程语言绑定到 Godot 游戏引擎 有关于这个主题的指导文件或视频吗 例如 这个项目是如何完成的 戈多锈 https github com godot rust godot rust 如果我能学习基础知识 我就能成功地用不同
  • 安卓:应用程序未安装

    这里是新手 我用Godot游戏引擎制作了我的第一个游戏并成功导出到android 复制到我的手机上 它安装并运行良好 几个小时后 我做了一些更改并再次导出 再次复制了 apk 但现在当我尝试安装它时 它没有完成安装 我多次尝试更改导出设置
  • 如何获取另一个场景godot中的节点?

    我正在制作一个具有多个场景的游戏 需要有 get node 来自另一个场景的节点 变量 并且我不知道如何从另一个场景获取节点 如果我理解正确的话 您想连接到来自另一个场景中的节点的信号 直接方法会起作用 const bullet prelo
  • Godot:调用外部方法

    经过大量谷歌搜索 我仍然不明白什么可能是一个简单的解决方案 场景 主要 包含一个 TileMap Grid 并附有一个脚本 Grid gd 场景 玩家 包含一个 KinematicBody2D Player 及其附加脚本 Player gd
  • 如何克服 Godot 将按钮字体更改为默认颜色的问题?

    我正在使用 Godot 4 我在容器中手动创建了很多按钮 我在主场景中设置了一个颜色变量 tempcol 当我单击带有 tempcol 设置的按钮时 比如 Color Red 按钮的字体颜色更改为白色 似乎是默认字体颜色 但是当我单击另一个
  • 传递Physics2DShapeQueryParameters 层进行检查

    我目前正在为我的 2D 自上而下游戏开发一个构建系统 最后一步是检查是否有任何物体 例如树或玩家 阻碍了物品的放置 经过一些研究后 我发现使用Physics2DShapeQueryParameters 是正确的方法 我唯一的问题是我不知道如
  • 同一节点的碰撞检测和重叠检测? [第2部分]

    的延续上一个问题 https stackoverflow com questions 71608423 collision detection and overlapping detection in same node 71622366
  • 如何应用着色器并仅生成图像一次?

    我正在尝试将像素化着色器应用于我的纹理 并且我只需要将其应用一次 之后我可以一遍又一遍地重复使用我的着色器生成的图像作为纹理 而不必每次都进行计算 那么我如何拍摄一些图像 gt 应用着色器并在每次游戏加载时仅渲染它们一次 gt 并将它们用作
  • 关闭 Godot 中的游戏

    我正在使用 Godot 创建网页游戏 为了关闭游戏 我尝试使用 get tree quit 如果我在 IDE 上使用它 它就可以工作 当我在我的服务器上尝试它时 导出项目后 它不起作用 我确信导出设置没问题 我怎样才能关闭游戏 并且 如何添
  • Godot 3d 得到向前矢量

    我想知道是否有办法获取 godot 3d 中空间节点的前向向量 统一起来 这就是transform forward Godot 给了我一个旋转向量 但我不知道如何将其转换为方向向量 戈多版本的transform forward是什么 前进是

随机推荐

  • 是否将可重入锁设为静态并使其成为互斥锁?

    在 Brian Goetz 的 Java Concurrency in Practice 一书中 他的可重入锁示例的编程如下 Lock lock new ReentrantLock 但是 我很好奇是否将上面的代码更改为 private st
  • 在现有pdf中的itext中追加数据

    我正在与文本 pdf图书馆 我想在现有 pdf 的末尾添加内容 举例来说 现有的 pdf 例如 Original pdf 有 4 页 所以我想添加另一页 即第 5 页的内容你好世界我添加了内容并将其保存在同一个 pdf 中 即原件 pdf
  • 切换 WordPress 站点服务器

    我有 WordPress 博客 最近我改变了我的托管 所以我用 filezilla 从旧服务器下载了所有博客文件 在新服务器上 我创建了目录博客 并在该目录下上传了所有文件 我在新服务器上创建了与旧服务器完全相同的新数据库并上传了该数据库
  • Google Play 商店,无法再查看总安装量

    我在 Google Play 商店上有一些应用程序 并使用总安装数作为我的增长计划的一部分 然而 自 2018 年 7 月 16 日起 我无法再在控制台中看到 总安装数 它仅显示 活动安装 谷歌刚刚从游戏商店中删除了最重要的数字之一吗 我还
  • 如何在 Rails 3 的控制器中使用 mixin 或模块?

    我的控制器中有一些行为 我将其提取到模块中 以便更好地测试并在一些地方重复使用它 对此有两个问题 哪里是放置我的模块的好地方 它们需要运行才能可供控制器使用 所以我在想config initializers 目录 不过 这对我来说似乎有点可
  • TextArea 的 JavaFX CSS 样式不起作用

    我正在编写一个简单的 JavaFX 应用程序 但我无法使用某些 CSS 样式 问题是 fx background color财产给我的TextArea 这是相关的CSS text area fx font family Consolas f
  • “numeric_limits”未在此范围内声明,没有匹配的函数可用于调用“max()”

    我在家里用 xcode 在我的 mac 上编译了这段代码 没有出现任何问题 我在学校用 g 在 Linux 上编译它 并收到以下错误 numeric limits 不是 std 的成员 gt 标记之前的预期主要表达式 没有匹配的函数来调用
  • F#代码引用调用、性能和运行时要求

    这里有 4 个与 F 代码引用深度相关的问题 如何调用 F 代码引用 它的调用方式是否会比普通的旧式 F lambda 效率低 到什么程度 它是否需要对高级反射或代码发出功能的运行时支持 我的目标嵌入式平台通常不存在或禁止这种功能 引文只是
  • 需要SDK版本 >=2.16.0 <3.0.0,版本解析失败

    当前的 Dart SDK 版本是 2 14 4 由于trackkit要求SDK版本 gt 2 16 0 我的 pubspec yaml environment sdk gt 2 16 0 lt 3 0 0 运行 flutter master
  • 在 Three.js 中高效渲染数以万计的可变大小/颜色/位置的球体?

    这个问题是从我的上一个问题中提炼出来的 我发现使用积分会导致问题 https stackoverflow com a 60306638 4749956 https stackoverflow com a 60306638 4749956 为
  • 在android中创建矩形边框进度条

    我想创建一个进度条 应如上图所示 有人有一个想法可以做到这一点 就像一个按钮 但边框就像一个进度条 Thanks 我在这个的帮助下解决了 如何创建 Android 钻石进度条 https stackoverflow com question
  • 在后台线程中运行处理程序消息

    我想在后台线程中运行一些 Runnable 我想使用Handler 因为它方便延迟 我的意思是 handler post runnable delay Where runnable应该运行在背景线 是否可以创建这样的Handler 某处是否
  • 通过快捷键激活扩展

    是否可以通过快捷键打开 启动 google chrome 扩展 例如 我想分配一个快捷方式 比如说 CTRL E打开我的扩展并启动它 以前有人这样做过吗 UPDATE
  • 让 clangd 了解编译器给出的宏

    我有两个从同一源 客户端和服务器 构建的可执行文件 并且它们是使用编译选项构建的 D CLIENT 0 D SERVER 1对于服务器和 D CLIENT 1 D SERVER 0为客户 如果我做类似的事情 if CLIENT Client
  • 如何设置 Paint.setTextSize() 的单位

    是否可以更改单位Paint setTextSize 据我所知 它是像素 但我喜欢在 DIP 中设置文本大小以支持多屏幕 我知道这个主题很旧并且已经得到解答 但我还想建议这段代码 int MY DIP VALUE 5 5dp int pixe
  • 如何在 Android 上实现选项卡之间的滑动?

    Android 4 0 中针对选项卡的关键设计建议之一是允许刷卡 http developer android com design patterns swipe views html between tabs在适当的情况下在它们之间进行
  • 为什么“echo strcmp('60', '100');”在php输出5中?

    PHP 关于这个函数的文档有点稀疏 我读过这个函数比较 ASCII 值 所以 echo strcmp hello hello outputs 0 as expected strings are equal echo hr echo strc
  • MPAndroidChart,如何删除小数百分比并且不显示低于10的百分比?

    我在用MPAndroid图表 https github com PhilJay MPAndroidChart我有两个问题 MPAndroid 饼图 去除小数百分比 饼图上不显示小于 10 的值 但显示切片 只是对于低于 10 的百分比不应显
  • PayPal CreateRecurringPaymentsProfile 账单频率

    我已经设法让我的网站与 paypal billing CreateRecurringPaymentsProfile 一起使用 但是我对以下字段感到困惑 计费周期和计费频率 如果我将第一个设置为每月 第二个设置为 12 希望它每月向我的客户收
  • 在 Area2D 中覆盖 KinematicBody2D 运动?

    I m trying to create a windy area within which the player would be pushed continuously to the left lt 到目前为止 这就是我想出的Windy