Враги, следующие в SpriteKit, становятся ближе со временем - PullRequest
0 голосов
/ 30 августа 2018

Это код, который мне пришлось обновить и устаревшее сообщение в блоге

import SpriteKit

class CreateEnemies {

var enemySprites: [SKSpriteNode] = []
static var lowerRate = 120
static var upperRate = 250

func spawnEnemy(targetSprite: SKNode) -> SKSpriteNode {

    // create a new enemy sprite
    let newEnemy = SKSpriteNode(imageNamed:"sharkshark")
    enemySprites.append(newEnemy)
    newEnemy.size = CGSize(width: 35, height: 35)

    let randomXStart = CGFloat(arc4random_uniform(UInt32(2000 - (-2000)))) + CGFloat(-2000)
    let randomYStart = CGFloat(arc4random_uniform(UInt32(2000 - (-2000)))) + CGFloat(-2000)
    let xInt = Int(randomXStart)
    let yInt = Int(randomYStart)
    newEnemy.position = CGPoint(x: xInt, y: yInt)

    // Define Constraints for orientation/targeting behavior
    let i = enemySprites.count-1
    let rangeForOrientation = SKRange(constantValue:CGFloat(M_2_PI*7))
    let orientConstraint = SKConstraint.orient(to: targetSprite, offset: rangeForOrientation)
    let rangeToSprite = SKRange(lowerLimit: CGFloat(CreateEnemies.lowerRate), upperLimit: CGFloat(CreateEnemies.upperRate))
    var distanceConstraint: SKConstraint

    // First enemy has to follow spriteToFollow, second enemy has to follow first enemy, ...
    if enemySprites.count-1 == 0 {
        distanceConstraint = SKConstraint.distance(rangeToSprite, to: targetSprite)
    } else {
        distanceConstraint = SKConstraint.distance(rangeToSprite, to: enemySprites[i-1])
    }
    newEnemy.constraints = [orientConstraint, distanceConstraint]

    return newEnemy

}
}

Мне было интересно, как заставить врагов приближаться к цели постепенно, чем дольше они существуют.

Я пытался менять переменные каждые 5 секунд, используя

let wait5 = SKAction.wait(forDuration: 5)
    let getCloser = SKAction.repeatForever(SKAction.sequence([wait5, SKAction.run {self.changeRates()}]))
    self.run(getCloser)

и присоединение к нему для запуска функции

func changeRates() {
    CreateEnemies.lowerRate -= 25
    CreateEnemies.upperRate -= 25
}

1 Ответ

0 голосов
/ 30 августа 2018

Несколько вещей здесь:
1) ваш случайный случай основан на квадрате, а не на круге, поэтому вы увидите, что ваши враги появляются на углах больше, чем в центре каждой стороны экрана. Я бы порекомендовал сделать случайный угол между 0 и 2 пи, случайный радиус, который я предполагаю между 0 и 2000, а затем установить свою позицию с помощью CGPoint(x:cos(angle) * radius, y:sin(angle) * radius)

2) Ваша более низкая скорость будет отрицательной через 25 секунд, это может стать проблемой. Я бы использовал процент вместо:

lowerRate = lowerRateStart * percentage
percentage *= 0.90

Это уменьшит ваши спрайты на 10 процентов от их текущего местоположения, поэтому 90 81 73 64 58 52 47 42 38 34 31 28 25 22 20 18 16 14 13 12 11 10 9 8 7 6 5 4 ..... затем быть между 4 и 0 на некоторое время. Это в основном гарантирует, что ваше число приближается к нулю, но никогда не станет 0.

3) Ваш случайный старт и ограничение по расстоянию коррелируют неправильно, и это может вызвать проблемы. Я бы порекомендовал установить положение где-то внутри радиуса ограничения расстояния, поэтому ваши ставки должны быть:

let radius = CGFloat(arc4random_uniform(UInt32(upperRate - lowerRate)))
newEnemy.position = CGPoint(x:cos(angle) * radius + lowerRate + targetSprite.x, y:sin(angle) * radius + lowerRate + targetSprite.y)
...