ios - 使节点动态仅适用于一个对象 Swift 和 Spritekit

标签 ios swift sprite-kit

我正在创建一款太空射击游戏,我想让我的一个节点仅在与特定节点(而不是所有节点)交互时才是动态的。本质上,我只希望节点在与一个指定节点交互时充当动态角色。我怎样才能做到这一点?

谢谢。

我知道这个问题很令人困惑,但如果有人有任何想法,那将非常有帮助!!

let Bullet = SKSpriteNode(imageNamed: "BulletGalaga.png")
            Bullet.zPosition = -5

            Bullet.position = CGPoint(x: ship.position.x, y: ship.position.y)
            Bullet.zRotation = ship.zRotation


            //let action = SKAction.moveTo(CGPointMake(400 * cos(Bullet.zRotation),(400 * -sin(Bullet.zRotation))), duration: 0.8)

            let action = SKAction.move(
                to: CGPoint(
                    x: 1200 * -cos(Bullet.zRotation - 1.57079633) + Bullet.position.x,
                    y: 1200 * -sin(Bullet.zRotation - 1.57079633) + Bullet.position.y
                ),
                duration: 2.4)

            //let action = SKAction.moveToY(self.size.height + 30, duration: 0.8)
            //let action = SKAction.moveTo(self.ship.size.height, duration: 0.8)
            let actionDone = SKAction.removeFromParent()
            Bullet.run(SKAction.sequence([action, actionDone]), withKey: "bulletAction")

            Bullet.physicsBody = SKPhysicsBody(rectangleOf: Bullet.size)
            Bullet.physicsBody?.affectedByGravity = false
            Bullet.physicsBody?.isDynamic = false
            self.addChild(Bullet)

我添加了这个:

    ship.physicsBody?.categoryBitMask = shipCategoryBitMask
    Bullet.physicsBody?.categoryBitMask = bulletCategoryBitMask
    enemy.physicsBody?.categoryBitMask = enemyCategoryBitMask
    enemyBullet.physicsBody?.categoryBitMask = enemyBulletCategoryBitMask

    ship.physicsBody?.collisionBitMask = enemyBulletCategoryBitMask
    Bullet.physicsBody?.collisionBitMask = enemyCategoryBitMask
    enemyBullet.physicsBody?.collisionBitMask = shipCategoryBitMask
    enemy.physicsBody?.collisionBitMask = bulletCategoryBitMask

最佳答案

一旦你设置了SpriteNode的物理体,你就可以使用collisionBitMask来指定它将与哪些其他SpriteNode发生碰撞。您需要首先设置每个节点的物理体的categoryBitMask。

let node1CategoryBitMask = 0x1 << 0
let node2CategoryBitMask = 0x1 << 1
let node3CategoryBitMask = 0x1 << 2

node1.physicsBody.categoryBitMask = node1CategoryBitMask
node2.physicsBody.categoryBitMask = node2CategoryBitMask
node3.physicsBody.categoryBitMask = node3CategoryBitMask

此时,三个 Sprite 已设置其类别位掩码。这就是物理体的标识。现在设置碰撞位掩码。

node1.collisionBitMask = node2CategoryBitMask
node2.collisionBitMask = node1CategoryBitMask | node3CategoryBitMask

这告诉node1与node2碰撞,但不与node3碰撞。 Node2将与node1和node3发生碰撞。

希望这有帮助。

关于ios - 使节点动态仅适用于一个对象 Swift 和 Spritekit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38016479/

相关文章:

ios - 无法从静态库和包中加载 subview 类和 xib

ios - 新的 iPad 布局,但保持 iPhone 大小类布局相同

ios - 如何以编程方式获取 iphone 的 MAC 地址

swift - swift 中的 POST 请求错误

ios - swift SKSpriteNode : Detect Tap/DoubleTap/LongPress

ios - 如何在 CATransform3D 中正确设置透视

ios - 无法到达 objectForKey - [字符串 : AnyObject] as dictionary

ios - Moya 请求未针对一个提供者启动,但适用于另一提供者

swift - 按下和释放时动画按钮

ios - 检测 SKSpriteNode 何时完全低于另一个 SKSpriteNode