2015-02-05 174 views
0

我試圖檢測玩家對象何時與我遊戲中的其他物體發生碰撞。這是我當前的代碼:兩個精靈之間的碰撞檢測不起作用

import SpriteKit 

class GameScene: SKScene { 

let player = SKSpriteNode(imageNamed: 「Box」) 

override func didMoveToView(view: SKView) { 
    backgroundColor = SKColor.whiteColor() 
    player.position = CGPoint(x: size.width/2, y: size.height/2) 
    addChild(player) 


    runAction(SKAction.repeatActionForever(
     SKAction.sequence([ 
      SKAction.runBlock(addObject), 
      SKAction.waitForDuration(1) 
      ]) 
     )) 


    runAction(SKAction.repeatActionForever(
     SKAction.sequence([ 
      SKAction.runBlock(addSecondObject), 
      SKAction.waitForDuration(1) 
      ]) 
     )) 




} 

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 

    for touch: AnyObject in touches { 
     let location = touch.locationInNode(self) 
     player.position = location 
    } 




} 



func EndGame() { 
    println("GAME OVER") 
} 





func Collision() { 
    if (CGRectIntersectsRect(player.frame, object.frame)) { 
     [EndGame]; 
    } 
    if (CGRectIntersectsRect(player.frame, object1.frame)) { 
     [EndGame]; 
    } 
} 




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


func addObject() { 
    let object = SKSpriteNode(imageNamed: "object1」) 
    object.name = "object1」 
    object.position = CGPoint(x: size.width/4, y: size.height/4) 
    self.addChild(object) 


} 


func addSecondObject() { 
    let object = SKSpriteNode(imageNamed: "object2」) 
    object.name = "object2」 
    object.position = CGPoint(x: size.width/2, y: size.height/2) 
    self.addChild(object) 

} 

}

所以你可以看到我的碰撞代碼是這樣的:

func Collision() { 
    if (CGRectIntersectsRect(player.frame, object.frame)) { 
     [EndGame]; 
    } 
    if (CGRectIntersectsRect(player.frame, object1.frame)) { 
     [EndGame]; 
    } 
} 

的問題是,由於對象和對象1個變量是私有的FUNC( addObject)和func(addSecondObject),我不能在上面的代碼中調用它們。當他們碰撞時,目前我只想讓EndGame()運行,在控制檯中輸出「Game Over」。

我不知道我採取的碰撞檢測方法是否正確,但任何幫助都會很棒!謝謝:)

回答

0

對於非常基本的精靈,是的,它的權利。你可以想象一個對角線圖像「/」會觸發碰撞,如果它的左上角與某些東西重疊,即使實際物體不重疊。

蘋果公司有一個很好的頁面在這裏討論的碰撞:https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/CodeExplainedAdventure/HandlingCollisions/HandlingCollisions.html

同時,很多YouTube視頻談論如何讓這種事情的工作的。例如:https://www.youtube.com/watch?v=dX0KvKtc3_w

您需要讓碰撞檢測代碼運行(可能在計時器或其他東西上),然後可能會傳入要檢查的對象或使這些對象成爲類的成員(IBOutlet)或類似的戰略來獲得他們的訪問權限。

0

你必須使用SKPhysicsbody

struct PhysicsCategory { 
    static let None  : UInt32 = 0 
    static let Player : UInt32 = 0b1  
    static let Object : UInt32 = 0b10  
} 

player.physicsBody = SKPhysicsBody(rectangleOfSize: player.size) // 1 
player.physicsBody?.dynamic = true // 2 
player.physicsBody?.categoryBitMask = PhysicsCategory.Player// 3 
player.physicsBody?.contactTestBitMask = PhysicsCategory.Object//4 
player.physicsBody?.collisionBitMask = PhysicsCategory.None // 5 
  1. 您設置SKPhysicsBody並使其
  2. 然後你讓你的動態玩家對象的大小。物理學家是動態的。
  3. 那就是categoryBitMask。這就像你的SKNode的標識符。所以其他SKNodes可以在你身上註冊並說:「嘿,我想知道我是否碰過那個人」。
  4. 這就是contactTestbitMask,它處理哪些SKNode應該與您進行交互。所以你說「如果這個節點碰到我,說點什麼」。
  5. 如果此節點發生碰撞,會發生什麼情況。

欲瞭解更多信息和一個不錯的入門教程,使用raywenderlichs tutorial.

+0

謝謝你,在那裏我會寫,如果節點碰撞,運行[殘局]? – bandoy123 2015-02-05 21:25:52

+0

此外,對象是否必須全局聲明? – bandoy123 2015-02-05 21:27:26

+0

我已經添加了一個指向教程的鏈接:http://www.raywenderlich.com/84434/sprite-kit-swift-tutorial-beginners。嘗試一下。這就是我開始用精靈套件編寫遊戲的過程,它非常棒。 – Christian 2015-02-05 21:32:23