玩家下降时Spritekit与平台的冲突

时间:2015-09-25 06:43:47

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

我在spritekit objective c的帮助下制作了一个spritekit平台游戏。我正在使用spritekit的物理引擎,除了我还没有找到一种方法来实现玩家与平台的平台风格碰撞之外,每件事情都进展顺利。

我想要的是我的球员应该在他摔倒时与平台相撞而不是在跳跃时。如下图所示。玩家在这里跳跃,所以他不能与平台发生碰撞

并且在此图像中,玩家正在摔倒,所以他必须站在平台上。 enter image description here

我尝试在didBeginContact方法中删除平台与播放器的冲突,但这并没有帮助,因为我的平台不是动态类型。添加和删​​除碰撞确实适用于播放器,但不适用于平台。

非常感谢任何帮助。

编辑:这是一个示例,如果我在与两个相邻平台接触时更改了播放器的碰撞位掩码,将会发生什么。

一旦玩家对另一个平台做出反应,玩家就会失败。

编辑: aramusss的第二个解决方案很好,但它确实为我创造了一个问题。由于我的游戏中的敌人站在平台上,如果我移除平台的物理身体,敌人将会站在它上面。

1 个答案:

答案 0 :(得分: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。如果创建的身体不再靠近播放器,或者播放器位于此平台下方,则此功能将删除它。