В настоящее время делаю SoloProject для класса и решил изучать SpriteKit самостоятельно.Я решил сделать нисходящий зомби-шутер, и у меня много вопросов, но пока это два основных вопроса, которые я не могу исправить или найти решение.
Проблема 1
Зомби замедляются по мере приближения к цели. Если я увеличиваю скорость, они просто ускоряются с экрана и продолжают замедляться по мере приближения (я где-то читал, что эта функция в обновлении плохая, но я все ещесделал это ...)
Я хочу сделать так, чтобы они появлялись там со скоростью 3, а когда игрок двигается ближе или дальше, он остается на 3. (В настоящее время, используя аналоговый код, я обнаружил, чтона Youtube для перемещения моего персонажа)
func zombieAttack() {
let location = player.position
for node in enemies {
let followPlayer = SKAction.move(to: player.position, duration: 3)
node.run(followPlayer)
//Aim
let dx = (location.x) - node.position.x
let dy = (location.y) - node.position.y
let angle = atan2(dy, dx)
node.zRotation = angle
//Seek
let velocityX = cos(angle) * 1
let velocityY = sin(angle) * 1
node.position.x += velocityX
node.position.y += velocityY
}
}
override func update(_ currentTime: TimeInterval) {
zombieAttack()
}
Задача 2
Также, когда несколько зомби приближаются к игрокам (функция выше), они начинают ослеплять, поэтому я позволил им перекрываться сверхудруг друга, чтобы остановить spazzing.
Я хочу сделать это там, где они более прочные?если это правильный способ описать это.По сути, я хочу, чтобы они собрались вокруг игрока **.
Если я добавлю врага к столкновению, он будет стремительно попасть в ту же позицию.
private func spawnZombie() {
let xPos = randomPosition(spriteSize: gameSpace.size)
let zombie = SKSpriteNode(imageNamed: "skeleton-idle_0")
zombie.position = CGPoint(x: -1 * xPos.x, y: -1 * xPos.y)
zombie.name = "Zombie\(zombieCounter)"
zombie.zPosition = NodesZPosition.enemy.rawValue
let presetTexture = SKTexture(imageNamed: "skeleton-idle_0.png")
zombie.physicsBody = SKPhysicsBody(texture: presetTexture, size: presetTexture.size())
zombie.physicsBody?.isDynamic = true
zombie.physicsBody?.affectedByGravity = false
zombie.physicsBody?.categoryBitMask = BodyType.enemy.rawValue
zombie.physicsBody?.contactTestBitMask = BodyType.bullet.rawValue
zombie.physicsBody?.collisionBitMask = BodyType.player.rawValue
zombie.zRotation = 1.5
zombie.setScale(0.2)
enemies.append(zombie)
zombieCounter += 1
run(SKAction.playSoundFileNamed("ZombieSpawn", waitForCompletion: false))
keepEnemiesSeperated() // ADDED FROM UPDATED EDIT*
addChild(zombie)
}
Дайте мне знать, если мне нужно выложить больше кода или объяснить его лучше, я 'Прошло пять месяцев на изучение Swift, и у меня всего полторы недели опыта в SpriteKit и первая публикация на StackOverFlow.Спасибо всем заранее!
РЕДАКТИРОВАТЬ: я использую код, который я нашел из , с узла следуют с постоянной скоростью , но я не думаю, что я делаю это правильно, так как этоне работает.Я добавил следующий код:
private func keepEnemiesSeparated() {
// Assign constrain
for enemy in enemies {
enemy.constraints = []
let distanceBetween = CGFloat(60)
let constraint = SKConstraint.distance(SKRange(lowerLimit: distanceBetween), to: enemy)
enemy.constraints!.append(constraint)
}
}