问题描述
我在SpriteKit中工作,我从数组中获得了随机的Sprite,这些Sprite使用SKActions以一定的速度和频率从屏幕顶部向下移动。我正在尝试创建慢动作效果,使这些下降的精灵看起来下降得更慢,但继续以相同的距离下降,然后在五秒钟后恢复速度。更改精灵速度几秒钟后出现问题,某些精灵彼此之间的距离下降得更近,这表明每次向下移动之间的时间发生了变化。我不确定一次是否可能发生太多定时动作,并且精灵速度的变化会影响这些动作吗?
let spriteArray = [SKSpriteNode]()
let movingArray = [SKSpriteNode]()
var slowMotion = false
override func didMove(to view: SKView) {
func createSprites()
func moveSprite()
}
func createSprites(){
for _ in 0...10 {
let sprite = SKSpriteNode(color: .red,size: CGSize(width: 10,height: 10)
sprite.position = CGPoint(x: self.size.width/2,y: self.size.height + sprite.size.height)
sprite.zPosition = 1
self.addChild(sprite)
spriteArray.append(sprite)
}
}
func moveSprite(){
let sprite = spriteArray.randomElement()
spriteArray.remove(at: spriteArray.firstIndex(of: sprite))
movingArray.append(sprite)
if slowMotion == true {
sprite.speed = 0.5
}
let moveSprite = SKAction.moveTo(y: -self.size.height * 0.1,duration: 3)
let returnSprite = SKAction.run { [weak self] in
guard let self = self else { return }
sprite.speed = 1
sprite.removeAllActions()
sprite.position.y = CGFloat(self.size.height + sprite.size.height)
self.spriteArray.append(sprite)
self.movingArray.remove(at: self.movingArray.firstIndex(of: sprite))
}
let spriteSequence = SKAction.sequence([moveSprite,returnSprite])
sprite.run(spriteSequence,withKey: "movingDown")
let wait = SKAction.wait(forDuration: 1 )
let moveNextSprite = SKAction.run {
[weak self] in
guard let self = self else { return }
self.moveSprite()
}
self.run(SKAction.sequence([wait,moveNextSprite])
}
func slowMotion(){
let slowDown = SKAction.run {
[weak self] in
guard let self = self else { return }
self.slowMotion = true
for sprite in self.movingArray{
sprite.speed = 0.5
sprite.action(forKey: "movingDown")?.speed = 0.5
}
}
let wait = SKAction.wait(forDuration: 5)
let resumeSpeed = SKAction.run {
[weak self] in
guard let self = self else { return }
self.slowMotion = false
for sprite in self.movingArray{
sprite.speed = 1
sprite.action(forKey: "movingDown")?.speed = 1
}
}
let slowMotionSequence = SKAction.sequence([slowDown,wait,resumeSpeed])
world.run(slowMotionSequence,withKey: "slowMotion")
}
override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) {
for touch: AnyObject in touches {
if slowMotion == false {
slowMotion()
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)