У меня есть простая игра, которую я пишу для iOS с помощью Swift. В игре персонажу необходимо собирать предметы. У меня есть следующие настройки в файле Swift для основного игрока:
import SpriteKit
struct ColliderType {
static let Player: UInt32 = 1
static let Ground: UInt32 = 2
static let Collectables: UInt32 = 3
}
class Player: SKSpriteNode {
func initialize() {
var walk = [SKTexture]()
for i in 1...16 {
let name = "Kidwalk\(i)"
walk.append(SKTexture(imageNamed: name))
}
let walkAnimation = SKAction.animate(with: walk, timePerFrame: 0.095, resize: true, restore: true)
self.name = "Player"
self.physicsBody = SKPhysicsBody(rectangleOf: self.size)
self.physicsBody?.affectedByGravity = true
self.physicsBody?.allowsRotation = false
self.physicsBody?.categoryBitMask = ColliderType.Player
self.physicsBody?.collisionBitMask = ColliderType.Ground | ColliderType.Collectables
self.position = CGPoint(x: 0, y: 0)
self.zPosition = 5
self.run(SKAction.repeatForever(walkAnimation))
self.xScale = CGFloat(0.4)
self.yScale = CGFloat(0.4)
}
func jump() {
self.physicsBody?.velocity = CGVector(dx: 0, dy: 0)
self.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 500))
}
}
В основном файле GameplayScene.swift я установил следующую константу:
let phone = SKSpriteNode()
Изатем я создаю объект следующим образом:
func createPhone() {
var ring = [SKTexture]()
for i in 1...7 {
let name = "phone\(i)"
ring.append(SKTexture(imageNamed: name))
}
let ringAnimation = SKAction.animate(with: ring, timePerFrame: 0.095, resize: true, restore: true)
phone.name = "Phone"
phone.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: phone.size.width / 2, height: phone.size.height / 2))
phone.physicsBody?.affectedByGravity = true
phone.physicsBody?.allowsRotation = false
phone.physicsBody?.categoryBitMask = ColliderType.Player
phone.physicsBody?.collisionBitMask = ColliderType.Ground | ColliderType.Collectables
phone.position = CGPoint(x: 300, y: -50)
phone.zPosition = 5
phone.run(SKAction.repeatForever(ringAnimation))
phone.xScale = CGFloat(0.7)
phone.yScale = CGFloat(0.7)
let move = SKAction.moveTo(x: -(self.frame.size.width * 2), duration: 15)
let remove = SKAction.removeFromParent()
let sequence = SKAction.sequence([move, remove])
phone.run(sequence)
addChild(phone)
}
Я вызываю createPhone () в функции didMove вверху.
И, наконец, у меня есть эта настройка для обнаружения столкновений:
func didBegin(_ contact: SKPhysicsContact) {
var firstBody = SKPhysicsBody();
var secondBody = SKPhysicsBody();
if contact.bodyA.node?.name == "Player" {
firstBody = contact.bodyA;
secondBody = contact.bodyB;
} else {
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
if firstBody.node?.name == "Player" && secondBody.node?.name == "Ground" {
canJump = true;
print("canjump")
} else if firstBody.node?.name == "Player" && secondBody.node?.name == "Phone" {
print("Collect)
}
}
Очевидно, что что-то в корне неверно, потому что обнаружено столкновение между землей и плеером, но не между телефоном и плеером.
Я полагаю, что я настроил структуруправильно, я проверил битовые маски и категории коллизий всех узлов, и я не могу понять, где я иду не так.
Любая помощь будет принята с благодарностью.