Как обнаружить контакт в SpriteKit - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь сделать так, чтобы контакт обнаруживался SpriteKit в Swift 4. Я установил флиппер в определенную категорию, а мяч - в другую. Затем я устанавливаю их коллизию и маску контакта друг с другом, добавляю contactDelegate в didMove и печатаю «контакт», чтобы сообщить, что есть контакт в didEnterFonction. Однако я вообще не могу обнаружить никакого контакта. Даже после выполнения всех руководств и поиска похожих вопросов. Я не понимаю, что делаю не так. Моя конечная цель состоит в том, чтобы мяч не падал, когда он ударяется о ласт, но я вообще пытаюсь обнаружить любой контакт, который не работает.

import SpriteKit
import GameplayKit

struct PhysicsCategory {
  static let none      : UInt32 = 0
  static let all       : UInt32 = UInt32.max
  static let flip   : UInt32 = 0b1
  static let ball: UInt32 = 0b10  // 2
}
class GameScene: SKScene, SKPhysicsContactDelegate {

var entities = [GKEntity]()
var graphs = [String : GKGraph]()

private var lastUpdateTime : TimeInterval = 0
private var label : SKLabelNode?
private var flip1: SKSpriteNode?
private var flip2: SKSpriteNode?
private var spinnyNode : SKShapeNode?
private var balle:SKSpriteNode?

override func sceneDidLoad() {

    self.lastUpdateTime = 0
    self.flip1 = self.childNode(withName:"//flip1") as? SKSpriteNode
    self.flip2 = self.childNode(withName: "//flip2") as? SKSpriteNode
    self.balle = self.childNode(withName: "//ball") as?SKSpriteNode
    self.flip1?.physicsBody = SKPhysicsBody()
    self.flip1?.physicsBody?.affectedByGravity = false
    self.flip1?.physicsBody?.allowsRotation = true
    self.balle?.physicsBody = SKPhysicsBody();
    //self.balle?.physicsBody?.affectedByGravity = true
    self.flip2?.physicsBody = SKPhysicsBody()
    self.flip2?.physicsBody?.affectedByGravity = false
    self.flip2?.physicsBody?.allowsRotation = true
    self.balle?.physicsBody?.allContactedBodies()
    self.flip1?.physicsBody?.usesPreciseCollisionDetection
        = true
    self.flip1?.physicsBody?.categoryBitMask = PhysicsCategory.flip
    self.flip1?.physicsBody?.contactTestBitMask = PhysicsCategory.ball
    self.flip1?.physicsBody?.collisionBitMask = PhysicsCategory.ball

    self.flip2?.physicsBody?.categoryBitMask = PhysicsCategory.flip
    self.flip2?.physicsBody?.contactTestBitMask = PhysicsCategory.ball
    self.flip2?.physicsBody?.collisionBitMask = PhysicsCategory.ball


    // Get label node from scene and store it for use later
    self.label = self.childNode(withName: "//helloLabel") as? SKLabelNode
    if let label = self.label {
        label.alpha = 0.0
        label.run(SKAction.fadeIn(withDuration: 2.0))
    }

    // Create shape node to use during mouse interaction
    let w = (self.size.width + self.size.height) * 0.05
    self.spinnyNode = SKShapeNode.init(rectOf: CGSize.init(width: w, height: w), cornerRadius: w * 0.3)

    if let spinnyNode = self.spinnyNode {
        spinnyNode.lineWidth = 2.5

        spinnyNode.run(SKAction.repeatForever(SKAction.rotate(byAngle: CGFloat(Double.pi), duration: 1)))
        spinnyNode.run(SKAction.sequence([SKAction.wait(forDuration: 0.5),
                                          SKAction.fadeOut(withDuration: 0.5),
                                          SKAction.removeFromParent()]))
    }
}
override func keyDown(with event: NSEvent) {
    switch event.keyCode {
    case 0x31:
        if let label = self.label {
            label.run(SKAction.init(named: "Pulse")!, withKey: "fadeInOut")
        }
    case 123:
        print("left")
        self.flip1?.run(SKAction.rotate(byAngle: -1.5, duration: 0.2))
       // self.flip1?.physicsBody?.applyAngularImpulse(600)
        self.flip1?.run(SKAction.rotate(byAngle: 1.5, duration: 0.1))
    case 124:
      self.flip2?.run(SKAction.rotate(byAngle: 1.5, duration: 0.2))
        self.flip2?.run(SKAction.rotate(byAngle: -1.5, duration: 0.1))
    case 15:
        self.balle?.run(SKAction.move(to: CGPoint(x: 50,y: 50), duration: 1))
    default:
        print("keyDown: \(event.characters!) keyCode: \(event.keyCode)")
    }
}





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

    // Initialize _lastUpdateTime if it has not already been
    if (self.lastUpdateTime == 0) {
        self.lastUpdateTime = currentTime
    }

    // Calculate time since last update
    let dt = currentTime - self.lastUpdateTime

    // Update entities
    for entity in self.entities {
        entity.update(deltaTime: dt)
    }

    self.lastUpdateTime = currentTime
}
override func didMove(to view: SKView) {
    physicsWorld.contactDelegate = self
}
func didEnter(_ contact: SKPhysicsContact) {
    print("contact")

    }
}

1 Ответ

0 голосов
/ 09 мая 2020

Вы не придали физическим c телам форму или размер. Взгляните на здесь и прочтите разделы «Создание тела из ___».

...