Связаться с Bitmask - PullRequest
       6

Связаться с Bitmask

0 голосов
/ 12 декабря 2018

Heyo!Я пытаюсь перезапустить игру, когда мяч коснулся стены (так называемая «опасность»).Я установил контактную битовую маску и PhysicsCategories, но она просто не будет работать.Кто-нибудь может помочь?Он не будет печатать «контакт», когда мяч касается опасности, и я не могу понять, почему.

Кроме того, как я могу добавить другую категорию физики для «цели»?Как добавить еще один номер UInt32?Могу ли я просто изменить 0x1 на 0x2?или есть определенная причина, по которой я должен это сделать.Я новичок во всей этой категории физики, так что это действительно сбивает с толку.Я не могу найти учебник для того, что ищу конкретно.

import SpriteKit
import GameplayKit



class GameScene: SKScene {

    var ball = SKSpriteNode()
    var danger1 = SKSpriteNode()
    var danger2 = SKSpriteNode()
    var goal = SKSpriteNode()


    override func didMove(to view: SKView) {

        ball = self.childNode(withName: "ball") as! SKSpriteNode
        danger1 = self.childNode(withName: "danger1") as! SKSpriteNode
        danger2 = self.childNode(withName: "danger2") as! SKSpriteNode
        goal = self.childNode(withName: "goal") as! SKSpriteNode

        let border = SKPhysicsBody(edgeLoopFrom: self.frame)
        border.friction = 0
        border.restitution = 0

        print("x: \(ball.position.x), y: \(ball.position.y)")

        danger1.physicsBody = SKPhysicsBody(circleOfRadius: danger1.size.width/2)
        danger1.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory
        danger2.physicsBody = SKPhysicsBody(circleOfRadius: danger2.size.width/2)
        danger2.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory

        ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width/2)
        ball.physicsBody?.categoryBitMask = PhysicsCategories.ballCategory
        ball.physicsBody?.contactTestBitMask = PhysicsCategories.dangerCategory
        ball.physicsBody?.collisionBitMask = PhysicsCategories.none

        danger1.physicsBody?.isDynamic = true
        ball.physicsBody?.isDynamic = true
        goal.physicsBody?.isDynamic = true
        danger2.physicsBody?.isDynamic = true
        danger2.physicsBody!.affectedByGravity = false
        danger1.physicsBody!.affectedByGravity = false
        goal.physicsBody!.affectedByGravity = false
        ball.physicsBody!.affectedByGravity = false
        setupPhysics()

    }
    func setupPhysics() {
        physicsWorld.gravity = CGVector(dx: 0.0, dy: 0.0)
        physicsWorld.contactDelegate = self
    }

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

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

    override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendered
    }
}

extension GameScene: SKPhysicsContactDelegate {



    func didBegin(_ contact: SKPhysicsContact) {
        let contactMask = contact.bodyA.contactTestBitMask | contact.bodyB.categoryBitMask

        if contactMask == PhysicsCategories.ballCategory | PhysicsCategories.dangerCategory {
            print("Contact")
        }
    }

}

Settings.swift:

import SpriteKit

enum PhysicsCategories {
    static let none: UInt32 = 0
    static let ballCategory: UInt32 = 0x1           // 01
    static let dangerCategory: UInt32 = 0x1 << 1    // 10
}

1 Ответ

0 голосов
/ 12 декабря 2018

Вы правильно установили все свои битовые маски, поэтому оставьте их такими, какие они были.Проблемная строка:

let contactMask = contact.bodyA.contactTestBitMask | contact.bodyB.categoryBitMask

Вы используете побитовую арифметику, которая означает, что вы складываете эти биты (UInt32) вместе.Проверить ( Битовые операторы )

То, что вы хотите сделать, это сравнить две категорииBitmask, а не contactBitMask и CategoryBitmask. Так что просто измените строку выше на эту

let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

Также, чтобы сделать больше категорий, просто продолжайте сдвигать биты по

let Category4:UInt32 = 0x1 << 2
let Category5:UInt32 = 0x1 << 3

И т.д.

...