2015-04-21 55 views
0

哎,所以我有一个问题检测碰撞。我有这个项目是基于Ray Wenderlich的关于如何制作像Mega Jump这样的游戏的教程。所以一开始平台和恒星在一个地方是静止的,一切都很好。但是当你在比赛中走得更远,恒星和平台开始移动(我使用SKActions此),试图做到这一点使它有点困难。但是当我到达那里时,碰撞不会被检测到,玩家只是通过像他们不在那里的物体。我一直在网上阅读,我正在使用精确的碰撞检测,但我仍然没有看到任何区别。关于什么可能是错误的或者我可以做什么的任何想法?下面是我如何做这一点代码:如何检测两个快速移动物体之间的碰撞?

player = SKSpriteNode(texture: firstFrame) 
    player.position = (CGPoint(x: self.size.width/2, y: 50.0)) 
    player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width/2) 
    player.physicsBody?.dynamic = true 
    player.physicsBody?.allowsRotation = false 
    player.physicsBody?.restitution = 1.0 
    player.physicsBody?.friction = 0.0 
    player.physicsBody?.angularDamping = 0.0 
    player.physicsBody?.linearDamping = 0.0 
    player.physicsBody?.usesPreciseCollisionDetection = true 
    player.physicsBody?.categoryBitMask = CollisionCategoryBitmask.Player 
    player.physicsBody?.collisionBitMask = 0 
    player.physicsBody?.contactTestBitMask = CollisionCategoryBitmask.Star | CollisionCategoryBitmask.Platform | CollisionCategoryBitmask.Monster 
    foregroundNode.addChild(player) 

func createPlatformAtPosition(position: CGPoint, ofType type: PlatformType) -> PlatformNode { 

    let node = PlatformNode() 
    let thePosition = CGPoint(x: position.x * scaleFactor, y: position.y) 
    node.position = thePosition 
    node.name = "NODE_PLATFORM" 
    node.platformType = type 

    var sprite: SKSpriteNode 
    var spriteFrames : [SKTexture]! 
    if type == .Break { 

     let spriteAnimatedAtlas = SKTextureAtlas(named: "CloudBreak") 
     var cloudFrames = [SKTexture]() 
     spriteFrames = cloudFrames 
     let firstFrame = SKTexture(imageNamed: "Cloud02") 
     sprite = SKSpriteNode(texture: firstFrame) 

     let move = SKAction.moveToX(self.position.x - 160.0, duration:2.0) 
     let back = SKAction.moveToX(self.position.x, duration:2.0) 
     let sequence = SKAction.sequence([move, back, move, back]) 
     sprite.runAction(SKAction.repeatActionForever(sequence)) 

    } else {  
     let spriteAnimatedAtlas = SKTextureAtlas(named: "Cloud") 
     var cloudFrames = [SKTexture]() 
     spriteFrames = cloudFrames 
     let firstFrame = SKTexture(imageNamed: "Cloud") 
     sprite = SKSpriteNode(texture: firstFrame) 

    } 

    node.addChild(sprite) 
    node.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size) 
    node.physicsBody?.dynamic = false 
    node.physicsBody?.categoryBitMask = CollisionCategoryBitmask.Platform 
    node.physicsBody?.contactTestBitMask = CollisionCategoryBitmask.Player 
    node.physicsBody?.collisionBitMask = 0 

    return node 
} 

func didBeginContact(contact: SKPhysicsContact) { 

    var updateHUD = false 
    let whichNode = (contact.bodyA.node != player) ? contact.bodyA.node : contact.bodyB.node 
    let other = whichNode as GameObjectNode 
    updateHUD = other.collisionWithPlayer(player) 

} 

    struct CollisionCategoryBitmask { 
     static let Player: UInt32 = 0x00 
     static let Star: UInt32 = 0x01 
     static let Platform: UInt32 = 0x02 
     static let Monster: UInt32 = 0x03 
      } 
+0

发布您的代码。 –

+0

在那里,它是@Alan_s – Thesaurus03

回答

0

碰撞检测不到,因为你没有设置collisionBitMask

player.physicsBody?.collisionBitMask = CollisionCategoryBitmask.Star | CollisionCategoryBitmask.Platform | CollisionCategoryBitmask.Monster 
node.physicsBody?.collisionBitMask = CollisionCategoryBitmask.Player 

接触和碰撞不是一回事。您可以在网上找到更多信息。

如果它仍然不起作用,请告诉我们您的CollisionCategoryBitmask以确保您正确创建它。

编辑:

struct CollisionCategoryBitmask { 
    static let Player: UInt32 = 0 
    static let Star:  UInt32 = 0b1 
    static let Platform: UInt32 = 0b10 
    static let Monster: UInt32 = 0b100 
} 

下面是我为another question做了一桌,可以帮助你太: http://goo.gl/7D8EGY

+0

嘿@lchamp谢谢!但是那也行不通。我添加了我的Collision CategoryBitmask让你看到它。 – Thesaurus03

+0

你的'Monster'位掩码是_incorrect_。检查我的编辑,让我知道它是否工作。 – lchamp

+0

谢谢@lchamp,但仍然没有解决我的问题!玩家仍然通过移动物体而没有检测到碰撞。事情是,一切正常开始时正常工作,当物体开始移动,当碰撞停止工作。 – Thesaurus03

0

慢下来的对象,看看他们是否发生碰撞。我遇到了一个问题,那就是我在快速移动节点时,在新帧被渲染时它们已经过了碰撞点。如果他们移动得太快,他们会在帧周期内传递彼此的物理体,他们不会注册一个命中。

为了检测这种情况下发生碰撞时,你可以比较他们在每一帧,如果他们通过对方或自己的X/Y平面值重叠,你可以执行你的碰撞代码。

+0

谢谢,我该怎么做?事情是我从Plist加载对象,我已经试图减慢它们几乎不动,它仍然不工作! – Thesaurus03