mardi 22 janvier 2019

How to fix SKPhysicsContactDelegate not being called

My sprites are supposed to contact each other and print to console, however, one goes behind the other and they do not actually touch. Needless to say, nothing is being printed to console.

I've tried using many different "types" of if statements in the function, however, none of them have worked. For example, I've tried using:

if bodyA.categoryBitMask == 1 && bodyB.categoryBitMask == 2 || bodyA.categoryBitMask == 2 && bodyB.categoryBitMask == 1

as well as:

if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask

Help would be much appreciated! :)

import SpriteKit
import GameplayKit

class GameScene: SKScene, SKPhysicsContactDelegate {

var e = SKSpriteNode()
var square = SKSpriteNode()

var timer:Timer!

let squareCategory:UInt32 = 0x1 << 1
let eCategory:UInt32 = 0x1 << 2

override func didMove(to view: SKView) {

    self.physicsWorld.contactDelegate = self

    square = SKSpriteNode(imageNamed: "square")
    square.size = CGSize(width: 100, height: 100)
    square.physicsBody = SKPhysicsBody(rectangleOf: square.size)
    square.position = CGPoint(x: 0, y: -590)
    square.physicsBody = SKPhysicsBody(rectangleOf: e.size)
    square.name = "square"

    square.physicsBody?.categoryBitMask = squareCategory
    square.physicsBody?.contactTestBitMask = eCategory
    square.physicsBody?.usesPreciseCollisionDetection = true

    self.addChild(square)

    let swipeRight: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(GameScene.swipedRight(sender:)))
    swipeRight.direction = .right
    view.addGestureRecognizer(swipeRight)

    let swipeLeft: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector (GameScene.swipedLeft(sender:)))
    swipeLeft.direction = .left
    view.addGestureRecognizer(swipeLeft)

    timer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(self.adde), userInfo: nil, repeats: true)

  }

@objc func swipedRight(sender: UISwipeGestureRecognizer) {

    //middle
    if square.position == CGPoint(x: 0, y: -590) {

        square.position = CGPoint(x: 200, y: -590)

    }

    //left
    if square.position == CGPoint(x: -200, y: -590) {

        square.position = CGPoint(x: 0, y: -590)

    }

}

@objc func swipedLeft(sender: UISwipeGestureRecognizer) {

    //middle
    if square.position == CGPoint(x: 0, y: -590) {

        square.position = CGPoint(x: -200, y: -590)

    }

    //right
    if square.position == CGPoint(x: 200, y: -590) {

        square.position = CGPoint(x: 0, y: -590)

    }

}

@objc func adde() {

    e = SKSpriteNode(imageNamed: "e")

    let ePosition = GKRandomDistribution(lowestValue: -414, highestValue: 414)
    let position = CGFloat(ePosition.nextInt())

    e.size = CGSize(width: 75, height: 75)
    e.position = CGPoint(x: position, y: 640)
    e.physicsBody = SKPhysicsBody(rectangleOf: e.size)
    e.name = "e"

    e.physicsBody?.categoryBitMask = eCategory
    e.physicsBody?.contactTestBitMask = squareCategory

    e.physicsBody?.isDynamic = true

    self.addChild(e)

    let animationDuration:TimeInterval = 6

    var actionArray = [SKAction]()

    actionArray.append(SKAction.move(to: CGPoint(x: position, y: -705), duration: animationDuration))
    actionArray.append(SKAction.removeFromParent())

    e.run(SKAction.sequence(actionArray))

}

func didBegin(_ contact: SKPhysicsContact) {

    let bodyAName = contact.bodyA.node?.name
    let bodyBName = contact.bodyB.node?.name

    if bodyAName == "square" && bodyBName == "e" || bodyAName == "e" && bodyBName == "square"{
        if bodyAName == "square" {
            contact.bodyA.node?.removeFromParent()
        } else if bodyBName == "e" {
            contact.bodyB.node?.removeFromParent()
        }


    }

}

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

I am supposed to get the message, but the "e" goes behind the "square" and I don't get any message.




Aucun commentaire:

Enregistrer un commentaire