Игрок проходит через платформу

функция игрока

@objc func playerFunction(){
    
    player = SKSpriteNode(imageNamed: "Player")
    player.name = "Hero"
    player.size = CGSize(width: 80, height: 80)
    player.physicsBody = SKPhysicsBody(rectangleOf: player.size)
    player.physicsBody?.affectedByGravity = false
    player.physicsBody?.isDynamic = false
    player.physicsBody?.allowsRotation = false
    player.physicsBody!.categoryBitMask = 1
    player.physicsBody!.collisionBitMask = 0
    player.physicsBody!.contactTestBitMask = 2 | 5 | 6 | 7
    player.physicsBody?.velocity.dx = 0
    player.physicsBody?.velocity.dy = 0
    player.zPosition = 1
    player.position = CGPoint(x: self.frame.width / 2 - 700, y: self.frame.height / 2 - player.frame.height)
    self.addChild(player)
    
}

платформенный метод

@objc func platformFunction (){

    platform_One = SKSpriteNode(imageNamed: "Platform")
    platform_One.physicsBody = SKPhysicsBody(rectangleOf: platform_One.size)
    platform_One.physicsBody?.affectedByGravity = false
    platform_One.physicsBody?.isDynamic = false
    platform_One.zPosition = 4
    platform_One.position = CGPoint(x: 1 + self.frame.width / 2 - 570, y: self.frame.height / 2 - 260)
    self.addChild(platform_One)
    
    
    platform_Two = SKSpriteNode(imageNamed: "Platform")
    platform_Two.physicsBody = SKPhysicsBody(rectangleOf: platform_Two.size)
    platform_Two.physicsBody?.affectedByGravity = false
    platform_Two.physicsBody?.isDynamic = false
    platform_Two.physicsBody!.categoryBitMask = 7
    platform_Two.physicsBody!.collisionBitMask = 1
    platform_Two.physicsBody!.contactTestBitMask = 1
    platform_Two.zPosition = 5
    platform_Two.position = CGPoint(x: 1 + self.frame.width / 2 - 420, y: self.frame.height / 2 - 260)
    self.addChild(platform_Two)

Метод игрока и код метода платформы добавлены выше, и игрок не приземляется на платформу, вместо этого игрок проходит через платформу, хотя физика была указана выше.


person OptiCode22    schedule 18.04.2021    source источник
comment
Вы не установили collisionBitMask ни для игрока, ни для первой платформы. Это может быть проблемой. Кроме того, маски 2 | 5 | 6 | 7 - это неправильный способ ведения дел - числа должны быть степенями 2 (например, 1, 2, 4, 8, 16, ...). См. этот ответ для получения дополнительной информации.   -  person George_E    schedule 18.04.2021
comment
Как мне установить это правильно?   -  person OptiCode22    schedule 18.04.2021
comment
Это побитовые маски (поищите в Google, чтобы узнать, что это такое). По сути, они должны быть степенью двойки, как указано в последнем вопросе, и перейдите по ссылке на ответ в моем комментарии выше, который должен решить эту проблему.   -  person George_E    schedule 18.04.2021
comment
Я считаю, что по крайней мере одно из ваших физических тел должно иметь флаг isDynamic, установленный в true, иначе столкновения между ними не будут распознаны.   -  person JohnL    schedule 19.04.2021