Ios 两个精灵之间的碰撞检测不工作

Ios 两个精灵之间的碰撞检测不工作,ios,objective-c,swift,sprite-kit,Ios,Objective C,Swift,Sprite Kit,我试图检测玩家对象何时与游戏中的其他对象发生碰撞。这是我当前的代码: import SpriteKit class GameScene: SKScene { let player = SKSpriteNode(imageNamed: “Box”) override func didMoveToView(view: SKView) { backgroundColor = SKColor.whiteColor() player.position = CGPoint(x: siz

我试图检测玩家对象何时与游戏中的其他对象发生碰撞。这是我当前的代码:

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];
    }
}
问题在于,由于object和object 1变量是func(addObject)和func(addSecondObject)的私有变量,因此我无法在上述代码中调用它们。当它们发生碰撞时,当前我只希望运行EndGame(),在控制台中打印“游戏结束”


我不知道我所采用的碰撞检测方法是否正确,但任何帮助都将是巨大的!谢谢:)

对于非常基本的精灵,是的,没错。您可以想象,如果对角线图像“/”的左上角与某个对象重叠,即使实际对象没有重叠,也会触发碰撞

苹果在这里有一个很好的讨论冲突的页面:

此外,许多youtube视频都在谈论如何让这类事情运作起来。例如:

您需要使碰撞检测代码运行(可能在计时器或其他设备上运行),然后可能传入要检查的对象,或使这些对象成为类(IBOutlet)或类似策略的成员,以获得对它们的访问权。

您必须使用:

  • 您可以设置
    SKPhysicsBody
    ,并将其设置为播放器对象的大小
  • 然后你让它充满活力。身体是动态的
  • 这是
    类别的BitMask
    。这就像是你的SKNode的标识符。这样其他SKNodes就可以在你身上注册并说:“嘿,我想知道我是否碰过那个家伙。”
  • 这是contactTestbitMask,它处理哪些SKNodes应该与您交互。所以你说“如果那个节点碰到我,说点什么”
  • 如果此节点发生碰撞,将发生什么情况

  • 有关更多信息和一个不错的入门教程,请使用

    谢谢,如果节点发生碰撞,我将在哪里编写,请运行[endGame]?此外,是否必须全局声明对象?我添加了一个指向教程的链接:。试试看。这就是我如何开始使用sprite kit编程游戏的方法,它非常棒。我主要担心的是我没有使对象全局可访问,它们只能从其函数内调用,因此当我尝试将物理体添加到对象时,它无法访问它。将它们添加到函数外的类体中。就像这样:
    var yourNode:SKSpriteNode
    
    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