2017-05-08 5 views
1

Ich hatte gerade erst Kollisionserkennung in meinem Spiel eingerichtet es scheint nicht zu funktionieren. Ich bin sehr neu in Spritekit und ich würde gerne wissen, was passiert. Im Folgenden werde ich Ihnen die Gamscene-Klasse, didMoveToView, eine Funktion, die die Kugeln in der Ansicht hervorbringt, und meine Did-Kontaktfunktion bereitstellen. Bitte beachte, dass ich gerade mit dem roten Ball und dem roten Block arbeite, so dass sie als einzige kollidieren. Bitte sagen Sie mir, ob es noch etwas anderes in dem Projekt gibt, das Sie sehen müssen und das unten nicht aufgeführt ist.Wie mache ich eine richtige Kollisionserkennung in SpriteKit, Swift 3

import SpriteKit 
import GameplayKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 



var greenBlock = SKSpriteNode() 
var redBlock = SKSpriteNode() 
var yellowBlock = SKSpriteNode() 
var blueBlock = SKSpriteNode() 

var greenBall = SKSpriteNode() 
var redBall = SKSpriteNode() 
var yellowBall = SKSpriteNode() 
var blueBall = SKSpriteNode() 
var ball = SKSpriteNode() 

var ballSpeedTop = CGVector(dx: 0, dy: 5) 
var ballSpeedBottom = CGVector(dx: 0, dy: -5) 

Dies ist, wo ich die Zahlen für die categoryBitMask definieren

let redBallCategory: UInt32 = 0x1 << 0 
let greenBallCategory: UInt32 = 0x1 << 1 
let blueBallCategory: UInt32 = 0x1 << 2 
let yellowBallCategory: UInt32 = 0x1 << 3 

let redBlockCategory: UInt32 = 0x1 << 4 
let yellowBlockCategory: UInt32 = 0x1 << 5 
let greenBlockCategory: UInt32 = 0x1 << 6 
let blueBlockCategory: UInt32 = 0x1 << 7 


override func didMove(to view: SKView) { 

    physicsWorld.contactDelegate = self 

Wo lese ich auf den Block der physikalischen Körper beantrage.

redBlock = self.childNode(withName: "redBlock") as! SKSpriteNode 
    redBlock.physicsBody?.categoryBitMask = redBlockCategory 
    redBlock.physicsBody?.collisionBitMask = redBallCategory 
    redBlock.physicsBody?.contactTestBitMask = redBallCategory 


    yellowBlock = self.childNode(withName: "yellowBlock") as! SKSpriteNode 
    greenBlock = self.childNode(withName: "greenBlock") as! SKSpriteNode 
    blueBlock = self.childNode(withName: "blueBlock") as! SKSpriteNode 

    redBlock.physicsBody?.affectedByGravity = false 
    redBlock.physicsBody?.isDynamic = true 

    greenBlock.physicsBody?.affectedByGravity = false 
    greenBlock.physicsBody?.isDynamic = true 

    blueBlock.physicsBody?.affectedByGravity = false 
    blueBlock.physicsBody?.isDynamic = false 

    yellowBlock.physicsBody?.affectedByGravity = false 
    yellowBlock.physicsBody?.isDynamic = false 

    initializeGame() 

    print("hello") 





} 


    func initializeGame(){ 


    Timer.scheduledTimer(timeInterval: TimeInterval(randomBetweenNumbers(firstNum: 2, secondNum: 4)), target: self, selector: #selector(topBall), userInfo: nil, repeats: true) 

    Timer.scheduledTimer(timeInterval: TimeInterval(randomBetweenNumbers(firstNum: 2, secondNum: 4)), target: self, selector: #selector(bottomBall), userInfo: nil, repeats: true) 



} 

// Top-Ball spawner

func topBall() -> SKSpriteNode { 

    let ball: SKSpriteNode?; 


    if Int(randomBetweenNumbers(firstNum: 0, secondNum: 2)) == 0 { 


     ball = SKSpriteNode(imageNamed: "redBall") 
     ball?.name = "redBall" 
     ball!.physicsBody?.categoryBitMask = redBallCategory 
     ball!.physicsBody?.collisionBitMask = redBlockCategory 
     ball!.physicsBody?.contactTestBitMask = redBlockCategory 


    } else { 


     ball = SKSpriteNode(imageNamed: "greenBall") 
     ball?.name = "greenBall" 




    } 




    ball!.size = CGSize(width: 30, height: 30) 
    ball!.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    ball!.position = CGPoint(x: 0, y: 0) 

    ball!.physicsBody = SKPhysicsBody(circleOfRadius: ball!.size.height/2) 
    ball!.physicsBody?.affectedByGravity = false 
    ball!.physicsBody?.isDynamic = true 

    ball!.zPosition = 2 


    self.addChild(ball!) 

    ball!.physicsBody?.applyImpulse(ballSpeedTop) 

    return ball! 


} 

die Kontaktfunktion

func didBegin(_ contact: SKPhysicsContact) { 


    if (contact.bodyA.categoryBitMask == redBallCategory && contact.bodyB.categoryBitMask == redBlockCategory){ 

     print("touched red block") 

    } else if (contact.bodyB.categoryBitMask == redBallCategory && contact.bodyA.categoryBitMask == redBlockCategory){ 

     print("touched a red block") 
    } 






} 

UPDATE ::: i gefunden, wo ich schief gelaufen ist, aber mein Problem ist nicht technisch noch nicht gelöst. Ich hatte die Eigenschaften des RedBall außerhalb der If-Anweisung angewendet, was bedeutete, dass die Redballs-Kategorie-Bitmaske usw. auf beide Bälle angewendet wurde. Ich brauche eine Möglichkeit, die RedBall-Kategorie-Bitmaske auf den RedBall anzuwenden, wenn er erzeugt wird, und eine andere CategoryBitMask zu dem grünen Ball, wenn er spawnt.

func topBall() -> SKSpriteNode { 

    let ball: SKSpriteNode?; 


    if Int(randomBetweenNumbers(firstNum: 0, secondNum: 2)) == 0 { 


     ball = SKSpriteNode(imageNamed: "redBall") 
     ball?.name = "redBall" 


    } else { 


     ball = SKSpriteNode(imageNamed: "greenBall") 
     ball?.name = "greenBall" 




    } 




    ball!.size = CGSize(width: 30, height: 30) 
    ball!.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    ball!.position = CGPoint(x: 0, y: 0) 

    ball!.physicsBody = SKPhysicsBody(circleOfRadius: ball!.size.height/2) 
    ball!.physicsBody?.affectedByGravity = false 
    ball!.physicsBody?.isDynamic = true 
    ball!.physicsBody?.categoryBitMask = redBallCategory 
    ball!.physicsBody?.collisionBitMask = redBlockCategory 
    ball!.physicsBody?.contactTestBitMask = redBlockCategory 


    ball!.zPosition = 2 


    self.addChild(ball!) 

    ball!.physicsBody?.applyImpulse(ballSpeedTop) 

    return ball! 


} 

das ist, wie ich es aber das Problem ist, zu arbeiten, die ich einzelne categorybitmasks an den Ball je nach anwenden möchten, ob es grün oder rot ist.

+0

Sie erhalten eher eine hilfreiche Antwort, wenn Sie den Code/das Problem auf genau die Frage reduzieren, die Sie haben. – nathan

Antwort

0

Verwenden von temporären Variablen der entsprechenden category, collision und contactTest Bitmasken in dem gleichen Code-Block zu speichern, in dem Sie die gelaicht Kugel Bild und Namen festgelegt, und dann diese temporären Variablen verwenden, um die tatsächlichen Werte in der physicsbody zu setzen:

var categoryBitMask: UInt32 
    var collisonBitMask: UInt32 
    var contactTestBitMask: Uint32 

    if Int(randomBetweenNumbers(firstNum: 0, secondNum: 2)) == 0 { 
     ball = SKSpriteNode(imageNamed: "redBall") 
     ball?.name = "redBall" 
     categoryBitMask = redBallCategory 
     collisionBitMask = redBlockCategory 
     contactTestBitMask = redBlockCategory 

    } else { 
     ball = SKSpriteNode(imageNamed: "greenBall") 
     ball?.name = "greenBall" 
     categoryBitMask = greenBallCategory 
     collisionBitMask = greenBlockCategory 
     contactTestBitMask = greenBlockCategory 
    } 

    ball!.size = CGSize(width: 30, height: 30) 
    ball!.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    ball!.position = CGPoint(x: 0, y: 0) 

    ball!.physicsBody = SKPhysicsBody(circleOfRadius: ball!.size.height/2) 
    ball!.physicsBody?.affectedByGravity = false 
    ball!.physicsBody?.isDynamic = true 
    ball!.physicsBody?.categoryBitMask = categoryBitMask 
    ball!.physicsBody?.collisionBitMask = collisionBitMask 
    ball!.physicsBody?.contactTestBitMask = contactTestBitMask 
Verwandte Themen