如何检测 Godot 中的碰撞?

2023-12-14

我有3个场景。一个名为“KinematicBody2D.tscn”的 KinematicBody2D 节点。该场景是一个玩家在屏幕上从左向右移动。我还有一个名为“mob.tscn”的场景,它是一个igidbody2d节点。这个场景只有精灵和一小段代码,使得生物一旦使用可见性通知器离开屏幕就会删除自己(我还关闭了遮罩方块,这样就不会有物理了)。最后,我有了主场景,其中包含玩家场景,并经常实例化生物场景,以在屏幕顶部生成生物。

我想检测生物何时接触玩家并给出输出

请非常仔细地解释一切,因为过去几天我一直在努力弄清楚,但我看过的大多数地方我都不明白该怎么做,当我复制代码时它不起作用。我想更清楚地举一些例子:

在哪里以及如何添加碰撞形状 2d 或 area2d 或沿着这些线的其他节点。

在哪里以及如何连接和编写代码

先感谢您


对于这个答案,我将首先解释碰撞层和掩模。然后继续检测碰撞。然后过滤身体和通讯。最后我会提到一些关于光线投射和区域的内容,以及其他查询。不,你不需要知道所有这些,但你要求“一切都经过深思熟虑”。

虽然问题是关于 2D 的,但对于 3D 来说,只要您使用节点的 3D 版本,情况就基本相同。我会提到它的不同之处。请注意,为了以防万一,请注意 3D 对象不能与 2D 对象发生碰撞。

如果我说Class(2D/3D),我的意思是我所说的适用于两者Class and Class2D.

您还会发现我所说的“运动学/角色”指的是 Godot 3 中的运动体,或 Godot 4 中的角色体。我将指定何时特定于 Godot 3 或 Godot 4。

另外,由于我们谈论的是物理学,因此一般来说您将从事_physics_process(…)。当您需要在其他地方编写代码时,我会提到任何情况。


碰撞层和碰撞遮罩

首先,默认值collision_layer and collision_mask属性被设置为使得所有东西都互相碰撞。


否则,定义一些层可能会很有用。您可以转到“项目设置”->“常规”->“图层名称”->“2d 物理”(如果您在 3D 中工作,则为“3d 物理”),然后为其中的图层命名。

例如,您可能有这些层(取决于您正在做的游戏类型):

  • 玩家角色
  • 敌人角色
  • 玩家投射物
  • 敌方射弹
  • 收藏品
  • 地面和墙壁

类似的事情。然后你给每个物理对象它自己的collision_layer取决于它们是什么。

In the collision_mask您可以设置它们可以碰撞的对象※。有时想想他们不能碰撞的东西会更容易。例如,敌方射弹不应与其他敌方射弹碰撞(并告诉 Godot 不要检查这些碰撞可以帮助提高性能)。玩家角色可能不会与玩家射弹互动,敌方角色也不会与敌方射弹互动。同样,敌人角色可能不会与收藏品互动。所有东西都会与地面和墙壁碰撞。

※:实际上,一个对象会与它们在碰撞掩码中指定的任何对象以及在碰撞掩码中指定它们的任何对象发生碰撞。也就是说,碰撞是双向检查的。Godot 4.0 正在改变这种情况。

您总共有 32 个图层可供使用。对于某些人来说,这还不够,我们将不得不资源到其他过滤方式,我们稍后会看到。无论如何,尽量提高图层的效率。将它们用作广泛的类别。


如果您想设置collision_layer and collision_mask从代码中获取属性,您需要记住它们是二进制标志集。我已经解释过别处.


设置碰撞器

运动学/特性、静态和刚体,以及面积,需要CollisionShape(2D/3D) or CollisionPolygon(2D/3D)作为孩子。直接子节点。就物理学而言,这就是定义它们的大小和形状的因素。添加精灵或其他图形节点仅与图形有关,对物理没有影响。

如果你使用CollisionShape(2D/3D),请确保设置shape给你的CollisionShape(2D/3D)。一旦选择了所需的形状类型,编辑器将允许您直观地修改它,或者您可以在检查器面板中设置其参数。

同样,如果您使用CollisionPolygon(2D/3D),您需要编辑polygon(这是一个点数组)您的属性CollisionPolygon(2D/3D)。为此,编辑器将允许您绘制多边形,或者您可以修改检查器面板中每个点的坐标。

顺便说一下,您可以拥有多个这样的节点。也就是说,如果单个CollisionShape(2D/3D) or CollisionPolygon(2D/3D) 不足以指定对象的形状和大小,您可以添加更多。请注意,它们越简单,性能就越好。

如果您有图形节点(例如精灵),请查找选择后应出现在顶部(“视图”右侧)的工具菜单。在那里您可以找到生成CollisionShape(2D/3D) or CollisionPolygon(2D/3D)从你的图形节点。我发现这特别有用MeshInstance in 3D.

一个简单的典型设置可能如下所示(2D):

Godot 3

KinematicBody2D
├ CollisionShape2D
└ Sprite

Godot 4

CharacterBody2D
├ CollisionShape2D
└ Sprite2D

或者像这样(3D):

Godot 3

KinematicBody
├ CollisionShape
└ MeshInstance

Godot 4

CharacterBody3D
├ CollisionShape3D
└ MeshInstance3D

我想强调的是,将图形(精灵/网格)作为物理体的子项非常重要。我们将移动物理体,因为它们与物理相互作用或发生反应(因此它们与环境发生碰撞),并且我们希望图形随之移动。一般来说,孩子会跟着父母一起搬家。

我将讨论常见情况下使用哪种物理体别处.


检测碰撞

我们有两个物体发生碰撞。它们中的任何一个都可以检测到碰撞。


在运动体上检测

运动学/角色身体只能检测由于其自身运动而遇到的物体。也就是说,如果另一个物体击中它,它可能无法检测到它。

我们有两种方法,具体取决于您使用的方式move_and_collide(…) or move_and_slide(…). 我们还可以利用一个区域来进行更好的检测。我会回到这个话题。


move_and_collide(…)

当您使用移动运动/角色身体时move_and_collide(…),它返回一个KinematicCollision(2D/3D) 对象,告诉您它所碰撞的信息。您可以通过检查其碰撞的物体来获取它collider财产:

var collision := move_and_collide(direction * delta)
if collision != null:
    var body := collision.collider
    print("Collided with: ", body.name)

move_and_slide(…)

在更常见的情况下,您可以使用以下命令移动运动学/角色身体move_and_slide(…) (or move_and_slide_with_snap(…))。在这种情况下你应该打电话get_slide_collision(slide_idx),这也给了我们一个KinematicCollision(2D/3D) 目的。​这是一个例子:

Godot 3

velocity = move_and_slide(velocity)
for index in get_slide_count():
    ​var collision := get_slide_collision(index)
    var body := collision.collider
   ​ print("Collided with: ", body.name)

Godot 4

move_and_slide()
for index in get_slide_collision_count():
    ​var collision := get_slide_collision(index)
    var body := collision.get_collider()
   ​ print("Collided with: ", body.name)

在《戈多4》中move_and_slide不带任何参数。和velocity是的财产CharacterBody(2D/3D).

正如你所看到的,我们使用get_slide_count()在《戈多 3》中,以及get_slide_collision_count()在 Godot 4 中,计算出运动/角色身体在其运动过程中与多少个物体发生碰撞(包括滑动)。然后我们让每个人都利用get_slide_collision(slide_idx).


在刚体上检测

要对刚体碰撞做出反应,您需要设置其contact_monitor财产真实并增加其contacts_reported财产。这限制了刚体跟踪的碰撞次数。因此,即使您可能只对与运动学/角色身体的碰撞感兴趣,您也需要为墙壁和地板或当时可能发生的其他碰撞留出空间。

接下来您将使用"body_entered" and "body_exited"信号。您可以将它们连接到同一刚体中的脚本(有关如何执行此操作的信息,请参阅“关于连接信号”)。处理程序看起来像这样:

func _on_body_entered(body:Node):
    print(body, " entered")

func _on_body_exited(body:Node):
    print(body, " exited")

尽管他们被称为"body_entered" and "body_exited",您可以将它们视为接触的开始和结束。如果你只关心碰撞的瞬间,那么你想要"body_entered":

func _on_body_entered(body:Node):
    ​print("Collided with: ", body.name)

检测某个区域

区域节点是碰撞对象,但不是物理对象。它不会推动事物,事物也不会推动它。相反,他们穿过了。

他们默认监控碰撞(由monitoring属性),并且还有"body_entered" and "body_exited"表明您可以使用与刚体中相同的方式。您可以设置一个collision_mask来控制它。

此外,面积有"area_entered" and "area_exited"信号。也就是说,他们可以检测其他区域。它在哪里collision_layer and monitorable进来。

我会回到面积的使用。


Pickable

您还可以通过设置使用鼠标或定点设备拾取碰撞对象(静态、运动/角色、刚体或区域)input_pickable (or input_ray_pickable3D)到true.

然后连接"input_event"信号(或覆盖_input_event(…)方法)的身体或区域来找出玩家何时点击它。

这就是如何_input_event(…)对于 2D 节点,方法类似于:

Godot 3

func _input_event(viewport: Object, event: InputEvent, shape_idx: int) -> void:
    pass

Godot 4

func _input_event(viewport: Viewport, event: InputEvent, shape_idx: int) -> void:
    pass

这就是如何_input_event(…)3D 节点的方法类似于:

Godot 3

func _input_event(camera: Object, event: InputEvent, position: Vector3, normal: Vector3, shape_idx: int) -> void
    pass

Godot 4

func _input_event(camera: Camera3D, event: InputEvent, position: Vector3, normal: Vector3, shape_idx: int) -> void
    pass

不要将它们与_input.


关于连接信号

您可以从编辑器连接信号,在“节点”面板 ->“信号”选项卡中,您将找到所选节点的信号。从那里您可以将它们连接到同一场景上附加脚本的任何节点。因此,您应该预先在要将信号连接到的节点上附加一个脚本。

一旦你告诉 Godot 连接一个信号,它会要求你选择要将其连接到的节点,并允许你指定处理它的方法的名称(默认情况下会生成一个名称)。在“高级”下,您还可以添加要传递给该方法的额外参数,无论信号是否可以/将等待下一帧(“延迟”),以及一旦触发它是否会自行断开连接(“一次性”)。

通过按“连接”按钮,Godot 将相应地连接信号,如果目标节点的脚本不存在,则使用提供的名称创建一个方法。

还可以连接和断开代码中的信号。为此,请使用connect(…), disconnect(…) and is_connected(…)方法。例如,您可以从代码中实例化一个场景,然后使用connect(…)将信号连接到实例或从实例连接信号的方法。


过滤身体和通讯

我们已经介绍了第一个过滤碰撞的工具:碰撞层和遮罩。

现在,无论您通过什么方式检测碰撞,您都可以获得发生碰撞的节点。但你需要区分它们。

为此,我们通常使用三种类型的过滤器:

  • 按类别过滤。
  • 按组过滤。
  • 按属性过滤。

按类别过滤

要按类别过滤,我们可以使用is操作员。例如:

Godot 3

if body is KinematicBody2D:
    print("Collided with a KinematicBody2D")

Godot 4

if body is CharacterBody2D:
    print("Collided with a CharacterBody2D")

请记住,这也适用于用户定义的类。所以我们可以这样做:

if body is PlayerCharacter:
    print("Collided with a PlayerCharacter")

假设我们添加了一个const PlayerCharacter := preload("player_character.gd")在脚本中。或者我们添加了class_name PlayerCharacter在我们的玩家角色脚本中。


另一种方法是使用as操作员:

var player := body as PlayerCharacter
if player != null:
    print("Collided with a PlayerCharacter")

这也为我们提供了类型安全。然后我们可以轻松访问它的属性:

var player := body as PlayerCharacter
if player == null:
    return

print(player.some_custom_property)

按组过滤

节点也有节点组。您可以从编辑器的“节点”面板 ->“组”选项卡中设置它们。或者你可以通过代码来操作它们add_to_group(…), remove_from_group(…)。当然,我们可以检查一个对象是否在一个组中is_in_group(…):

if body.is_in_group("player"):
    print("Collided with a player")

按属性过滤

当然,您可以按节点的某些属性进行过滤。首先,它的名称是:

if body.name == "Player":
    print("Collided with a player")

或者您可以检查是否collision_layer有一面您感兴趣的旗帜:

if body.collision_layer & layer_flag != 0:
    print("Collided with a player")

从图层名称中获取标志并不简单,但也是可能的。我找到了一个例子别处.


沟通

一旦识别了对象,您可能想与它进行交互。有时添加一个方法是个好主意(func) 明确地传递给玩家角色,以供与其碰撞的其他对象调用。

例如,在您的玩家角色中:

func on_collision(body:Node) -> void:
    print("Collided with ", body.name)

在你的刚体中:

func _on_body_entered(body:Node):
    var player := body as PlayerCharacter
    if player == null:
        return

    player.on_collision(self)

您可能还对信号总线感兴趣,我已经对此进行了解释别处.


面积的用途

您可以通过添加区域节点作为子节点来改进运动/角色或静态主体的检测。赋予它与其父级相同的碰撞形状,并将其信号连接到它。这样你就可以得到"body_entered" and "body_exited"在您的运动或静态身体上。

设置看起来像这样:

Godot 3

KinematicBody2D
├ CollisionShape2D
├ Sprite
└ Area2D
  └ CollisionShape2D

Godot 4

CharacterBody2D
├ CollisionShape2D
├ Sprite2D
└ Area2D
  └ CollisionShape2D

信号从 Area2D 连接到 KinematicBody2D。


您可以为敌人添加一个区域并使其更大。这对于定义敌人可以检测到玩家的“视锥”很有用。您还可以将其与光线投射结合起来,以确保敌人具有视线。我推荐视频让敌人看到戈多的简单方法由 GDQuest 提供。

区域还允许您局部覆盖重力(由刚体使用)。为此,请使用“检查器”面板中“物理覆盖”下的属性。它们允许您拥有重力具有不同方向或强度的区域,甚至使重力点而不是方向。

使用可收集物体的区域也是一个好主意,这不应引起任何物理反应(无弹跳、推动等),但您仍然需要检测玩家何时与其碰撞。

当然,我认为区域的主要用途是:您可以在地图中定义区域,当玩家踩到该区域时,这些区域将触发某些事件(例如,玩家身后的门关闭)。


RayCast

检测碰撞RayCast(2D/3D),确保其enabled属性设置为true。您还可以指定collision_mask。并确保设置cast_to一些明智的事情。

光线投射将允许您查询段中的物理对象从其位置到位置cast_to指向(cast_to应用了光线投射变换的向量。 IE。cast_to是相对于光线投射的)。

注意:不,无限cast_to无法工作。这不仅仅是一个性能问题。问题是无限向量在变换时(尤其是旋转时)表现不佳。

您可以致电is_colliding()查明光线投射是否检测到某些东西。进而get_collider()为拿到它,为实现它。Godot 每个物理帧更新一次。

Example:

if $RayCast.is_colliding():
    print("Detected: ", $RayCast.get_collider)

如果您需要移动光线投射并在每个物理帧进行多次检测,则需要调用force_update_transform() and force_raycast_update() on it.


如果你想让敌人避免从平台上掉下来,你可以使用光线投射来检测前方是否有地面(example).


3D 游戏还可以使用光线投射来检测玩家正在查看的内容或玩家点击的内容。在 2D 中,您可能需要该方法intersect_point(…)我在下面提到。


物理查询

有时我们想向 Godot 物理引擎询问一些东西,没有任何碰撞或额外的节点(例如区域和光线投射)。

首先,move_and_collide(…) has a test_only参数,如果设置为true,将为您提供碰撞信息,但不会实际移动运动学/角色身体。

其次,你的RigidBody2D have a test_motion(…)方法将告诉您刚体是否会发生碰撞或未给出运动矢量。

但是,第三……我们不需要专门的人RayCast(2D/3D)。我们做得到:

  • 3D: get_world().direct_space_state.intersect_ray(start, end). See PhysicsDirectSpaceState(戈多 3)或PhysicsDirectSpaceState3D(戈多4)。
  • 2D: get_world_2D().direct_space_state.intersect_ray(start, end). See Physics2DDirectSpaceState(戈多 3)或PhysicsDirectSpaceState2D(戈多4)。

在戈多3中,2D版本direct_space_state还给你intersect_point(…)这将允许您检查特定点上的物理对象还有一个intersect_point_on_canvas(…),它允许您指定一个画布 ID,用于匹配CanvasLayer.

在 Godot 4 中,2D 和 3D 版本direct_space_state have intersect_point. And intersect_point_on_canvas已被删除。

以及您在中找到的其他方法direct_space_state是形状铸件。也就是说,它们不仅仅检查一个段(如光线投射)或一个点(如intersect_point(…)确实如此),但有一个形状。


教程和资源

看文章“教程和资源”关于 Godot 的官方文档。


关于调试的注意事项

虽然我上面所说的一切都是当出现问题时检查它们是否正确的事情。有一些调试工具和技术需要注意。

首先,您可以设置断点(使用 F9 或使用breakpoint关键字)并单步执行代码(F10 跳过,F11 进入)。

特别是对于调试物理,您需要从调试菜单中打开“可见碰撞形状”。

此外,当 Godot 运行时,您可以转到“场景”面板,然后选择“远程”选项卡,这将允许您查看和编辑当前运行的游戏中的节点。

您还可以使用“项目相机覆盖”选项(工具栏上的相机图标在游戏未运行时禁用)从编辑器控制正在运行的游戏的相机。

最后,您可能熟悉使用print作为调试工具。它允许您记录事件发生的时间和变量的值。视觉上的等价物是生成视觉对象(精灵或网格实例),这些对象向您显示触发事件的时间、地点和事件(可能使用颜色来传达额外信息)。由于 Godot 3.5 包括Label3D你也可以用它来写一些值。


复制代码的注意事项

您复制的代码不起作用的原因可能包括场景树的设置不同,或者某些信号未连接。然而,它也可能是空白。在 GDScript 中,空格很重要(您可以查看GDScript 基础知识)。您可能需要调整缩进级别才能使其与您的代码兼容。也不要混合使用制表符和空格,特别是在旧版本的 Godot 中。


关于解释问题的说明

所以你复制的代码不起作用。这意味着什么?它是做错了事还是什么也没做?是否有任何错误或警告? “它不起作用”并不是描述问题的好方法。

如果您有想要解决的问题(例如某些不起作用的代码),这些问答网站会更好地工作。

我想鼓励指出具体问题。可以作为此网站或类似网站上的新问题,也可以作为对给您带来麻烦的答案或教程的作者的评论。所以,是的,如果这里有什么不起作用,请在评论中告诉我,我会改进答案。但也要去打扰那些提供了你复制的不起作用的代码的人(即使那又是我)。给他们施加一些压力,让他们进步。

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

如何检测 Godot 中的碰撞? 的相关文章

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

    对 Godot 中节点设计的思考 单个节点的功能设计的想法 xff0c 体会 Godot 的设计思想 低耦合 设计单个节点可复用的节点时 xff0c 调用方法尽量只对当前节点可获取到的变量或方法进行使用 xff0c 比如我写一个可以控制 K
  • 【Godot 4.0】一个简单的匿名方法的使用lambda

    Godot 4 0 beta3 Godot 4 0 中添加了 lambda 表达式 xff0c 匿名方法等很多方便的特性 xff0c 这里我写个用于扫描目录下所有文件的功能 可以看到代码非常简洁 span class token keywo
  • Godot Engine:GDScript 4.X中语法的变化(2020年8月4日 更新)

    文章目录 4 X版 GDScript范例支持注解属性 xff08 Properties xff09 的定义格式await关键字代替yield加入super关键字去除了多级调用问题小结 4 X版 GDScript范例 支持注解 从4 x开始
  • Godot 4 源码分析 - 文件读入编码处理

    今天需要读入xml文件进行处理 结果读入一个带中文的文件时 出错了 当然程序还能运行 但编译器一直报错 而且XML解析也不正确 单步调试发现读入的内容出现乱码 具体逻辑 String FileAccess get as text bool
  • 关于在windows使用msys2 + mingw + gcc/g++ 编译godot的笔记

    关于在windows使用msys2 mingw gcc g 编译godot的笔记 编译参数 1 target release debug release debug 2 多线程参数 j数字 3 profile是自定义构建参数 可以启用或者禁
  • 合并多个精灵节点?

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

    I m trying to create a windy area within which the player would be pushed continuously to the left lt 到目前为止 这就是我想出的Windy
  • 如何在 GDScript 中实现结构?

    GDScript 中是否有相当于 C 结构 类的东西 例如 struct Player string Name int Level 戈多3 1 1gdscript不支持structs 但使用可以实现类似的结果classes dict or
  • Godot 监听来自同一场景的多个实例的信号

    我有以下场景 玩家 敌人 攻击 当攻击与敌人发生碰撞时 敌人会发出 onHit 信号 播放器监听该信号并反弹 这一切都运行良好 但现在如果我复制敌人 因此有多个敌人场景 我如何收听所有敌人的信号 有没有办法获取场景的所有实例并连接到它们的所
  • 安卓:应用程序未安装

    这里是新手 我用Godot游戏引擎制作了我的第一个游戏并成功导出到android 复制到我的手机上 它安装并运行良好 几个小时后 我做了一些更改并再次导出 再次复制了 apk 但现在当我尝试安装它时 它没有完成安装 我多次尝试更改导出设置
  • 如何在 Godot 中将字符串转换为枚举?

    使用 Godot 3 4 我的枚举设置为 enum STRENGTH DEXTERITY CONSTITUTION INTELLIGENCE WISDOM CHARISMA 我希望能够使字符串 STRENGTH 返回枚举值 0 我希望下面的
  • 如何在戈多中使刚体跳跃而不赋予其飞行能力

    我本来会使用运动体 但我想将现实生活中的物理添加到我的 2d 对象中 但似乎我可以通过多次按向上键来飞行 extends RigidBody2D var velocity Vector2 ZERO const GRAVITY 35 cons
  • Godot:调用外部方法

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

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

    我目前正在为我的 2D 自上而下游戏开发一个构建系统 最后一步是检查是否有任何物体 例如树或玩家 阻碍了物品的放置 经过一些研究后 我发现使用Physics2DShapeQueryParameters 是正确的方法 我唯一的问题是我不知道如
  • 如何应用着色器并仅生成图像一次?

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

    我正在使用 Godot 创建网页游戏 为了关闭游戏 我尝试使用 get tree quit 如果我在 IDE 上使用它 它就可以工作 当我在我的服务器上尝试它时 导出项目后 它不起作用 我确信导出设置没问题 我怎样才能关闭游戏 并且 如何添
  • 简单模式7公式/例子?

    我最近发现了利用 SNES 模式 7 的伪 3D 效果 并想尝试在 Godot 引擎中复制它 我尝试在网上查找 但所有内容要么以我无法理解的方式解释 要么以我不知道的编程语言解释 我还需要学习如何旋转该区域 并将精灵作为角色或敌人放入 但我
  • Godot 接管了 Xcode 中的 .scn 文件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 最近安装了Godot 现在 Xcode 将不会预览 scn 文件 我无法将类型更改回 SceneKit 因为它在下拉列表中不可用 尝试这个
  • Godot:检测 Area2D 内部的“鼠标按下”和 Area2D 外部的“鼠标向上”

    我想检测 Area2D 内部的鼠标单击 并按住 然后检测 Area2D 内部或外部的鼠标释放 这是我到目前为止所拥有的 extends Area2D PickArea func input event viewport event shap

随机推荐

  • 将函数应用于我的数据框中的所有列

    我无法将自定义函数应用到dataframe df pd DataFrame a related 1 related 0 related 1 b request 1 request 0 request 1 c offer 1 offer 0
  • 尝试制作带有条形图和差异线/值的动态 D3 图表

    我已询问以下有关创建显示差异值百分比和线条的条形图的帮助 以下是链接 如何使用 D3 js 在条形图中创建带有值的百分比差异箭头线 我创建此线程是为了寻求帮助 使同一图表更加动态 以下是我的尝试 以适合任何分辨率的方式使其动态化 即响应式
  • CMake target_include_directories(SYSTEM ...):SYSTEM 选项似乎不适用于针对 Xcode 的最新版本的 CMake

    我们正在构建一个依赖于Boost的应用程序 编译会产生很多警告 班级成员不能重新声明 在 Boost 标头 tag of hpp 中 为了避免生成垃圾邮件 我们决定将 Boost 标头包含为系统标头 target include direc
  • 交叉编译时缺少crt1和crti

    我正在尝试构建一个基于 GCC4 5 和 newlib 的交叉编译工具链 并启用 gold 和链接时间优化 GCC 编译正常 但没有生成 crt1 o 或 crti o 文件 因此 当我尝试使用编译器构建 Newlib 时 它会抱怨以下消息
  • PHP奇怪的按位运算符对字符串的影响

    更新 移至新问题 好吧 阅读 PHP 文档后 现在这些按位运算符就很清楚了 但是 嗯 这是什么 dump1 var dump two identical strings two identical strings mind the stri
  • 可以使用 htaccess 隐藏图像路径吗?

    我有这样的图像路径http blablablabla com Admin img blablabla jpg但我不想向用户显示此路径 我可以隐藏此 URLhtaccess 例如 用户将看到这样的路径http blablablabla com
  • NSLocalizedString 问题

    我有 IBAction about UIAlertView alert UIAlertView alloc initWithTitle NSLocalizedString About Title of AlertView message A
  • ostringstream 和复制构造函数的问题[重复]

    这个问题在这里已经有答案了 可能的重复 为什么不允许复制字符串流 如何在 C 中从一个字符串流对象复制到另一个字符串流对象 编译类 T 失败 Visual C 和 GCC 产生 iostreams 模板错误 这是代码 include
  • cellForRowAtIndexPath 从未在 UITableViewController 中调用

    使用 UITableViewController 永远不会通过以下方式调用 cellForRowAtIndexPath numberOfRowsInSection 是 import UIKit import EventKit class E
  • Xtext Bundle org.eclipse.emf.mwe.utils 无法解析

    我正在尝试学习使用 Xtext 当我使用市场或使用安装新软件在现有 Eclipse Neon 安装中安装 Xtext 时 我无法创建 Xtext 项目 请参阅无法在 Eclipse 中创建 Xtext 项目 然后我尝试使用 Eclipse
  • 如何使用GeoJson定义圆?

    我想在 Mongodb 中使用几何 但根据 geojson 不支持圆geojson org 我遇到了完全相同的问题 解决方案是创建一个大致近似于圆的多边形 想象一个具有 32 条以上边的多边形 我写了一个执行此操作的模块 你可以这样使用它
  • 在 Java 中验证日期

    我使用的是 NetBeans IDE 7 2 我有两个单独的课程newDateTest java and newDateMethod java 我目前正在使用我的方法类来验证我在测试类中使用的用户输入的日期 到目前为止 在我的测试课中 我有
  • 在第一个和最后一个网格项目之前和之后添加空格

    我的问题与此相同问题 但给定的解决方案不起作用 这里有一个codepen我正在处理的事情 我尝试了两种不同的方法 这两种方法几乎都是正确的 但不完全正确 1 申请 before and after第一个和最后一个网格项的伪类 不幸的是当我添
  • 在 HTML Canvas 中添加字母间距

    我读过很多 StackOverflow 答案和其他页面 讨论如何在 Canvas 中设置字母间距 更有用的之一是canvas 元素中的字母间距 正如另一个问题所说 我有一个要在其中绘制文本的画布元素 我想设置类似于 CSS letter s
  • 如何使用jquery触发anchor的默认点击事件?

    假设我的页面中有一个锚点 例如 a href header turn to header a 然后我还在我的页面中设置了一个按钮
  • 气氛响应、广播不调用 javascript onMessage 处理程序

    我正在与气氛合作 试图使用在我的 Eclipse 环境中本地运行的气氛 2 0 3 tomcat 7 0 42 来获得简单的基本实现 也从外部机器连接以查看与wireshark的流量 我遇到的问题是无论我使用什么传输 websocket s
  • 如何在 PHP 文件中获取 jQuery 变量值 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 询问代码的问题必须对所解决的问题表现出最低限度的了解 包括尝试的解决方案 为什么它们不起作用以及预期结果 也可以看看 Stack Overflow 问题清单 有关您编写的代码的问题必
  • 在带有 html 和正文显示的窗口中截断的页面:隐藏

    注 基于以下答案 aavrug and kukkuz 我重新组织了我的问题 以便它充分传达我想问的内容 我有一个页面布局 其中有一个顶部导航栏和一个侧面导航栏 它还具有显示数据的主要部分 因为我只想滚动主要部分 所以我设置了html bod
  • 更新对象数组中的对象属性的最有效方法

    我想知道更新存储在包含 10k 项的数组中的对象属性的最有效方法是什么 例如 如果我有一个包含这样的对象的数组 name Price 如果数组已包含该元素 我想替换或更类似于更新价格值 检查数组是否包含名称 x 的对象 如果是 则将价格替换
  • 如何检测 Godot 中的碰撞?

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