2017-05-08 35 views
1

私はちょうど最近私のゲームで衝突検出を設定しましたが、動作していないようです。私はspritekitにはとても新しいので、何が起こっているのか知りたいです。以下では、gamsceneクラス、didMoveToView、ビュー内でボールを生成している関数、およびMy did begin contact関数を提供します。私は赤いボールと赤いブロックだけで作業しているので、衝突するのは唯一の2つなので注意してください。あなたが見る必要があり、以下では提供されていないプロジェクトのものがあれば教えてください。私は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) 

私はブロックに物理体を適用していますcategoryBitMask

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 

のための番号を定義する場所です。

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) 



} 

//トップボール産卵

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! 


} 

接触機能

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 :::私が間違っていたところ見つかりましたが、私の問題は、技術的にはまだ解決されていません。私はredBallのプロパティをif文の外に適用しました。これは、redballsカテゴリのビットマスクなどが両方のボールに適用されることを意味しました。redBallカテゴリのビットマスクを生成し、緑色のボールが生まれたときにそれを知る。

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! 


} 

これは、私はそれが動作するようになった方法ですが、問題は、私はそれが緑または赤で天気をに応じて、ボールに個別categorybitmasksを適用したいということです。あなたが生成されたボールの画像と名前を設定し、コードの同じブロックに適切なcategorycollisioncontactTestビットマスクを格納し、その後、physicsbodyで実際の値を設定するためにこれらの一時変数を使用する

+0

コード/問題をあなたが持っている質問に正確に還元すると、役に立つ回答が得られる可能性が高くなります。 – nathan

答えて

0

利用一時的な変数:

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