#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, спасибо за всю помощь