Узлы Spritekit не сталкиваются, хотя маска контакта настроена - PullRequest
0 голосов
/ 06 ноября 2018

В приведенном ниже коде у меня есть пара узлов, но сейчас я просто пытаюсь обнаружить столкновения между игроком и вражеской пулей (я называю это "BBullet"), но под функцией, которая обнаруживает столкновения, ничего не появляется .

import SpriteKit
import GameplayKit

class GameScene: SKScene, SKPhysicsContactDelegate {

    var player = SKSpriteNode()

    var firebutton = SKShapeNode()
    var bullet = SKSpriteNode()

    enum CategoryMask : UInt32 {
        case player = 1
        case GBullet = 2
        case BBullet = 3
        case enemyships = 4
    }

    override func didMove(to view: SKView) {
        player = SKSpriteNode(color: .red, size: CGSize(width: 150, height: 150))
        player.physicsBody?.affectedByGravity = false
        player.position = CGPoint(x: 100, y: 375)
        player.physicsBody?.isDynamic = true
        player.physicsBody?.restitution = 1
        player.physicsBody?.categoryBitMask = CategoryMask.player.rawValue
        player.physicsBody?.collisionBitMask = CategoryMask.BBullet.rawValue
        player.physicsBody?.contactTestBitMask = CategoryMask.BBullet.rawValue
        player.name = "Player"

        addChild(player)
        firebutton = SKShapeNode(circleOfRadius: 75)
        firebutton.position = CGPoint(x: 1000, y: 150)
        firebutton.alpha = 0.7
        firebutton.physicsBody?.isDynamic = false
        firebutton.physicsBody?.affectedByGravity = false
        firebutton.physicsBody?.categoryBitMask = 0
        firebutton.physicsBody?.collisionBitMask = 100
        firebutton.physicsBody?.contactTestBitMask = 100
        firebutton.physicsBody?.contactTestBitMask = 0
        firebutton.physicsBody?.collisionBitMask = 0
        addChild(firebutton)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches{
            spawnenemybullets()
            let position = touch.location(in: self)
            if firebutton.contains(position){
                bullet = SKSpriteNode(color: .orange, size: CGSize(width: 20, height: 10))
                bullet.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 20, height: 10))
                bullet.physicsBody?.affectedByGravity = false
                bullet.physicsBody?.isDynamic = true
                bullet.physicsBody?.allowsRotation = false
                bullet.position.x = player.position.x + 90
                bullet.position.y = player.position.y
                bullet.physicsBody?.mass = 0.01
                bullet.physicsBody?.categoryBitMask = CategoryMask.GBullet.rawValue
                bullet.physicsBody?.collisionBitMask = CategoryMask.enemyships.rawValue
                bullet.physicsBody?.contactTestBitMask = CategoryMask.enemyships.rawValue
                bullet.name = "FBullet"
                addChild(bullet)
                bullet.physicsBody?.applyForce(CGVector(dx: 400, dy: 0))

            }
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let position = touch.location(in: self)

             if player.contains(position) {

                if position.y > 85 && position.y < 665 && position.x > 85 && position.x < 640{
                    player.position = position
                }
            }
        }
    }

    func spawnenemybullets () {
        bullet = SKSpriteNode(color: .red, size: CGSize(width: 20, height: 10))
        bullet.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 20, height: 10))
        bullet.physicsBody?.affectedByGravity = false
        bullet.physicsBody?.isDynamic = true
        bullet.physicsBody?.allowsRotation = false
        bullet.position.x = 1300
        bullet.position.y = 200
        bullet.physicsBody?.mass = 0.01
        bullet.physicsBody?.categoryBitMask = CategoryMask.BBullet.rawValue
        bullet.physicsBody?.collisionBitMask = CategoryMask.player.rawValue
        bullet.physicsBody?.contactTestBitMask = CategoryMask.player.rawValue
        bullet.name = "EnemyBullet"
        addChild(bullet)
        bullet.physicsBody?.applyForce(CGVector(dx: -400, dy: 0))
    }

    func didBegin(_ contact: SKPhysicsContact) {
        print("Contact Happened")
    }

}

Оба спрайта имеют свои контактные маски, но по какой-то причине они не сталкиваются. Когда я тестирую проект на своем телефоне, они просто проходят сквозь друг друга. Как мне заставить их связаться друг с другом?

1 Ответ

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

Вы не создали physicsBody для player (или fireButton).

Вам также необходимо самостоятельно связаться с делегатом по физике:

class GameScene: SKScene, SKPhysicsContactDelegate { physicsWorld.contactDelegate = self

Редактировать: мое пошаговое руководство по столкновениям и контактам: https://stackoverflow.com/a/51041474/1430420

Руководство по битовым маскам при столкновении и при контакте: https://stackoverflow.com/a/40596890/1430420

Управление битовыми масками для включения и выключения отдельных столкновений и контактов. https://stackoverflow.com/a/46495864/1430420

...