SKNodes следуют с постоянной скоростью и мешают им spazzing? - PullRequest
1 голос
/ 12 марта 2019

В настоящее время делаю 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)
    }
}

1 Ответ

0 голосов
/ 12 марта 2019

Проблема 1, ваш зомби движется в зависимости от времени, а не с заданной скоростью.Согласно вашему коду он всегда доберется до игрока через 3 секунды.Это означает, что если он на расстоянии 1 фута, ему нужно 3 секунды.Если он в 100 милях, ему нужно 3 секунды.Вам нужно использовать динамическую продолжительность, если вы планируете использовать SKAction moveTo в зависимости от скорости зомби.Поэтому, если ваш зомби перемещается на 10 очков в секунду, вы хотите рассчитать расстояние от зомби до игрока, а затем разделить на 10. В основном, ваша формула продолжительности должна быть distance / speed

Задача 2, если вы хотитезомби, чтобы сформировать линию, вам нужно будет определить, кто является ведущим зомби, и заставить каждого зомби следовать за следующим ведущим зомби, в отличие от всех зомби, следующих за игроком.В противном случае ваш другой вариант - не допустить перекрытия зомби, но опять же, у вас все равно будет больше ямы, чем линии.

...