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