2017-02-25 57 views
1

我需要在我的項目中檢測聯繫人,但我想要檢測9個正方形的聯繫。有沒有辦法檢測接觸而不創建9個不同的物理機構或類似物理陣列的東西。而且,每當圓形接觸一個正方形時,該正方形就會變成彩色。我想的東西要做到這一點像這樣的數組:檢測SKSpritenode與多個SKSpritenodes的聯繫Swift

for i in 1...9{ 
if firstBody.categoryBitMask == PhysicsCategory.square[i] && secondBody.categoryBitMask == PhysicsCategory.circle || firstBody.categoryBitMask == 
PhysicsCategory.circle && secondBody.categoryBitMask == PhysicsCategory.square[i] { 

    squares[i].node.color = squares[i].targetColor 
    //this is my array of structs containing the skspritenodes 
    squares[i].colorBlendFactor = 1.0 


} 
} 

我試圖讓9個物理機構,但我得到了很多錯誤。這是我迄今爲止所做的。

import SpriteKit 

var squares = Array<square>() 
var positions = Array<CGPoint>() 
var squareUnit = CGFloat() 
var rows = Array<CGFloat>() 
var columbs = Array<CGFloat>() 
var circle = SKSpriteNode() 
var physics = Array<UInt32>() 

struct PhysicsCategory{ 

static let circle : UInt32 = 0x1 << 0 
static let square1 : UInt32 = 0x1 << 1 
static let square2 : UInt32 = 0x1 << 2 
static let square3 : UInt32 = 0x1 << 3 
static let square4 : UInt32 = 0x1 << 4 
static let square5 : UInt32 = 0x1 << 5 
static let square6 : UInt32 = 0x1 << 6 
static let square7 : UInt32 = 0x1 << 7 
static let square8 : UInt32 = 0x1 << 8 
static let square9 : UInt32 = 0x1 << 9 






} 

struct square{ 

var startColor = UIColor() 
var middleColor = UIColor() 
var targetColor = UIColor() 
var has3Colors = Bool() 
var permanent = Bool() 
var node = SKSpriteNode(imageNamed:"Square") 
var currentState = Int() 




} 

class GameScene: SKScene, SKPhysicsContactDelegate { 


override func didMove(to view: SKView) { 

     createScene() 

     } 

    func createScene(){ 
    self.physicsWorld.contactDelegate = self 
    self.anchorPoint = CGPoint(x: 0, y: 0) 
    createSquares() 
    createCircles() 


} 


func createCircles(){ 

    circle = SKSpriteNode(imageNamed: "Circle") 
    circle.size.width = squares[1].node.size.width * 0.9 
    circle.size.height = squares[1].node.size.height * 0.9 
    circle.position = squares[4].node.position 
    circle.color = UIColor.blue 
    circle.colorBlendFactor = 1.0 
    circle.zPosition = 10 
    circle.physicsBody = SKPhysicsBody(circleOfRadius: circle.frame.width/2) 
    circle.physicsBody?.categoryBitMask = PhysicsCategory.circle 
    circle.physicsBody?.affectedByGravity = false 
    circle.physicsBody?.isDynamic = false 
    circle.physicsBody?.contactTestBitMask = PhysicsCategory.square1 
    circle.physicsBody?.contactTestBitMask = PhysicsCategory.square2 
    circle.physicsBody?.contactTestBitMask = PhysicsCategory.square3 
    circle.physicsBody?.contactTestBitMask = PhysicsCategory.square4 
    circle.physicsBody?.contactTestBitMask = PhysicsCategory.square5 
    circle.physicsBody?.contactTestBitMask = PhysicsCategory.square6 
    circle.physicsBody?.contactTestBitMask = PhysicsCategory.square7 
    circle.physicsBody?.contactTestBitMask = PhysicsCategory.square8 
    circle.physicsBody?.contactTestBitMask = PhysicsCategory.square9 

     self.addChild(circle) 



} 

func didBegin(_ contact: SKPhysicsContact) { 

    let firstBody = contact.bodyA 
    let secondBody = contact.bodyB 


     } 


func createSquares(){ 
    for i in 1...9{ 

     // squares[i].currentState = 1 

    } 
    squareUnit = self.frame.width/4 



    columbs = [squareUnit/4 + squareUnit/2, self.frame.width/2,self.frame.width - squareUnit/4 - squareUnit/2] 
    rows = [squareUnit/4 + squareUnit/2, self.frame.width/2,self.frame.width - squareUnit/4 - squareUnit/2] 
    for row in rows{ 
     for columb in columbs{ 

      positions.append(CGPoint(x: columb, y: row)) 

     } 


    } 

    squares = (0...8).map { _ in square() } 

    for i in (0...8){ 


     squares[i].node.position = positions[i] 
     squares[i].node.physicsBody = SKPhysicsBody(rectangleOf: squares[i].node.size) 
     squares[i].node.physicsBody?.affectedByGravity = false 
     squares[i].node.physicsBody?.isDynamic = false 



    } 
    for square in squares { 

     square.node.size = CGSize(width: squareUnit, height: squareUnit) 
     square.node.color = UIColor.white 
    } 

    squares.forEach { self.addChild($0.node) } 

} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 

    for touch in touches { 



     let location = touch.location(in: self) 

     circle.run(SKAction.move(to: CGPoint(x: location.x, y: location.y), duration: 0.2)) 


    } 

} 


override func update(_ currentTime: TimeInterval) { 
    // Called before each frame is rendered 
} 
} 

回答

1

我想通了,我只是創建9塊物理體,然後將它們都添加到UInt32的陣列,並將它們分配給每一個到每個節點。

var physics = Array<UInt32>() 



struct PhysicsCategory{ 

    static let square1 : UInt32 = 0x1 << 1 
    static let square2 : UInt32 = 0x1 << 2 
    static let square3 : UInt32 = 0x1 << 3 
    static let square4 : UInt32 = 0x1 << 4 
    static let square5 : UInt32 = 0x1 << 5 
    static let square6 : UInt32 = 0x1 << 6 
    static let square7 : UInt32 = 0x1 << 7 
    static let square8 : UInt32 = 0x1 << 8 
    static let square9 : UInt32 = 0x1 << 9 
} 

override func didMove(to view: SKView) { 

    physics.append(PhysicsCategory.square1) 
    physics.append(PhysicsCategory.square2) 
    physics.append(PhysicsCategory.square3) 
    physics.append(PhysicsCategory.square4) 
    physics.append(PhysicsCategory.square5) 
    physics.append(PhysicsCategory.square6) 
    physics.append(PhysicsCategory.square7) 
    physics.append(PhysicsCategory.square8) 
    physics.append(PhysicsCategory.square9) 


    for i in (0...8){ 

     squares[i].node.physicsBody = SKPhysicsBody(rectangleOf: squares[i].node.size) 
     squares[i].node.physicsBody?.categoryBitMask = physics[i] 
     squares[i].node.physicsBody?.affectedByGravity = false 
     squares[i].node.physicsBody?.isDynamic = false 
     squares[i].node.physicsBody?.contactTestBitMask = PhysicsCategory.Circle 
     squares[i].node.physicsBody?.collisionBitMask = 0 


    } 

}