2015-04-01 95 views
0

基本上,遊戲由玩家在屏幕上移動的籃子組成,遊戲的目的是讓玩家捕捉從屏幕頂部落下的球。我目前正試圖在球和籃子之間增加碰撞檢測,但是我們面臨的困難是實施這種碰撞檢測。我對swift,sprite kit和app開發很陌生,所以請幫助。任何幫助,將不勝感激。我面臨的另一個問題是所有的球落在屏幕的中心。一行代碼應該執行的時候,球擊中籃,然後球應該消失,請幫助,因爲我是Spritekit的新手。實現碰撞檢測

import SpriteKit 

class GameScene: SKScene { 

var basket = SKSpriteNode() 

let actionMoveRight = SKAction.moveByX(50, y: 0, duration: 0.2) 
let actionMoveLeft = SKAction.moveByX(-50, y: 0, duration: 0.2) 
//let physicsBody = SKPhysicsBody(texture: , size: 3500) 

override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 

    self.physicsWorld.gravity = CGVectorMake(0.0, -0.5) 
    self.backgroundColor = SKColor.whiteColor() 
    basket = SKSpriteNode(imageNamed: "basket") 
    basket.setScale(0.5) 
    basket.position = CGPointMake(self.size.width/2, self.size.height/8) 
    basket.size.height = 50 
    basket.size.width = 75 
    self.addChild(basket) 

    let updateAction = SKAction.runBlock { 



     var choice = arc4random_uniform(3) 

     switch choice { 
     case 1 : 
      var ball1 = SKSpriteNode(imageNamed: "redBall") 
      ball1.position = CGPointMake(self.size.width/3, self.size.height) 
      ball1.setScale(0.5) 
      ball1.size.height = 20 
      ball1.size.width = 30 
      ball1.physicsBody = SKPhysicsBody(circleOfRadius: ball1.size.height/2.75) 
      ball1.physicsBody!.dynamic = true 
      self.addChild(ball1) 
      println("0") 


     case 0 : 
      var ball2 = SKSpriteNode(imageNamed: "redBall") 
      ball2.position = CGPointMake(self.size.width/5, self.size.height) 
      ball2.setScale(0.5) 
      ball2.size.height = 20 
      ball2.size.width = 30 
      ball2.physicsBody = SKPhysicsBody(circleOfRadius: ball2.size.height/2.75) 
      ball2.physicsBody!.dynamic = true 
      self.addChild(ball2) 
      println("1") 


     case 2 : 
      var ball3 = SKSpriteNode(imageNamed: "redBall") 
      ball3.position = CGPointMake(self.size.width*4/5, self.size.height) 
      ball3.setScale(0.5) 
      ball3.size.height = 20 
      ball3.size.width = 30 
      ball3.physicsBody = SKPhysicsBody(circleOfRadius: ball3.size.height/2.75) 
      ball3.physicsBody!.dynamic = true 
      self.addChild(ball3) 
      println("2") 


     default : 
      println("Problem") 

     } 



    } 

    let waitDuration : NSTimeInterval = 1.0 
    let updateAndWaitAction = SKAction.sequence([updateAction,SKAction.waitForDuration(waitDuration)]) 
    let repeatForeverAction = SKAction.repeatActionForever(updateAndWaitAction) 
    self.runAction(repeatForeverAction) 
} 

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    /* Called when a touch begins */ 

    for touch: AnyObject in touches { 
     let location = touch.locationInNode(self) 
     if location.x > basket.position.x { 
      if basket.position.x < self.frame.maxX { 
       basket.runAction(actionMoveRight) 
      } 
     } 
     else { 
      if basket.position.x > self.frame.minX { 
       basket.runAction(actionMoveLeft) 
      } 
     } 
    } 
} 

override func update(currentTime: CFTimeInterval) { 


} 

}

+0

http://stackoverflow.com/questions/24169882/how-to-properly-remove-node-當出界限時/ 24195006#24195006 雖然它起初可能看起來並不相關,但它是兩個物體接觸時如何觸發事件的示例。這種方法是在sprite工具包中處理碰撞檢測的方法。 RayWenderlich.com有一些易於理解的教程,可以在不到一個小時的時間內完成您的任務。我的答案可以讓你既檢測到碰撞又可以訪問碰撞的兩個物體。這可以讓你輕鬆地移除球。 – meisenman 2015-04-01 14:18:18

+0

請記住,您不會檢測到碰撞 - 您會檢測到兩個SKNode之間的接觸。碰撞是由遊戲引擎自動處理的,如果你這樣設置的話。碰撞檢測和接觸檢測是分開的,真實的事情,它有助於正確地使用術語。不幸的是,其他人所指的是「碰撞檢測」意味着SK中的接觸檢測。 – 2016-07-20 09:44:52

回答

1

現在你有一個通常在用戶被錄音的東西的情況下使用的代碼。您需要使用BodyA & BodyB併爲您的節點分配一個位掩碼。

self.basket.physicsBody?.categoryBitMask = ColliderType.basket.rawValue 
self.basket.physicsBody?.contactTestBitMask = ColliderType.ball1.rawValue 
self.basket.physicsBody?.collisionBitMask = ColliderType.ball1.rawValue 
self.basket.physicsBody?.contactTestBitMask = ColliderType.ball2.rawValue 
self.basket.physicsBody?.collisionBitMask = ColliderType.ball2.rawValue 
self.basket.physicsBody?.contactTestBitMask = ColliderType.ball3.rawValue 
self.basket.physicsBody?.collisionBitMask = ColliderType.ball3.rawValue 

並且爲每個球也做。然後在FUNC didBeginContact你應該說Xcode的做什麼,如果你有一個動畫或東西:

if (contact.bodyA.categoryBitMask == ColliderType.ball1.rawValue || contact.bodyB.categoryBitMask == ColliderType.ball1.rawValue) { 
     yourGameOverFunc() 
    } 
    if (contact.bodyA.categoryBitMask == ColliderType.ball2.rawValue || contact.bodyB.categoryBitMask == ColliderType.ball2.rawValue) { 
     yourGameOverFunc() 
    } 
    if (contact.bodyA.categoryBitMask == ColliderType.ball3.rawValue || contact.bodyB.categoryBitMask == ColliderType.ball3.rawValue) { 
     yourGameOverFunc() 
    } 
+0

如何創建類別位,請求和正文A和B – 2015-04-02 18:05:09

+0

我已經爲您做了,只需將該代碼粘貼到didBeginContact – Burundanga 2015-04-02 19:58:20