Игра с препятствиями на спрайтах — проблемы с физическим телом

#ios #swift #sprite-kit #game-physics #skphysicsbody

#iOS #swift #sprite-kit #игра-физика #skphysicsbody

Вопрос:

Я создал простую 2D-аркадную игру с использованием SpriteKit и пытаюсь добавить систему подсчета очков. По сути, игра представляет собой квадратный спрайт, который должен перепрыгивать через различные препятствия.

То, что я пробовал до сих пор, — это создание SKSpriteNode(), который добавляет 1 к метке счетчика очков, когда он контактирует с физическим телом игрока. Моя проблема в том, что, когда они контактируют друг с другом, спрайт игрока плавает над физическим телом разрыва. Я установил для него collisionBitMask значение 0 и сделал его isDynamic = false. Кто-нибудь может помочь?

Итак, вот код моего gap

     var gap = SKNode()

    gap.position = CGPoint(x: obstacle.position.x, y:  platform.position.y   210)

    gap.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 30, height:  70))

    gap.physicsBody!.isDynamic = true
    gap.physicsBody!.affectedByGravity = false

    gap.physicsBody?.contactTestBitMask = PhysicsCategory.Player
    gap.physicsBody?.categoryBitMask = PhysicsCategory.Gap
    gap.physicsBody?.collisionBitMask = PhysicsCategory.None


    gap.physicsBody?.restitution = 0
    gap.physicsBody?.friction = 0

    self.addChild(gap)
  

И вот мой код для игроков

     let playerTexture = SKTexture(imageNamed: "white.jpg")

    player = SKSpriteNode(texture: playerTexture)

    player.size = CGSize(width: 40, height: 40)

    player.physicsBody = SKPhysicsBody(rectangleOf: player.size)

    player.physicsBody!.isDynamic = false

    player.position = CGPoint(x: self.frame.midX - 100 , y: self.frame.midY   50 )

    player.physicsBody!.restitution = 0

    player.physicsBody!.friction = 0


    player.physicsBody?.categoryBitMask = PhysicsCategory.Player
    player.physicsBody?.contactTestBitMask = PhysicsCategory.Obstacles | PhysicsCategory.Gap
    player.physicsBody?.collisionBitMask = PhysicsCategory.Obstacles | PhysicsCategory.Floor

    self.addChild(player)
  

Категория физики

 struct PhysicsCategory {
static let None      : UInt32 = 0
static let Obstacles : UInt32 = 0b1     // 1
static let Player    : UInt32 = 0010
static let Floor     : UInt32 = 0100
static let Gap       : UInt32 = 1000
  

}

Комментарии:

1. Попробуйте установить isDynamic = true . Вам нужно, чтобы спрайт был динамичным, чтобы он работал physicsBodies

2. @Nik только что попробовал это. Я все еще получаю тот же результат

3. Постарайтесь быть более описательным в своем вопросе и добавьте код, чтобы мы могли увидеть проблему

4. Хорошо, я займусь этим, когда вернусь домой, спасибо

5. Хорошо, я добавил код моего игрока и моего gap, спасибо за всю помощь