首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >任何碰撞上的游戏- Swift Spritekit

任何碰撞上的游戏- Swift Spritekit
EN

Stack Overflow用户
提问于 2017-04-23 10:10:36
回答 1查看 105关注 0票数 0

在我的游戏中,我有飞机在移动。在我的游戏中,我想让任何一架飞机与另一架相撞,它打印“游戏结束”。我已经把SKPhysicsContactDelegate添加到我的游戏中了。我在飞机上加了一个物理体。然后,我将这个函数添加到我的didMoveToView函数中:

代码语言:javascript
复制
  func didBegin(_ contact: SKPhysicsContact){
        print("Game over")
        }

现在,当我运行我的游戏,飞机相撞,没有任何打印到控制台。我如何更改我的代码,以便如果任何飞机与另一架飞机相撞(有超过2),它打印游戏到控制台?

编辑:我已经把物理世界的联系代表设置为self。我没有调用这个函数-我必须这样做吗?我认为这个函数在场景中发生冲突时运行。

这是我的代码:

代码语言:javascript
复制
//
//  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
} 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-23 15:38:43

第一

您的didBegin功能需要位于didMove功能之外。

代码语言:javascript
复制
override func didMove(to view: SKView) {
}

func didBegin(_ contact: SKPhysicsContact) {

    print("Game over")
}

第二

你需要为你的物体设置一些物理类别,这样它们才能知道它们能与什么碰撞,它们能通过什么,什么碰撞不重要。您可以将它放在类声明之外。

代码语言:javascript
复制
//Game Physics
struct PhysicsCategory {
    static let plane: UInt32 = 0x1 << 0
    static let plane2: UInt32 = 0x1 << 1
    static let obstacle: UInt32 = 0x1 << 2
}

第三

你需要把那些物理装饰品添加到你的对象中。

代码语言:javascript
复制
    //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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43569782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档