swift - SKEmitterNode iOS 8 vs iOS 9 如何获得相同的结果?

标签 swift sprite-kit ios9 skemitternode

我有一款类似于水果忍者的游戏,使用 Swift -> SpriteKit。在 iOS 8 上一切正常,但在 iOS 9 上 SKEmitterNode 有一点奇怪的行为。这是我对两者的 Blade 效应所得到的:

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 相同吗?

最佳答案

我在我的项目中遇到了完全相同的问题。 发射器在 iOS9 中的性能很低(Metal 版本没有完成?),所以 Apple 关闭了绘图的插值以稍微恢复性能(绘图速率限制为 60 fps,两帧之间的任何内容都不会渲染)。 我的方案是自己实现tail,很简单:

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
}

关于swift - SKEmitterNode iOS 8 vs iOS 9 如何获得相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32756899/

相关文章:

iOS项目的Swift Building IP 4地址类

swift - Swift 代码有没有办法检测它是否在 Playground 上运行?

ios - 修复 UITableView 中第一行的纵横比

objective-c - 在 SpriteKit 中使用 SKLabelNode 插入换行符

ios - 验证 podspec 时出错

iphone - 使用 CNContact 通过组搜索联系人

swift - 延迟 1 秒后或在调度异步中如何发布通知?

ios - 如何将单个 tileset 图像导入 xCode(Sprite Kit)?

ios - 阻止 SKSpriteNode 变慢

ios - viewControllerBeforeViewController 并不是每次都在 UIPageViewController 中被调用