检查当前精灵节点

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) 表示它正在向上移动的对象。这就是原因。

以上是关于检查当前精灵节点的主要内容,如果未能解决你的问题,请参考以下文章

三精灵节点碰撞

将 Int 值分配给精灵节点

检查精灵是不是在移动

cc.sprite如何绘制图片

如何在精灵套件中旋转精灵节点?

iOS Swift SpriteKit:如何使子精灵节点的位置和动作与其父精灵节点相同?