问题标签 [skphysicscontact]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
103 浏览

swift - 另一个节点上的节点,都具有物理体,只想检测最顶级的物理体 - SpriteKit / Swift

在 Swift 和 SprieKit 中创建游戏。

我有 2 个节点,一个 BridgeNode 和 WaterNode。一个在另一个之上。

两者都有物理实体来检测玩家何时在水中的桥上。两个节点作为场景的子节点独立添加。

当玩家节点跳到桥上时,DidBegin 检测到与水和桥节点的接触。我只希望它检测到 Bridge 节点,因为玩家安全地在 Bridge 上,或者如果玩家在水中。

控制台总是以随机顺序打印两个打印语句。

希望有人可以帮助我检测其中一个。

0 投票
2 回答
50 浏览

sprite-kit - sprite-kit 中的成功跳转检测

我的游戏玩法是一只动物跳过洞。如果它撞到一个洞,它就会失去生命。但是,如果它成功完成三个跳跃,它就会解锁一个成就。

如何检测成功的跳跃?我有使用 SKPhysics​Contact 和 SKPhysicsBody 检测失败跳跃的逻辑。

动物 ========>洞 1 ========>洞 2 ==========>洞 3======[解锁成就]==== ==========>

我可以使用 touches begin 和 touches end 但它会变得复杂,因为它可以做其他假跳(不是越洞)。

0 投票
2 回答
136 浏览

swift - 有没有办法编写 SKPhysicsContactDelegate 函数的测试?

我可以模拟SKPhysicsContact对象以输入-(void)didEndContact:(SKPhysicsContact *)contact方法吗?或者还有其他可以在这里利用的技术吗?

0 投票
2 回答
189 浏览

swift - SKPhysicsContact 身体,不能改变属性

我有一个 SpriteKit 物理触点在didBegin(contact:). 我为想要移出屏幕的 Dot 对象的实例抓取物理体,但是当我尝试像这样改变它的位置时,什么也没有发生:

第一种方法

但是,如果我改为调用 Dot 类中的方法,并传入该主体,则位置将正确设置:

第二种方法

这是点类:

谁能解释为什么第二种方法中的位置变化有效但在我的第一种方法中不起作用?

这是Github 上项目的链接

0 投票
1 回答
121 浏览

swift - 重置 didBeginContact() ... 或者场景认为玩家死亡时正在联系什么?

我正在处理一个我一直在努力修复的错误,

我的游戏包含一个与平台部分交互的玩家精灵……一个标准的平台游戏。我通过将薄物理块连接到更大的平台物理主体(大白块)来设置我的游戏

每个细块代表:

  • A面 - 绿色
  • 左墙 - 黄色
  • 右墙 - 红色

我可以配置使用自定义类打开或关闭这些。

  • 蓝色的水滴是杀死玩家的死区

在此处输入图像描述


错误描述


所以我现在正在处理一个有趣的错误。它发生的方式是如果我的玩家精灵击中了一个 deadZone 物理体(杀死一个角色的区域)。

通过 revive() 函数复活角色后会出现错误。似乎 didBeginContact 被调用并相信我的角色与墙壁接触。即使看不到墙壁物理体。

仅当我在角色复活后开始快速按下跳跃时才会出现该错误。在按下跳转之前等待一小段时间不会发生错误。

联系 deadZone 时,我的 GameScene 类中的 didBeginContact() 代码如下所示

请注意该功能不完整...(缺少诸如 Player - Wall Left (见下文)、 Player - Wall Right 之类的内容)

我知道 didBeginContact 被调用是因为调试控制台发出了我在 Wall - Player 部分中编写的打印语句,当错误发生时。它打印"contact with wall didBegin",当您接触左墙或右墙时打印。

我的玩家回到起点的方式是通过调用 killPlayer() 将他移回重生点的代码,即关卡起点处的不可见精灵,该函数在 GameScene 类中调用包含此代码的函数:

我可以通过简单地增加等待时间来防止错误发生,例如

但是,这会导致游戏的流畅性降低。

我不确定到底是什么问题?

如果我从一个关卡中移除所有墙体物理体,我也可以防止错误发生,只有表面物理体......

我的猜测是它与 SpriteKit 的渲染循环有关,首先调用 didEvaluateActions... 在调用 didStimulatePhysics ...

所以 didEvaluateActions 将 Player sprite 移回起点。也许玩家在移回墙壁时碰到了墙壁?

也许 didStimulatePhysics 还没有完全赶上?也许循环需要再次运行才能识别出玩家的物理身体已经移动?

我有点迷路了,一直试图修复它一段时间。


这是一个演示该错误的视频。 YouTube 链接


视频中的第一级

视频显示该错误不会发生在没有墙壁物理实体的关卡上。


第二级

然后视频显示它发生在具有墙壁物理体的下一个级别。

  1. 第一次死亡后不会出现错误
  2. 第二次死亡后出现错误
  3. 第三次死亡后出现错误
  4. 第四次死亡后出现错误
  5. 第五次死亡后出现错误
  6. 第六次死亡后出现错误

ETC


什么没有奏效


1. 与 deadZone 接触时将 isDynamic 设置为 false。

然后在 Player 类中使用 revive() 将其更改为 true


2. 通过在 deadZone 接触上将其设置为 nil 来移除物理体,然后在 revive() 上重新创建它。奇怪的是,在测试过程中,我可以直观地看到在 deadZone 接触上移除的物理矩形......然后重新出现......它仍然没有解决问题。

3. 尝试重置玩家的contactTestMask。通过在deadZone 联系上将其设置为零,然后在revive() 上将其重置为默认值。

例如在 DeadZone 联系人

例如在 revive()

4. 为每个 Player 使用 return 语句 - 如果 playerIsDead,___ 联系人退出范围。

例如在左墙接触

5.直接设置玩家位置,而不是在玩家死亡时使用SKAction.move。


是什么降低了错误的频率


  1. 我在 Player 类中尝试了一个“重置物理函数”......从 Player 类中的 revive() 函数调用。

同时仍然在DeadZone 联系人上设置somePlayer.physicsBody = nil

这实际上使错误......以低得多的频率发生......它几乎消除了它......但它也有一些奇怪的副作用,比如玩家在产卵后经常向右移动一点。

尽管添加了这些代码,但在我最新的视频中它只出现了 3 倍......

  1. 在视频中的 13 秒标记处死亡后
  2. 在视频中的 16 秒标记处死亡后
  3. 在视频中的 1 分 13 秒处死亡后

这是此尝试的视频。 YouTube 链接


有人对修复有任何想法吗?

我猜测某种方式可以“重置”或“刷新”SpriteKit 认为正在被联系的内容……但是这种情况发生的方式和原因也让我感到困扰。

0 投票
0 回答
137 浏览

ios - 接触测试位掩码不起作用

我已经创建了 2 个节点,但是当他们联系没有任何反应时,代码如下:

这两个节点被实现到视图中,但是当他们联系时我没有得到“某物”。

我不知道接触测试位掩码有什么问题。

0 投票
1 回答
29 浏览

swift3 - SKSpritNode 没有与其他机构接触?

我想创建一个具有多个接触选项的游戏,但是当精灵不与任何其他身体接触时,我还需要找到条件。

我不想被告知 sprite 正在失去联系,就像 didEnd 函数一样。

我需要精灵完全没有联系的信息......

怎么做?

谢谢

0 投票
2 回答
70 浏览

ios - SKPhysicsContact 崩溃的扩展

我正在用 SpriteKit 创建一个游戏,它在两个身体之间发生碰撞。设置好主体后,我实现了didBegin(_contact:)如下所示的方法:

它工作得很好。

后来,在检查此方法的文档时,我发现了以下内容:

接触参数中描述的两个物理体不是以保证的顺序传递的

所以为了安全起见,我SKPhysicsContact用一个函数扩展了这个类,在两个主体之间交换 categoryBitMask,如下所示:

问题是当函数被调用时,应用程序崩溃,我收到以下错误:

2017-07-18 13:44:18.548 iSnake Retro[17606:735367]-[PKPhysicsContact bodyAreFromCategories:and:]:无法识别的选择器发送到实例 0x60000028b950

2017-07-18 13:44:18.563 iSnake Retro[17606:735367] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[PKPhysicsContact bodyAreFromCategories:and:]:无法识别的选择器发送到实例 0x60000028b950”

0 投票
1 回答
220 浏览

ios - 如何在 Swift 中检测两个 SKShapeNode 的碰撞而不影响它们的物理特性?

日志:这里

如果这是一个愚蠢,可怕的问题,请原谅,但我一直坚持下去,无法在任何地方找到答案。我有几个节点:leftMaze、rightMaze 和 player。我试图检测玩家何时与其他两个节点中的任何一个发生碰撞。

请记住,我想实际应用于两个迷宫节点的唯一物理是重力。除此之外,我只希望它们通过播放器。另外,请随时对我的代码提出所有建设性的批评,因为我是新手,想要变得更好!非常感谢大家!

0 投票
1 回答
145 浏览

swift3 - Swift 3 SpriteKit 检测联系人

我是 swift 新手,我一直在尝试弄清楚如何使用位掩码和 didBegin(_contact: SKPhysicsContact) 来检测两艘宇宙飞船何时相互接触。我似乎无法弄清楚如何。

这是我到目前为止所拥有的:

提前致谢!