【问题标题】:didbegincontact not called spritekitdidbegincontact 不叫 spritekit
【发布时间】:2017-02-18 21:19:32
【问题描述】:

我的代码是这样的

class GameScene: SKScene, SKPhysicsContactDelegate {
    var player: SKSpriteNode!
    var player2: SKSpriteNode!
    var initialplayerposition : CGPoint!

override func didMove(to view: SKView) {
    self.physicsWorld.gravity = CGVector(dx:0, dy:0)
    self.physicsWorld.contactDelegate = self
    addplayer()
    addRow(type: .threeS)
}    
func addRandomRow () {
    let randomNumber = Int(arc4random_uniform(6))
    switch randomNumber {
    case 0 :
        addRow(type: RowType(rawValue:0)!)
        break
    case 1:
        addRow (type: RowType(rawValue: 1)!)
    case 2 :
        addRow(type: RowType(rawValue:2)!)
        break
    case 3 :
        addRow(type: RowType(rawValue:3)!)
        break
    case 4 :
        addRow(type: RowType(rawValue:4)!)
        break
    case 5 :
        addRow(type: RowType(rawValue:5)!)
        break
    default:
        break

    }
}
var lastTimeIntervall = TimeInterval ()
var lastTimeYield = TimeInterval()

func updateWithTimeSinceLastUpdate (timeSinceLastUpdate:CFTimeInterval){
    lastTimeYield += timeSinceLastUpdate
    if (lastTimeYield > 0.6){
        lastTimeYield = 0
        addRandomRow()
    }
}
override func update(_ currentTime: TimeInterval) {
    var timeSinceLastUpdate = currentTime - lastTimeIntervall
    lastTimeIntervall = currentTime
    if timeSinceLastUpdate > 1 {
        timeSinceLastUpdate = 1 / 60
        lastTimeIntervall = currentTime

    }
    updateWithTimeSinceLastUpdate (timeSinceLastUpdate: timeSinceLastUpdate)
    // Called before each frame is rendered
}

 func didBeginContact(contact: SKPhysicsContact) {

    if contact.bodyA.node?.name == "Player" {
        print("gameover")
    }
}}

这是我在另一个文件中创建的元素

func addplayer()  {
    player = SKSpriteNode(color: UIColor.red, size:CGSize(width:50, height:50))
    player.position = CGPoint(x:self.size.width / 2 , y: 350)
    player.name = "PLAYER"
    player.physicsBody?.isDynamic = false
    player.physicsBody = SKPhysicsBody(rectangleOf: player.size)
    player.physicsBody?.categoryBitMask = UInt32(CollisionBitMask.Player)
    player.physicsBody?.collisionBitMask =  0
    player.physicsBody?.contactTestBitMask = UInt32(CollisionBitMask.Obstacle)

这里是障碍代码

   func addObstacle(type:ObstacleType) ->  SKSpriteNode {

    let Obstacle = SKSpriteNode(color: UIColor.white, size: CGSize(width:0, height:30))
    Obstacle.name = "OBSTACLE"
    Obstacle.physicsBody?.isDynamic = true

    switch type {
    case .Small:
        Obstacle.size.width = self.size.width * 0.2
        break
    case.Medium:
        Obstacle.size.width = self.size.width * 0.35
        break
    case .Large:
        Obstacle.size.width = self.size.width * 0.75
        break
    }

    Obstacle.position = CGPoint(x:0, y : self.size.height + Obstacle.size.height)
    Obstacle.physicsBody = SKPhysicsBody(rectangleOf: Obstacle.size)
    Obstacle.physicsBody?.categoryBitMask = UInt32(CollisionBitMask.Obstacle)
    Obstacle.physicsBody?.collisionBitMask = 0


    return Obstacle}

【问题讨论】:

  • 你还没有设置你的physicsBodies位掩码
  • @Nik 我有 struct CollisionBitMask { static let Player:UInt = 0*00 static let Obstacle:UInt = 0*01 } 但它也不起作用
  • 尝试使用 0b10 和 0b1 而不是 0*01 和 0*00(我不使用零,因为那是不属于碰撞/接触的一部分。此外,至少其中一个physicsBodies 必须是动态的,碰撞/接触才能起作用。另一个问题是,您需要两个节点都具有 PhysicsBodies,并且都应该具有要设置的位掩码
  • 障碍物(第二个元素)已经是动态的,但是使用 0b1 并不能解决问题
  • @Nik,我已经为他们提供了在特定聊天中写入的权限。

标签: sprite-kit swift3


【解决方案1】:

这是我的一个愚蠢的错误,didBegin 函数在 swift3 中应该是这样的

func didBegin(_ contact: SKPhysicsContact) {
    if (contact.bodyA.node?.name == "PLAYER"){
        print("gameover")
      }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多