这是我不得不从过时的博客帖子中更新的代码
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
}
发布于 2018-08-30 13:47:43
这里有几件事:
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 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)
https://stackoverflow.com/questions/52090595
复制相似问题