2015-09-24 3 views
3

У меня есть игра, похожая на фруктовый ниндзя с помощью Swift -> SpriteKit. Все работает отлично на iOS 8, но на iOS 9 SKEmitterNode имеет немного странное поведение. Это то, что я получаю для моего эффекта лопаточной как:SKEmitterNode iOS 8 vs iOS 9 Как получить тот же результат?

enter image description here

func emitterNodeWithColor(color:UIColor)->SKEmitterNode { 
let emitterNode:SKEmitterNode = SKEmitterNode() 
emitterNode.particleTexture = SKTexture(imageNamed: "spark.png") 
emitterNode.particleBirthRate = 3000 
emitterNode.particleLifetime = 0.2 
emitterNode.particleLifetimeRange = 0 

emitterNode.particlePositionRange = CGVectorMake(0.0, 0.0) 

emitterNode.particleSpeed = 0.0 
emitterNode.particleSpeedRange = 0.0 

emitterNode.particleAlpha = 0.8 
emitterNode.particleAlphaRange = 0.2 
emitterNode.particleAlphaSpeed = -0.45 

emitterNode.particleScale = 0.5 
emitterNode.particleScaleRange = 0.001 
emitterNode.particleScaleSpeed = -1 

emitterNode.particleRotation = 0 
emitterNode.particleRotationRange = 0 
emitterNode.particleRotationSpeed = 0 

emitterNode.particleColorBlendFactor = 1 
emitterNode.particleColorBlendFactorRange = 0 
emitterNode.particleColorBlendFactorSpeed = 0 

emitterNode.particleColor = color 
emitterNode.particleBlendMode = SKBlendMode.Add 

return emitterNode 

}

let emitter:SKEmitterNode = emitterNodeWithColor(color) 
emitter.targetNode = target 
emitter.zPosition = 0 
tip.addChild(emitter) 

Это метод я использую со всеми опциями. То же самое для обоих, но результат другой. Любые идеи, как я могу сделать эффект в iOS 9 таким же, как iOS 8?

ответ

2

Я столкнулся с одной и той же проблемой в своем проекте. Производительность излучателя низкая в iOS9 (металлическая версия не закончена?), Поэтому Apple отключила интерполяцию чертежа, чтобы немного улучшить производительность (скорость рисования ограничена до 60 кадров в секунду, что-то между двумя кадрами не отображается) , Моего решения реализовать хвост самого, который прост:

class TailNode: SKSpriteNode { 

var tailTexture: SKTexture! 
var tailSize: CGSize! = CGSizeMake(30, 30) 
var tailColor: SKColor! 
var tailBlendMode: SKBlendMode! 
var initialAlpha: CGFloat = 0.6 
var initialScale: CGFloat = 0 
var finalScale: CGFloat = 1 
var particleLife: NSTimeInterval = 0.1 

var running: Bool = false 
var particleAction: SKAction! 
var lastParticle: SKSpriteNode? 

var battleScene: BattleScene { 
    return self.scene as! BattleScene 
} 

convenience init(tailTexture: SKTexture, tailSize: CGSize, tailColor: SKColor, tailBlendMode: SKBlendMode, initialAlpha: CGFloat, initialScale: CGFloat, finalScale: CGFloat, particleLife: NSTimeInterval) { 
    self.init(texture: nil, color: SKColor.whiteColor(), size: CGSize(width: 0, height: 0)) 
    self.tailTexture = tailTexture 
    self.tailSize = tailSize 
    self.tailColor = tailColor 
    self.tailBlendMode = tailBlendMode 
    self.initialAlpha = initialAlpha 
    self.initialScale = initialScale 
    self.finalScale = finalScale 
    self.particleLife = particleLife 

    let fadeAction = SKAction.fadeAlphaTo(0, duration: particleLife) 
    let scaleAction = SKAction.scaleTo(finalScale, duration: particleLife) 
    let removeAction = SKAction.removeFromParent() 
    self.particleAction = SKAction.sequence([SKAction.group([fadeAction, scaleAction]), removeAction]) 
} 

func updateWithTimeSinceLastUpdate(interval: NSTimeInterval) { 
    if running { 
     let particlePosition = battleScene.convertPoint(battleScene.convertPoint(self.position, fromNode: self.parent!), 
                toNode:battleScene.worldLayers[.UnderCharacter]!) 
     if lastParticle == nil || lastParticle!.parent == nil { 
      lastParticle = nil 
     } else { 
      let lastPosition = lastParticle!.position 
      let x = lastPosition.x + (particlePosition.x - lastPosition.x)*0.5 
      let y = lastPosition.y + (particlePosition.y - lastPosition.y)*0.5 
      newParticleAtPosition(CGPointMake(x, y), withDelay: interval*0.5) 
     } 
     lastParticle = newParticleAtPosition(particlePosition, withDelay: interval) 
    } 
} 

func newParticleAtPosition(position: CGPoint, withDelay delay: NSTimeInterval) -> SKSpriteNode { 
    let myParticle = SKSpriteNode(texture: tailTexture, color: tailColor, size: tailSize) 
    myParticle.colorBlendFactor = 1 
    myParticle.blendMode = tailBlendMode 
    myParticle.alpha = initialAlpha 
    myParticle.setScale(initialScale) 
    myParticle.position = position 
    battleScene.addNode(myParticle, atWorldLayer: .UnderCharacter) 
    myParticle.runAction(SKAction.sequence([SKAction.waitForDuration(delay), particleAction])) 
    return myParticle 
} 

}

+0

Я попытался после этого, и слегка модифицировал его для моей игры, но следующая строка не будет работать 'GameScene .convertPoint (GameScene.convertPoint (self.position, fromNode: self.parent!), toNode: GameScene.worldLayers [.UnderCharacter]!) ' –