在SpriteKit中跟随的敌人会加班加点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在SpriteKit中跟随的敌人会加班加点相关的知识,希望对你有一定的参考价值。

这是我必须更新和过时的博客文章的代码

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

}
}

我想知道如果敌人存在的时间越长,我就会越来越接近目标。

我尝试使用a每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和2 pi之间建立一个随机角度,我猜测在0到2000之间的随机半径,然后使用CGPoint(x:cos(angle) * radius, y:sin(angle) * radius)设置你的位置

2)你的lowerRate将在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)

以上是关于在SpriteKit中跟随的敌人会加班加点的主要内容,如果未能解决你的问题,请参考以下文章

在屏幕上的 3 个特定位置生成敌人 Swift SpriteKit IOS

SpriteKit - 如何检测使用触摸影响哪个节点?

如何在每 10 秒内添加一个敌人并让这个敌人跟踪您的位置并跟随它

通过复制玩家位置跟随玩家的幽灵敌人 AI

如何让一条线跟随触摸而不是在 spritekit 中绘制无限?

在SpriteKit中产生敌人的波浪