0
votes

In my game I have planes moving around. In my game, I want so that if any plane collides with another, it prints "game over". I have added SKPhysicsContactDelegate to my gamescene. I added a physics bodies to my planes. Then, I added this function to my didMoveToView function:

  func didBegin(_ contact: SKPhysicsContact){
        print("Game over")
        }

Now, when I run my game, and the planes collide, nothing prints to the console. How can I change my code so if any plane collides with another (there are more than 2) it prints game over to the console?

Edit: I have set the physics world contact delegate to self. I have not called this function - do I have to - I thought that this function runs when there is a collision in the scene.

Here is my code:

//
//  GameScene.swift
//  PlaneGame
//
//  Created by Lucas Farleigh on 09/04/2017.
//  Copyright © 2017 Farleigh Tech. All rights reserved.
//

import SpriteKit
import GameplayKit

class GameScene: SKScene, SKPhysicsContactDelegate {

private let Background = SKSpriteNode(imageNamed: "Background")
private let PlaneRed = SKSpriteNode(imageNamed: "PlaneRed")
private let PlaneBlue = SKSpriteNode(imageNamed: "PlaneBlue")
private let PlaneRed2 = SKSpriteNode(imageNamed: "PlaneRed2")
private let PlaneBlue2 = SKSpriteNode(imageNamed: "PlaneBlue2")
private let StartButton = SKLabelNode(fontNamed: "Chalkduster")
private let Trail = SKSpriteNode(imageNamed: "BlueTrail")
private let Center = SKNode()
private let Center2 = SKNode()
var GameHasStarted = false




override func didMove(to view: SKView) {

    //Defining the position,size and ZPosition for the background
    Background.position = CGPoint(x:self.frame.midX / 2,y: self.frame.midY)
    Background.xScale = 10.0
    Background.yScale = 10.0
    Background.zPosition = -10
    addChild(Background)



    //Defining a start button - will be used later as a button
    StartButton.position = CGPoint(x:self.frame.midX,y:self.frame.minY + 100)
    StartButton.text = "Tap Anywhere To Start"
    StartButton.fontSize = 50.0
    StartButton.name = "StartButton"
    addChild(StartButton)

    //Setting the planered position and size up for the plane, ready to start the game
    PlaneRed.position = CGPoint(x:self.frame.midX - 250,y: self.frame.midY)
    PlaneRed.xScale = 0.13
    PlaneRed.yScale = 0.13
    PlaneRed.zPosition = 10
    //Setting the planeblue position and size up for the plane, ready to start the game
    PlaneBlue.position = CGPoint(x:self.frame.midX + 250,y: self.frame.midY)
    PlaneBlue.xScale = 0.13
    PlaneBlue.yScale = -0.13
    PlaneBlue.zPosition = 10

    //Setting the planered position and size up for the plane, ready to start the game
    PlaneRed2.position = CGPoint(x:self.frame.midX,y: self.frame.midY + 250)
    PlaneRed2.xScale = -0.13
    PlaneRed2.yScale = 0.13
    PlaneRed2.zPosition = 10
    //Setting the planeblue position and size up for the plane, ready to start the game
    PlaneBlue2.position = CGPoint(x:self.frame.midX,y: self.frame.midY - 250)
    PlaneBlue2.xScale = 0.13
    PlaneBlue2.yScale = 0.13
    PlaneBlue2.zPosition = 10


    //Making the trail
    Trail.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
    Trail.xScale = 1.08
    Trail.yScale = 1.08
    addChild(Trail)

    //In order to rotate the planes around a point, we must create the point as an SKNode, and make the planes a child of the point
    //The point then rotates bringing the planes with it
    //Setting up the point where the plane will rotate around
    Center.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
    addChild(Center)
    Center2.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
    addChild(Center2)
    Center.addChild(PlaneRed)
    Center.addChild(PlaneBlue)
    Center2.addChild(PlaneRed2)
    Center2.addChild(PlaneBlue2)



    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //ADDING PHYSICS TO PLANES
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Defining the red planes physics body
    PlaneRed.physicsBody = SKPhysicsBody(rectangleOf: PlaneRed.size)
    PlaneRed2.physicsBody = SKPhysicsBody(rectangleOf: PlaneRed2.size)
    physicsWorld.contactDelegate = self
    physicsWorld.gravity = CGVector.zero
    func didBegin(contact: SKPhysicsContact){
        print("Game over")

    }
}








func Start(){
    //Defining an SKAction for the plane to orbit the center
    let OrbitCenter = SKAction.rotate(byAngle: CGFloat(-2), duration: 3.8)
    let Orbit = SKAction.repeatForever(OrbitCenter)
    //Creating the action for the center 2 to rotate anti clockwise
    let AntiOrbitCenter = SKAction.rotate(byAngle: CGFloat(2), duration: 3.8)
    let AntiOrbit = SKAction.repeatForever(AntiOrbitCenter)

    //Running the SKAction on the plane
    Center.run(Orbit)
    Center2.run(AntiOrbit)


}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?){
    for touch in touches{
    //Setting up the touch settings - these two variables store the nodes that the user has touched by first defining the location and then checking for nodes at this location
    let location = touch.location(in: self)
    let node = self.atPoint(location)


        if GameHasStarted == false{
            Start()
            GameHasStarted = true

        }





    }
}




override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
} 
}
1
Are you executing this function somewhere in your code?mcd
@maximilian_cs As he said, it is executed by the delegate.Papershine
Have you set the SKPhysicsContactDelegate to self?Papershine
Yes, I have - forgot to add will do now. I have not executed this function in my code.Lucas Farleigh
@LucasFarleighCan you add the code of where you add the PhysicsBodies to the planes?Ron Myschuk

1 Answers

2
votes

First

Your didBegin func needs to be outside of didMove func

override func didMove(to view: SKView) {
}

func didBegin(_ contact: SKPhysicsContact) {

    print("Game over")
}

second

you need to setup some physics categories for your objects so they know what they can collide with, what they can pass through and what collisions don't matter. You can put this outside your class declaration

//Game Physics
struct PhysicsCategory {
    static let plane: UInt32 = 0x1 << 0
    static let plane2: UInt32 = 0x1 << 1
    static let obstacle: UInt32 = 0x1 << 2
}

third

You need to add those physics decorations to your objects

    //Defining the red planes physics body
    PlaneRed.physicsBody = SKPhysicsBody(rectangleOf: PlaneRed.size)
    PlaneRed.physicsBody?.categoryBitMask = PhysicsCategory.plane
    PlaneRed.physicsBody?.collisionBitMask = PhysicsCategory.plane
    PlaneRed.physicsBody?.contactTestBitMask = PhysicsCategory.plane
    PlaneRed.physicsBody?.isDynamic = true

    PlaneRed2.physicsBody = SKPhysicsBody(rectangleOf: PlaneRed2.size)
    PlaneRed2.physicsBody?.categoryBitMask = PhysicsCategory.plane
    PlaneRed2.physicsBody?.collisionBitMask = PhysicsCategory.plane
    PlaneRed2.physicsBody?.contactTestBitMask = PhysicsCategory.plane
    PlaneRed2.physicsBody?.isDynamic = true

    PlaneBlue.physicsBody = SKPhysicsBody(rectangleOf: PlaneBlue.size)
    PlaneBlue.physicsBody?.categoryBitMask = PhysicsCategory.plane
    PlaneBlue.physicsBody?.collisionBitMask = PhysicsCategory.plane
    PlaneBlue.physicsBody?.contactTestBitMask = PhysicsCategory.plane
    PlaneBlue.physicsBody?.isDynamic = true

    PlaneBlue2.physicsBody = SKPhysicsBody(rectangleOf: PlaneBlue2.size)
    PlaneBlue2.physicsBody?.categoryBitMask = PhysicsCategory.plane
    PlaneBlue2.physicsBody?.collisionBitMask = PhysicsCategory.plane
    PlaneBlue2.physicsBody?.contactTestBitMask = PhysicsCategory.plane
    PlaneBlue2.physicsBody?.isDynamic = true

    self.physicsWorld.contactDelegate = self
    self.physicsWorld.gravity = CGVector.zero