Как создать конфликт между узлом, который был жестко запрограммирован (в файле swift), и узлом, который был помещен в редактор сцены? - Спрайткит - PullRequest
0 голосов
/ 12 июля 2020

Мы пытаемся создать коллизию между игроком, физическое тело которого (CategoryBitMask, CollisionBitMask, ContactTestBitMask) было запрограммировано в файле swift, и противником, который был помещен в редактор сцены, и его физическим телом (CategoryBitMask = 2, CollisionBitMask = 4294967295 'по умолчанию', ContactBitMask = 1). Код, показанный ниже, показывает, что было протестировано, но не привело к столкновениям.

import SpriteKit
import GameplayKit

class ClassicLevelScene: SKScene, SKPhysicsContactDelegate {

    // Physics Bodies Setup
    let enemy:UInt32 = 2
    
    // Player Constant
    let player = SKSpriteNode(imageNamed: "car1")

    
    override func didMove(to view: SKView) {
        
        // Physics World
        physicsWorld.contactDelegate = self

   
        // Set up player
        player.position = CGPoint(x: 30, y: -245)
        player.zPosition = Layers.cars
        player.size = CGSize(width: 60, height: 80)
        player.name = "player"
        player.physicsBody = SKPhysicsBody(texture: player.texture!, size: CGSize(width: player.size.width, height: player.size.height))
        player.physicsBody?.allowsRotation = false
        player.physicsBody?.categoryBitMask = 1
        player.physicsBody?.collisionBitMask = 7
        player.physicsBody?.contactTestBitMask = 1
        addChild(player)
}


    func didBegin(_ contact: SKPhysicsContact) {
      /* Player touches anything, game over */
        let contactA:SKPhysicsBody = contact.bodyB
        let contactB:SKPhysicsBody = contact.bodyB
        if  contactA.categoryBitMask == 2  || contactB.categoryBitMask == 2 {
        // execute code to respond to object hitting ground
            minusHeart()
            spikeSparkExplosion()
        }
    }

1 Ответ

0 голосов
/ 12 июля 2020

Вероятно, у вас разные проблемы. Во-первых, это, вероятно, опечатка:

        let contactA:SKPhysicsBody = contact.bodyB  // you meant bodyA?
        let contactB:SKPhysicsBody = contact.bodyB

Во-вторых, вам не кажется, что вы слишком четко понимаете контакты и столкновения. Столкновения = объекты отскакивают друг от друга. Контакты = вы получаете уведомление, когда объекты касаются друг друга. Из кода кажется, что вы хотите последнее, а столкновения вам могут вообще не понадобиться. В любом случае у вас должны быть категории 1 и 2 для битовых масок категорий (эта часть выглядит нормально) и контактные битовые маски 2 и 1 (соответственно). То есть ваш игрок имеет категорию 1, и вы хотите знать, когда он касается чего-то в категории 2. Таким образом, битовая маска проверки контакта игрока должна быть 2 (у вас она установлена ​​в 1).

...