swift - 任何碰撞游戏结束 - Swift Spritekit

标签 swift sprite-kit

在我的游戏中,我有飞机在四处移动。在我的游戏中,我希望如果任何飞机与另一架飞机相撞,它就会打印“游戏结束”。我已将 SKPhysicsContactDelegate 添加到我的游戏场景中。我在我的飞机上添加了一个物理实体。然后,我将这个函数添加到我的 didMoveToView 函数中:

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

现在,当我运行我的游戏时,当飞机发生碰撞时,控制台上不会打印任何内容。我该如何更改我的代码,以便在任何飞机与另一架飞机(超过 2 架)相撞时将游戏打印到控制台?

编辑:我已将物理世界联系委托(delegate)设置为 self 。我没有调用这个函数——我必须调用吗?我认为这个函数在场景中发生碰撞时运行。

这是我的代码:

//
//  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
} 
}

最佳答案

首先

Your didBegin func needs to be outside of didMove func

override func didMove(to view: SKView) {
}

func didBegin(_ contact: SKPhysicsContact) {

    print("Game over")
}

第二个

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
}

第三个

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

关于swift - 任何碰撞游戏结束 - Swift Spritekit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43569782/

相关文章:

swift - 传入runtimeType作为通用函数参数

Swift SpriteKit 在 x 轴旋转节点

ios - 如何阻止我的 UITabBar 在隐藏后响应触摸?

ios - 快速解析JSON数组

ios - 为什么 SpriteKit 不显示任何内容?

swift - 限制 SpriteKit 转换的节点名称的最佳方法

ios - Swift 游戏场景随时间改变垂直移动的背景?

sprite-kit - 没有透明背景的SKLabelNode

ios - UITableView 以编程方式滚动到不存在的单元格

xcode - TouchsBegin 不适用于多次触摸