【问题标题】:Swift: sprite collision detection without making physics bodies?斯威夫特:精灵碰撞检测不制作物理体?
【发布时间】:2015-04-07 02:03:35
【问题描述】:

好的,所以我对 sprite kit 还很陌生,我正在使用 Swift。我有 2 个精灵节点,saviorchicken1savior 有一个物理体,我是这样设置的:

var saviorTexture = SKTexture(imageNamed: "1.png")
saviorTexture.filteringMode = SKTextureFilteringMode.Nearest

savior = SKSpriteNode(texture: saviorTexture)
savior.setScale(0.2)
savior.position = CGPoint(x: self.frame.size.width * 0.5, y: self.frame.size.height * 0.2)
savior.physicsBody?.dynamic = true
savior.physicsBody?.allowsRotation = false
savior.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(savior.size.width, savior.size.height))

        self.addChild(savior)

chicken1 目前还没有物理体:

var chickenTexture = SKTexture(imageNamed: "block1")

        chicken1 = SKSpriteNode(texture: chickenTexture)
        chicken1.setScale(0.75)
        chicken1.position = CGPoint(x: self.size.width * 0.38, y: self.size.height * 1.2)
        self.addChild(chicken1)

我需要知道如何在这些对象之间进行碰撞检测(即如果 savior 和 chicken1 触摸,则执行此操作),最好不要将 chicken1 设为物理体。

当我将chicken1 设为物理实体时,它突然变得不稳定并四处移动其他对象。

如果没有办法在没有物理的情况下进行碰撞检测,我怎样才能使chicken1 成为不受任何影响而直接穿过其他物理体的物理体?

编辑**************

所以我关注了beginner swift sprite kit - node collision detection help (SKPhysicsContact) 并拥有:

  1. 把我的班级改成SKPhysicsContactDelegate

    类 GameScene:SKScene、SKPhysicsContactDelegate {

  2. 写如下:

        self.physicsWorld.contactDelegate = self
    
        savior.physicsBody?.categoryBitMask = saviorCategory
        savior.physicsBody?.contactTestBitMask = animalCategory
        savior.physicsBody?.collisionBitMask = 0
    
        chicken1.physicsBody?.categoryBitMask = animalCategory
        chicken1.physicsBody?.contactTestBitMask = saviorCategory
        chicken1.physicsBody?.collisionBitMask = 0
    
        func didBeginContact(contact: SKPhysicsContact) {
    
        var saviorPhysics: SKPhysicsBody
        var chicken1Physics: SKPhysicsBody
    
        if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask
        {
            saviorPhysics = contact.bodyA
            chicken1Physics = contact.bodyB
        }
        else {
            saviorPhysics = contact.bodyB
            chicken1Physics = contact.bodyA
        }
    
        if saviorPhysics.categoryBitMask == 0 && chicken1Physics.categoryBitMask == 1 {
            self.chicken1.removeFromParent()
        }
    
    }
    

我运行了它,没有错误,但它不起作用。

【问题讨论】:

    标签: swift sprite-kit collision-detection


    【解决方案1】:

    您可以使用categoryBitMask 执行此操作,并通过回复SKSceneContactDelegate 自行处理冲突。

    这样你就可以为不同的节点设置不同的类别,并随意处理不同类别之间的冲突。

    教程:

    http://seodoa.com/2014/04/01/skphysicsbody-react-to-contact-but-not-to-collide/

    【讨论】:

    • 我看过那个教程,但它是针对目标 C 的,所以我一直在关注这个链接,它为 Swift 修改了它:stackoverflow.com/questions/26270504/…
    • 它不起作用。 savior 跌入另一个我需要它碰撞的物理体,而 chicken1 在与 savior 接触时不会删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多