Нет обнаружения столкновений между узлами Sprite - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть 2 категории

enum ColliderType:UInt32 {
case bulletCategory = 1
case bossCategory = 2
} 

Я заставил свой класс использовать SKPhysicsContactDelegate и создал узел

class PlayScene: SKScene, SKPhysicsContactDelegate {

var charBullets :[SKSpriteNode] = [SKSpriteNode]()
var charBulletTexture = SKTexture(imageNamed: "Bullet1.png")
var boss = SKSpriteNode()
var bossTexture = SKTexture(imageNamed: "BossImage.png")

И установил physWorld.contactDelegate и создал узел в функции didMove (для просмотра: SKView)

override func didMove(to view: SKView) { 

physicsWorld.contactDelegate = self

boss.name = "boss"
boss = SKSpriteNode(texture: bossTexture)
boss.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 300, height: 300))
boss.physicsBody?.usesPreciseCollisionDetection = true
boss.physicsBody!.isDynamic = true
boss.physicsBody!.affectedByGravity = false
boss.size = CGSize(width: 300, height: 300)
boss.physicsBody!.categoryBitMask = ColliderType.bossCategory.rawValue
boss.physicsBody!.collisionBitMask = 0
boss.physicsBody!.contactTestBitMask = ColliderType.bulletCategory.rawValue
boss.position = CGPoint(x: 0, y: self.size.height/4)
addChild(boss)

}

Я создал еще один узел в функции touchesBegan

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

charBullet.name = "bullet"
charBullet.physicsBody = SKPhysicsBody(circleOfRadius: charBullet.size.width/64)
charBullet.physicsBody!.isDynamic = true
charBullet.physicsBody!.usesPreciseCollisionDetection = true
charBullet.physicsBody!.affectedByGravity = false
charBullet.physicsBody!.velocity = CGVector.init(dx: 0, dy: 450)
charBullet.physicsBody!.categoryBitMask = ColliderType.bulletCategory.rawValue
charBullet.physicsBody!.collisionBitMask = 0
charBullet.physicsBody!.contactTestBitMask = ColliderType.bossCategory.rawValue
charBullet.position = CGPoint(x: character.position.x, y: character.position.y + 100)
addChild(charBullet)
charBullets.append(charBullet)

}

Тогда у меня есть didBegin (_ contact: SKPhysicsContact), но он не вызывается, когда пуля и патрон сталкиваются

func didBegin(_ contact: SKPhysicsContact) {

    //not printed
    print("contact!")

    if(charBullets.count > 0) {
        var firstBody = SKPhysicsBody()
        var secondBody = SKPhysicsBody()

        if(contact.bodyA.node?.name == "bullet") {
            print("test1")
            firstBody = contact.bodyA
            secondBody = contact.bodyB
        } else {
            print("test2")
            firstBody = contact.bodyB
            secondBody = contact.bodyA
            print(secondBody)
        }

        if(firstBody.node?.name == "bullet") {
            print("bulletname")
        }

        if(firstBody.node?.name == "boss") {
            print("bossname")
        }

        if(secondBody.node?.name == "bullet") {
            print("bulletname2")
        }

        if(secondBody.node?.name == "boss") {
            print("bossname2")
        }

        if(firstBody.node?.name == "bullet" && secondBody.node?.name == "boss") {
                print("hit the boss!")
                charBullets[i].removeFromParent()
                bossHealth -= 1
                bossHealthLabel.text = "Boss Health \(bossHealth)"
            }
        }
    }
}

1 Ответ

0 голосов
/ 05 ноября 2018

Обновление: Я исправил это, изменив их physBodys ', чтобы использовать размер текстуры изображения в отличие от заданного значения, и установив их имена при создании узла с помощью

boss = SKSpriteNode(texture: bossTexture)
boss.name = "boss"
boss.physicsBody = SKPhysicsBody(texture: bossTexture, size: bossTexture.size())

и

let charBullet = SKSpriteNode(texture: charBulletTexture)
charBullet.name = "bullet"
charBullet.physicsBody = SKPhysicsBody(texture: charBulletTexture, size: charBulletTexture.size())
...