【问题标题】:Spritekit collision to platform while player is falling玩家下落时 Spritekit 与平台发生碰撞
【发布时间】:2015-09-25 06:43:47
【问题描述】:

我正在 spritekit 目标 c 的帮助下制作一个 spritekit 平台游戏。为此我使用了 spritekit 的物理引擎,除了我还没有找到一种方法来实现玩家与平台的 plaformer 风格碰撞之外,一切都很顺利。

我想要的是我的玩家应该在下落时与平台发生碰撞,而不是在跳跃时。如下图所示。此处玩家正在跳跃,因此他不能与平台发生碰撞

在这张图片中,玩家正在摔倒,所以他必须站在平台上。

我尝试在 didBeginContact 方法中消除平台与玩家的冲突,但这并没有帮助,因为我的平台不是动态类型。添加和移除碰撞对玩家有效,但对平台无效。

任何帮助将不胜感激。

编辑:这是一个例子,如果我在接触两个相邻平台时更改玩家的碰撞位掩码会发生什么。

玩家一旦与另一个平台发生反应就会跌倒。

编辑: aramusss 的第二个解决方案很好,但它确实给我带来了另一个问题。由于我的游戏中有敌人站在平台上,如果我移除平台的物理体,敌人就会倒在上面。

【问题讨论】:

  • 一种方法是检查玩家的velocity.dy...如果玩家正在下落,velocity.dy 将小于零。或者您可以检查玩家的位置并将其与平台位置进行比较,并相应地更改玩家的碰撞位掩码......但不确定所有这些是否适合您当前的设置......
  • 我尝试了这种技术,但是当有两个彼此相邻的碱基时会出现问题。改变玩家的碰撞位掩码是有问题的。我在想是否有任何方法可以更改相应平台的位掩码之类的。这样会好很多。

标签: ios objective-c sprite-kit collision-detection


【解决方案1】:

您可以将平台保存在数组中,然后检查玩家 Y 位置。如果player.position.y - (player.size.height/2) platform.position.y - (platform.size.height/2) 您禁用此平台的碰撞(意味着player 在平台下方,我们不希望它发生碰撞)。你应该使用:

// You should set collision bit mask to avoid collisioning between player and platforms, but not between other objects:
player.physicsBody.collisionBitMask = 1;
player.physicsBody.categoryBitMask = playerCategory; // An int constant, for example 101
player.physicsBody.contactTestBitMask = platformCategory; //Another constant, for example 102

platform.physicsBody.collisionBitMask = 1;
platform.physicsBody.categoryBitMask = platformCategory;
platform.physicsBody.contactTestBitMask = playerCategory;

设置这样的值将使两个物体不会发生碰撞,而更改它们会使它们再次发生碰撞。

编辑

另一种解决方案是使用NSTimer,它每 0.5 秒调用一个方法(例如),该方法将检查玩家附近是否有平台。如果有并且它在播放器后面,它将创建一个与平台大小相同的physicsBody。如果创建的身体不再靠近玩家,或者玩家在该平台下方,该功能将删除它。

【讨论】:

  • 您好,感谢您的回复。您所说的确实有效,但是这种技术存在一些问题。 1)我的平台不是动态类型的,所以改变它的碰撞位掩码不起作用。 2) 更改玩家的碰撞位掩码确实有效,但在某些情况下,玩家同时与两个平台接触,一个在他上方,一个在他下方,然后玩家不会对第二个平台做出反应并跌倒,因为两个平台属于同一类别.
  • 那么您可能只需要在没有physicsBody 的SKSpriteNode 和具有physicsBody 的另一个之间交换平台,具体取决于player.positionplatform.position
  • @aramusss 我该怎么做?在更新功能中?因为如果我移除物理体,那么基地将不会检测到接触。而且由于我有很多平台的大地图,所以你认为在更新功能中做这么多东西会好吗?
  • 每秒使用 NSTimer 或 0.5 秒,并且只加载那些靠近玩家的平台(而不是那些在 0.5 秒内无法到达的平台)。
  • 请检查我的答案编辑,如果它有助于将其标记为答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多