检查当前精灵节点
Posted
技术标签:
【中文标题】检查当前精灵节点【英文标题】:Checking current spritenode 【发布时间】:2020-02-28 19:41:14 【问题描述】:有这种情况:我有弹跳的红球和几个随机生成的平台。 万一接触到平台底部,球应穿过平台。在其他情况下,它将在平台顶部并且球应该反弹。我更改了 .collisionBitMask 和 .contactTestBitMask 参数,让玩家可以通过平台或在平台上弹跳。但我的代码仅适用于最后一个平台,您可以在screenshot 上看到。对于其他不工作的平台 - 球也从顶部通过。我有很多平台,不知道如何检查当前平台。
这是我的部分代码:
var platforms = [SKSpriteNode]()
....
extension GameScene: SKPhysicsContactDelegate
func didBegin(_ contact: SKPhysicsContact)
let floor = BitMaskCategory.floor
let player = BitMaskCategory.player
let platformCategory = BitMaskCategory.platform
let bodyA = contact.bodyA.categoryBitMask
let bodyB = contact.bodyB.categoryBitMask
if bodyA == player && bodyB == platformCategory || bodyA == platformCategory && bodyB == player
for platform in platforms
if self.player.position.y > platform.position.y
self.player.physicsBody?.collisionBitMask = floor | platformCategory
self.player.physicsBody?.contactTestBitMask = floor | platformCategory
else if self.player.position.y < platform.position.y
self.player.physicsBody?.collisionBitMask = floor
self.player.physicsBody?.contactTestBitMask = floor
func didEnd(_ contact: SKPhysicsContact)
let player = BitMaskCategory.player
let bar = BitMaskCategory.platform
let floor = BitMaskCategory.floor
let bodyA = contact.bodyA.categoryBitMask
let bodyB = contact.bodyB.categoryBitMask
if bodyA == bar && bodyB == player || bodyA == player && bodyB == bar
for platform in platforms
if self.player.position.y > platform.position.y
self.player.physicsBody?.collisionBitMask = floor
self.player.physicsBody?.contactTestBitMask = floor
所以,我不知道如何检查当前平台。如果我手动放置 3 个固定平台,一切正常:D
请帮忙,不知道如何实现这个任务。
【问题讨论】:
【参考方案1】:我有这种解决方案的方法(红色平台)
您可以在此处获取代码示例:https://github.com/Maetschl/SpriteKitExamples/tree/master/PlatformTest
这使用对象速度来获取方向和添加碰撞掩码
override func update(_ currentTime: TimeInterval)
player.physicsBody?.collisionBitMask = 0b0000 // Reset the mask
// For UP only Platform
if (player.physicsBody?.velocity.dy)! < CGFloat(0.0)
player.physicsBody?.collisionBitMask |= 0b0001 // The pipe | operator adds the mask by binary operations
// For Down only platforms
if (player.physicsBody?.velocity.dy)! > CGFloat(0.0)
player.physicsBody?.collisionBitMask |= 0b0010 // The pipe | operator adds the mask by binary operations
【讨论】:
工作完美,你非常喜欢!但我不明白为什么我们应该与 CGFloat(0.0) 进行比较?我知道 .velocity.dy 它是 CGFloat 值,但为什么我们与 0.0 进行比较?再次感谢您的帮助 dY 速度正 (> 0) 表示它正在向上移动的对象。这就是原因。以上是关于检查当前精灵节点的主要内容,如果未能解决你的问题,请参考以下文章