2015-02-05 182 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