如何在戈多中使刚体跳跃而不赋予其飞行能力

2024-02-11

我本来会使用运动体,但我想将现实生活中的物理添加到我的 2d 对象中,但似乎我可以通过多次按向上键来飞行

extends RigidBody2D

var velocity = Vector2.ZERO

const GRAVITY = 35
const SPEED = 1000
const JUMPFORCE = -900

func _process(delta):
    if Input.is_action_just_pressed("ui_right"):
        apply_central_impulse(Vector2(1000,0))
    if Input.is_action_just_pressed("ui_left"):
        apply_central_impulse(Vector2(-1000,0))
    if Input.is_action_just_released("ui_up"):
        apply_central_impulse(Vector2(0,-1000))


With test_motion

我不建议用RigidBody2D碰撞,因为并非每次碰撞都意味着它在地面上(例如可能撞到墙壁或天花板)。

但是,还有另一种方法:您可以使用test_motion https://docs.godotengine.org/en/stable/classes/class_rigidbody2d.html#class-rigidbody2d-method-test-motion。如果运动会导致碰撞(当然,没有实际移动),则返回 true。

So use test_motion向下,如果检测到碰撞,则意味着RigidBody2D位于地面上:

if Input.is_action_just_released("ui_up") and self.test_motion(Vector2(0, 1), false):
    apply_central_impulse(Vector2(0,-1000))

With RayCast2D

另一个简单的设置是使用RayCast2D反而。将其定位为从底部向下延伸CollisionShape2D or CollisionPolygon2D of the RigidBody2D。确保RayCast2D已启用。然后您可以检查是否RayCast2D正在碰撞来决定是否RigidBody2D可以跳跃:

if Input.is_action_just_released("ui_up") and $RayCast2D.is_colliding():
    apply_central_impulse(Vector2(0,-1000))

考虑使用上述方法,如果RayCast2D未能检测到某些东西,RigidBody2D将无法跳跃。例如,如果RayCast2D是居中的,但是RigidBody2D仅部分位于地面上,因此RayCast2D什么也没击中。


With Area2D

另一种选择是使用Area2D代替RayCast2D。其优点是拥有自己的CollisionShape2D or CollisionPolygon2D。您需要统计进入或存在的尸体数量Area2D:

var on_ground := 0

func _on_Area2D_body_entered(body: Node) -> void:
    on_ground += 1

func _on_Area2D_body_exited(body: Node) -> void:
    on_ground -= 1

当然,在你的检查中使用它来跳转:

if Input.is_action_just_released("ui_up") and on_ground > 0:
    apply_central_impulse(Vector2(0,-1000))

最后我提醒你,你有碰撞层和碰撞蒙版。用一个RayCast2D or an Area2D允许你设置一个与之前的不同的掩码RigidBody2D用途。这是指定并非所有事物的一种方式RigidBody2D与物体碰撞,它可以从中跳出。

I find Area2D更加可靠和多功能。然而,设置工作量更大。

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

如何在戈多中使刚体跳跃而不赋予其飞行能力 的相关文章

  • .FillRectangle 不绘制任何内容

    我无法弄清楚为什么 FillRectangle 不适合我 此外 由于它没有抛出任何异常 我不知道为什么会这样 所以我在这里需要一些帮助 受影响的代码部分是这样的 try using FileStream fileStream File Op
  • 如何获取另一个场景godot中的节点?

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

    使用 Godot 3 4 我的枚举设置为 enum STRENGTH DEXTERITY CONSTITUTION INTELLIGENCE WISDOM CHARISMA 我希望能够使字符串 STRENGTH 返回枚举值 0 我希望下面的
  • 使用 Python 绘制 2D 直方图

    我正在尝试使用这些代码在 Python 中绘制 2D 直方图 from math import import pylab as p import matplotlib pyplot as plt import numpy as np x p
  • JS:给定二维数组中的一个点和一个距离,哪些坐标是可移动的?

    给定一个任意大小的二维数组 如下所示 var board 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  • 重新打开 LibGdx Android APP 无法正确绘制屏幕

    I have created an android App using the LibGdx framework Whenever I flash it to my android device it works perfectly But
  • 检测数组中作为复杂多边形顶点的一组点是否按顺时针或逆时针顺序定义?

    编辑 我更新了program http colekito com ProgrammingProjects Science 20Fair 有了答案 效果很好 我正在做一个program http colekito com Programmin
  • 获取GeneralPath的有序顶点

    如何获取 GeneralPath 对象的顶点 看起来这应该是可能的 因为路径是由点 lineTo curveTo 等 构造的 我正在尝试创建点数据的 double x y 坐标数组 您可以从以下网站取回积分PathIterator http
  • 动态壁纸是否带有游戏引擎?

    我想开发一个动态壁纸 经过一番研究后 我得出结论 有两种选择可以创建一个 直接 就像 Android Developers 上所说的那样 http developer android com resources articles live
  • 确定形成四边形的顶点顺序

    假设我在 2D 空间中有 4 个顶点 有谁知道一种有效的算法可以给我对应于简单四边形的顶点排序 也就是说 它将标记顶点1 2 3 4这样如果我跟随1 2 2 3 3 4我将绘制一个简单的 即不相交的 四边形 只需提供我可以谷歌搜索的标准算法
  • 在 OpenGL-ES 2.0 中渲染多个 2D 图像

    我是 OpenGL 新手 正在尝试学习 ES 2 0 首先 我正在开发一款纸牌游戏 需要渲染多个纸牌图像 我跟着这个http www learnopengles com android lesson four introducing bas
  • Unity 2D Trail 渲染器碰撞

    我制作 2D unity 游戏 但我面临着我的游戏所依赖的一个主要问题 我将一个轨迹渲染器组件附加到我的播放器上 我需要的是使渲染器成为一个碰撞器 充当网格碰撞器我只是不知道是否可以使碰撞器呈现 2D 轨迹渲染器的形状 我在谷歌上搜索过 但
  • 计算 2D 向量叉积

    来自维基百科 叉积是a中两个向量的二元运算三维欧几里得空间产生另一个向量 该向量垂直于包含两个输入向量的平面 鉴于该定义仅定义为三个 或七 一和零 https en wikipedia org wiki Seven dimensional
  • 我怎样才能同时捕获 2 个以上的按键?

    最近我对创建 JS 游戏产生了兴趣 不是我有经验但我感兴趣的领域 我知道有几个 JS 游戏引擎 但我并不是真的想创建一个游戏 相反 我很好奇事物是如何工作的 我如何创建一个 我有几个问题 有人建议我在哪里可以阅读它吗 先决条件 需要什么知识
  • 2 个 2D 向量的叉积

    任何人都可以提供一个返回叉积的函数的示例TWO二维向量 我正在尝试实施这个算法 http www blackpawn com texts pointinpoly default html C 代码会很棒 谢谢 EDIT 找到了另一种适用于
  • 在cocos2D游戏环境中应用缩放效果?

    我正在开发一款游戏cocos2D游戏引擎并加载所有sprites当它加载关卡时 现在因为一些sprites 障碍物 高于 320 像素 因此看起来很难检查出来 所以为了方便起见我想申请ZOOM IN and ZOOM out效果 一次最小化
  • corona sdk中拖动物理对象

    我尝试在场景中拖动重力 0 0 的动态主体 我有一个主体类型为动态的正方形 以及一个主体类型为静态的图像 但是当将方形拖动到图像上时 它会产生一点力 但是可以超出图像并传递到另一边 如图所示 这是我拖动正方形的代码 local functi
  • 查找椭圆或贝塞尔曲线上的等距点

    目前我正在编写 JavaScript 代码 将对象放置在屏幕上的椭圆上 我试图找到能够解决这个问题之一的算法 椭圆将是完美的 但如果它太昂贵 贝塞尔曲线也可以 抱歉 但不幸的是我的数学不允许我使用我找到的答案 https mathoverf
  • 如何用 Java 为 2D 游戏构建 Tiled 地图?

    不知道如何解决这个问题 基本上 我想要 400x400 窗口的 Pixel gt Tile 表示 屏幕上的每个坐标 例如120x300应该是图块的一部分 我最小的精灵是 4 个像素 所以我们可以说 1 个图块 4 个像素 玩家和敌人精灵都是
  • 如何解码 U.P.S.来自 UPS MaxiCode 条形码的信息?

    我最近购买了一个二维条形码阅读器 扫描 U P S 时条形码 我得到了大约一半我想要的信息 其中大约一半看起来以某种方式加密了 我听说有一个 UPS DLL 示例 粗体的所有内容似乎都已加密 而非粗体文本包含有价值的合法数据 gt 0196

随机推荐