2017-09-03 49 views
0
import SpriteKit 
import GameplayKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 
    let balls = [ 
    SKSpriteNode(imageNamed: "blueball.png"), 
    SKSpriteNode(imageNamed: "greenball.png"), 
    SKSpriteNode(imageNamed: "realredball.png"), 
    ] 
let redRectangle = SKSpriteNode(imageNamed: "redrectangle.png") 
let blueRectangle = SKSpriteNode(imageNamed: "bluerectangle.png") 
let greenRectangle = SKSpriteNode(imageNamed: "greenrectangle.png") 

let blueBallCategory :UInt32 = 0x1 << 0 
let greenBallCategory :UInt32 = 0x1 << 1 
let realRedBallCategory :UInt32 = 0x1 << 2 
let redRectangleCategory : UInt32 = 0x1 << 3 
let blueRectangleCategory : UInt32 = 0x1 << 4 
let greenRectangleCategory : UInt32 = 0x1 << 5 

override func didMove(to view: SKView) { 
    spawnBallsandRectangles() 
    physicsWorld.contactDelegate = self 
} 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    physics() 
} 
func didBegin(_ contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 
    if firstBody.categoryBitMask == blueBallCategory && secondBody.categoryBitMask == blueRectangleCategory { 
     print("alive") 
     } 
    else if firstBody.categoryBitMask == greenBallCategory && secondBody.categoryBitMask == greenRectangleCategory { 
     print("alive") 
    } 
    else if firstBody.categoryBitMask == realRedBallCategory && secondBody.categoryBitMask == redRectangleCategory { 
     print("alive") 
    } 
    else if firstBody.categoryBitMask == blueBallCategory || firstBody.categoryBitMask == greenBallCategory && secondBody.categoryBitMask == redRectangleCategory{ 
     print("dead") 
    } 
    else if firstBody.categoryBitMask == realRedBallCategory || firstBody.categoryBitMask == greenBallCategory && secondBody.categoryBitMask == blueRectangleCategory { 
     print("dead") 
    } 
    else if firstBody.categoryBitMask == realRedBallCategory || firstBody.categoryBitMask == blueBallCategory && secondBody.categoryBitMask == greenBallCategory { 
    print("dead") 
     } 
    } 


func spawnBallsandRectangles() { 
    let ball = balls[Int(arc4random_uniform(UInt32(balls.count)))] 
    ball.position = CGPoint(x: -200, y: 250) 
    ball.size = CGSize(width: 70, height: 70) 
    redRectangle.position = CGPoint(x: 0, y: -600) 
    redRectangle.size = CGSize(width: 200, height: 20) 
    blueRectangle.position = CGPoint(x: -200, y: -600) 
    blueRectangle.size = CGSize(width: 200, height: 20) 
    greenRectangle.position = CGPoint(x: 200, y: -600) 
    greenRectangle.size = CGSize(width: 200, height: 20) 
    self.addChild(ball) 
    self.addChild(redRectangle) 
    self.addChild(blueRectangle) 
    self.addChild(greenRectangle) 

} 
func physics(){ 
    for ball in balls{ 
     ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height/2) 
       } 
    redRectangle.physicsBody = SKPhysicsBody(rectangleOf: redRectangle.size) 
    redRectangle.physicsBody?.affectedByGravity = false 
    redRectangle.physicsBody?.isDynamic = false 
    blueRectangle.physicsBody = SKPhysicsBody(rectangleOf: redRectangle.size) 
    blueRectangle.physicsBody?.affectedByGravity = false 
    blueRectangle.physicsBody?.isDynamic = false 
    greenRectangle.physicsBody = SKPhysicsBody(rectangleOf: redRectangle.size) 
    greenRectangle.physicsBody?.isDynamic = false 
    greenRectangle.physicsBody?.affectedByGravity = false 
    balls[0].physicsBody?.categoryBitMask = blueBallCategory 
    balls[1].physicsBody?.categoryBitMask = greenBallCategory 
    balls[2].physicsBody?.categoryBitMask = realRedBallCategory 
    balls[0].physicsBody?.contactTestBitMask = redRectangleCategory 
    balls[1].physicsBody?.contactTestBitMask = redRectangleCategory 
    balls[1].physicsBody?.contactTestBitMask = blueRectangleCategory 
    balls[2].physicsBody?.contactTestBitMask = blueRectangleCategory 
    balls[0].physicsBody?.contactTestBitMask = greenRectangleCategory 
    balls[2].physicsBody?.contactTestBitMask = greenRectangleCategory 
    balls[0].physicsBody?.contactTestBitMask = blueRectangleCategory 
    balls[1].physicsBody?.contactTestBitMask = greenRectangleCategory 
    balls[2].physicsBody?.contactTestBitMask = redRectangleCategory 
    redRectangle.physicsBody?.categoryBitMask = redRectangleCategory 
    blueRectangle.physicsBody?.categoryBitMask = blueRectangleCategory 
    greenRectangle.physicsBody?.categoryBitMask = greenRectangleCategory 


} 
} 

我已经设置了碰撞检测功能,因此如果一个球碰撞到一个匹配颜色的矩形,程序将打印(“活动”)。如果颜色不匹配,程序应该打印(“死”)。它检测碰撞,如果颜色匹配并打印(“活”),但它不打印(“死”)。有人可以帮忙,谢谢。碰撞检测未完全运行

+0

A re球和矩形的颜色也是一样的,比如你可以比较他们的.color属性来进行比赛吗?如果没有,你可以让他们相同的颜色? –

+0

他们是图像(PNG),所以我不知道我会怎么做 –

回答

1

你可能会发现,你的结构像didBegin()这可能有助于摆脱那些else if S的:

func didBegin(_ contact: SKPhysicsContact) { 

    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

    switch contactMask { 

    case blueBallCategory | blueRectangleCategory: 
     print("Alive! Blue ball has hit blue rectangle.") 

    case greenBallCategory | greenRectangleCategory: 
     print("Alive! Green ball has hit green rectangle.") 

    case redBallCategory | redRectangleCategory: 
     print("Alive! Red ball has hit red rectangle.") 

    default : 
     print("Dead! Some other contact has occurred") 
    } 
} 

你想,如果球击中不同颜色的矩形,发生什么?

编辑:

从这个代码在你physics()功能:

balls[0].physicsBody?.contactTestBitMask = redRectangleCategory 
balls[1].physicsBody?.contactTestBitMask = redRectangleCategory 
balls[1].physicsBody?.contactTestBitMask = blueRectangleCategory 
balls[2].physicsBody?.contactTestBitMask = blueRectangleCategory 
balls[0].physicsBody?.contactTestBitMask = greenRectangleCategory 
balls[2].physicsBody?.contactTestBitMask = greenRectangleCategory 
balls[0].physicsBody?.contactTestBitMask = blueRectangleCategory 
balls[1].physicsBody?.contactTestBitMask = greenRectangleCategory 
balls[2].physicsBody?.contactTestBitMask = redRectangleCategory 

每次特定物理实体指定一个新值contactTestbitMask时,要覆盖以前的值,不增加它。因此每个重要只有行是:

balls[0].physicsBody?.contactTestBitMask = blueRectangleCategory 
balls[1].physicsBody?.contactTestBitMask = greenRectangleCategory 
balls[2].physicsBody?.contactTestBitMask = redRectangleCategory 

所以球[0](蓝色球)仅接触蓝色矩形,球[1](绿球)仅接触绿色长方形和球[2](实红球)只接触红色矩形。所以didBegin()将不会被调用,如果一个球接触不同颜色的矩形,这就是为什么你永远不会看到你的'死'消息。

另一个编辑:

如果你想所有的球触发didBegin()的时候再联系任何矩形,那么你contactTestBitMasks的球应该包括所有的矩形:

for ball in balls { 
    balls.physicsBody?.contactTestBitMask = blueRectangleCategory | greenRectangleCategory | redRectangleCategory 
} 

,或者球已经定义了一些触点并且您只是想将矩形添加到其碰撞位掩码中:

for ball in balls { 
    balls.physicsBody?.contactTestBitMask |= (blueRectangleCategory | greenRectangleCategory | redRectangleCategory) 
} 
+0

谢谢,我试图运行这个和没有打印,但这种方式似乎比if/else方式更容易。有没有另外一种方法可以写出来,以便它能够正常工作。 –

+0

实际上,它对相同的颜色节点起作用,但它对默认情况(“”Dead!Some Other contact has occurred“)不起作用,对不起,我的控制台速度很慢。 –

+0

尝试添加'print(”Contact detected“ )'作为'didBegin()'的第一行,看看会发生什么。 –