【问题标题】:Slowing down particles of an SKEmitterNode减慢 SKEmitterNode 的粒子速度
【发布时间】:2017-01-23 11:54:12
【问题描述】:

我只是好奇,有没有办法减慢粒子沿着场景中的其他对象发射的速度。假设您有一个粒子发射器和一个精灵。使用SKAction 移动精灵。发射器正在发射。两个节点都添加到场景中。如果将self.speed 设置为 0.5,则只有精灵会变慢。发射器将继续以相同的速度发射。

除了使用particleSpeed 属性之外,还有其他方法可以减慢速度,因为这会改变发射器的行为。

我的问题受到这个问题的启发:https://stackoverflow.com/a/41764180/3402095

【问题讨论】:

  • 您想减慢粒子的运动粒子发射的速度吗?
  • @Confused 我认为(但这只是一个猜测,因为我还没有真正测试过)像你提议的东西每次都需要不同的发射器不同的值/数学,因为许多因素都涉及到粒子的移动。也许您可以写一个答案来准确显示您打算使用的值/数学?

标签: sprite-kit particles skemitternode


【解决方案1】:

通常SKEmitterNode 的速度涉及许多属性(xAccelerationyAccelerationparticleSpeedRangeparticleScaleSpeed..):

private func newExplosion() -> SKEmitterNode {
        let explosion = SKEmitterNode()
        let image = UIImage(named:"spark.png")!
        explosion.particleTexture = SKTexture(image: image)
        explosion.particleColor = SKColor.brown
        explosion.numParticlesToEmit = 100
        explosion.particleBirthRate = 450
        explosion.particleLifetime = 2
        explosion.emissionAngleRange = 360
        explosion.particleSpeed = 100
        explosion.particleSpeedRange = 50
        explosion.xAcceleration = 0
        explosion.yAcceleration = 0
        explosion.particleAlpha = 0.8
        explosion.particleAlphaRange = 0.2
        explosion.particleAlphaSpeed = -0.5
        explosion.particleScale = 0.75
        explosion.particleScaleRange = 0.4
        explosion.particleScaleSpeed = -0.5
        explosion.particleRotation = 0
        explosion.particleRotationRange = 0
        explosion.particleRotationSpeed = 0
        explosion.particleColorBlendFactor = 1
        explosion.particleColorBlendFactorRange = 0
        explosion.particleColorBlendFactorSpeed = 0
        explosion.particleBlendMode = SKBlendMode.add
        return explosion
    }

所以为了满足您的要求,我认为应该可以设置targetNode

/**
     Normally the particles are rendered as if they were a child of the SKEmitterNode, they can also be rendered as if they were a child of any other node in the scene by setting the targetNode property. Defaults to nil (standard behavior).
     */
    weak open var targetNode: SKNode?

更多详情可以联系苹果官方docs

一些代码示例:

class GameScene: SKScene {
    var myNode :SKSpriteNode!
    var myEmitter : SKEmitterNode!
    override func didMove(to view: SKView) {
        myNode = SKSpriteNode.init(color: .red, size: CGSize(width:100,height:100))
        self.addChild(myNode)
        myNode.position = CGPoint(x:self.frame.minX,y:self.frame.midY)
        let changePos = SKAction.run{
            [weak self] in
            guard let strongSelf = self else { return }
            if strongSelf.myNode.position.x > strongSelf.frame.maxX {
                strongSelf.myNode.position.x = strongSelf.frame.minX
            }
        }
        let move = SKAction.moveBy(x: 10.0, y: 0, duration: 0.5)
        let group = SKAction.group([move,changePos])
        myNode.run(SKAction.repeatForever(SKAction.afterDelay(1.0, performAction:group)))
        let showExplosion = SKAction.repeatForever(SKAction.afterDelay(3.0, performAction:SKAction.run {
            [weak self] in
            guard let strongSelf = self else { return }
            strongSelf.myEmitter = strongSelf.newExplosion()
            strongSelf.addChild(strongSelf.myEmitter)
            strongSelf.myEmitter.targetNode = strongSelf.myNode
            strongSelf.myEmitter.particleSpeed = strongSelf.myNode.speed
            print("emitter speed is: \(strongSelf.myEmitter.particleSpeed)")
            strongSelf.myEmitter.position = CGPoint(x:strongSelf.frame.midX,y:strongSelf.frame.midY)
            strongSelf.myEmitter.run(SKAction.afterDelay(2.0, performAction:SKAction.removeFromParent()))
        }))
        self.run(showExplosion)
    }
    private func newExplosion() -> SKEmitterNode {
        let explosion = SKEmitterNode()
        let image = UIImage(named: "sparkle.png")!
        explosion.particleTexture = SKTexture(image: image)
        explosion.particleColor = UIColor.brown
        explosion.numParticlesToEmit = 100
        explosion.particleBirthRate = 450
        explosion.particleLifetime = 2
        explosion.emissionAngleRange = 360
        explosion.particleSpeed = 100
        explosion.particleSpeedRange = 50
        explosion.xAcceleration = 0
        explosion.yAcceleration = 0
        explosion.particleAlpha = 0.8
        explosion.particleAlphaRange = 0.2
        explosion.particleAlphaSpeed = -0.5
        explosion.particleScale = 0.75
        explosion.particleScaleRange = 0.4
        explosion.particleScaleSpeed = -0.5
        explosion.particleRotation = 0
        explosion.particleRotationRange = 0
        explosion.particleRotationSpeed = 0
        explosion.particleColorBlendFactor = 1
        explosion.particleColorBlendFactorRange = 0
        explosion.particleColorBlendFactorSpeed = 0
        explosion.particleBlendMode = SKBlendMode.add
        return explosion
    }
    func randomCGFloat(_ min: CGFloat,_ max: CGFloat) -> CGFloat {
        return (CGFloat(arc4random()) / CGFloat(UINT32_MAX)) * (max - min) + min
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        myNode.speed = randomCGFloat(0.0,50.0)
        print("new speed is: \(myNode.speed)")
    }
}
extension SKAction {
    class func afterDelay(_ delay: TimeInterval, performAction action: SKAction) -> SKAction {
        return SKAction.sequence([SKAction.wait(forDuration: delay), action])
    }
    class func afterDelay(_ delay: TimeInterval, runBlock block: @escaping () -> Void) -> SKAction {
        return SKAction.afterDelay(delay, performAction: SKAction.run(block))
    }
}

在这个例子中,你可以看到应用到myNode 的速度是如何涉及到我每次触摸屏幕时myEmitter 的速度,因为发射器的targetNode 属性设置为myNode,我也设置了myNodeparticleSpeed 更改为似乎更现实的减速/加速。

【讨论】:

  • 你的建议是改变targetNode的速度会减慢粒子系统吗?
  • targetNode 应该影响所涉及的粒子
  • 有趣。这个我没试过,也没怎么用过SK粒子。 SCN 粒子系统具有影响现有粒子的速度及其发射率的速度属性。这听起来像它会达到同样的效果。如果有效。
  • @AlessandroOrnano 我一有时间就会试试这个,谢谢。希望这可行,因此至少对于设置了 targetNode 的节点来说,这将是一个解决方案。
  • 这里是速度值,在 SCNParticleSystem 属性的截图底部:i.stack.imgur.com/4JR3n.png 如果你玩这个,它会立即减慢系统的所有速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多