Swift SpriteKit:为背景着色

Swift SpriteKit:为背景着色,swift,colors,sprite-kit,swift3,skspritenode,Swift,Colors,Sprite Kit,Swift3,Skspritenode,我仍在努力学习Swift和SpriteKit,我有一个新问题 因此,我将关注本教程/视频: 我的项目现在看起来像这样: 我有100个左右移动的粒子对象,我想混合一些颜色的粒子到白色背景。在本教程中,它非常简单。只需创建一次背景,然后在draw函数(在SpriteKit中,这将是update()函数)中为对象指定一个alpha值,如0.1 SpriteKit的工作原理完全不同。如果我更改“绘制”下的alpha值,我的粒子现在几乎隐藏,但颜色不会在背景上“绘制” 我知道这是因为SpriteKit的工

我仍在努力学习Swift和SpriteKit,我有一个新问题

因此,我将关注本教程/视频:

我的项目现在看起来像这样:

我有100个左右移动的粒子对象,我想混合一些颜色的粒子到白色背景。在本教程中,它非常简单。只需创建一次背景,然后在draw函数(在SpriteKit中,这将是update()函数)中为对象指定一个alpha值,如0.1

SpriteKit的工作原理完全不同。如果我更改“绘制”下的alpha值,我的粒子现在几乎隐藏,但颜色不会在背景上“绘制”

我知道这是因为SpriteKit的工作原理与用于javascript的p5库不同。但我想知道我怎么能在SpriteKit中获得同样的效果

所以在update函数中有两个循环,一个用于列,一个用于行。我有x列和y行,我为每个“单元”创建一个随机CGVector。现在,我的粒子是根据离粒子位置最近的单元的CGV矢量移动的

我的粒子类如下所示:

class Particle: SKShapeNode{
    var pos = CGPoint(x: 0, y: 0)
    var vel = CGVector(dx: 0, dy: 0)
    var acc = CGVector(dx: 0, dy: 0)
    var radius:CGFloat
    var maxSpeed:CGFloat
    var color: SKColor
我有一个函数,它看起来像这样来显示粒子:

func show(){
    self.position = self.pos
    let rect = CGRect(origin: CGPoint(x: 0.5, y: 0.5), size: CGSize(width: self.radius*2, height: self.radius*2))
    let bezierP = UIBezierPath(ovalIn: rect)
    self.path = bezierP.cgPath
    self.fillColor = self.color
    self.strokeColor = .clear
}
在更新函数中,我有一个循环:

    for particle in partikelArr{
        particle.updatePos()
        particle.show()
    }
我现在如何根据粒子的位置、颜色、形状和大小“着色”白色背景或在背景上“绘制”我的粒子

谢谢并致以最良好的问候

编辑: 因此,我知道在更新函数中为每个粒子创建一个新的SKShapeNode,这样就可以工作了,看起来这些粒子对背景进行了着色:

这是在更新函数中创建的:

    for particle in partikelArr{
        let newP = SKShapeNode(path: particle.path!)
        newP.position = particle.pos
        newP.fillColor = particle.farbe
        newP.strokeColor = .clear
        newP.zPosition = 1000
        newP.alpha = 0.1
        self.addChild(newP)
    }

但是我不想为每个粒子创建SKShapeNodes(在屏幕截图上我使用了5个粒子,几秒钟后我在场景中已经有800多个节点)我想让我的100个粒子在白色背景节点上真正“绘制”它们的形状和颜色。

我想知道在你的应用程序开始滞后之前,你最多可以有多少个粒子?请记住,一个SKShapeNode需要一个draw调用,这是非常不好的。关于这个问题。。。您还没有展示您尝试了什么以及您得到了什么结果(可能是一些截图?)您尝试了什么?嗨@Whirlwind谢谢您的回复。我已经编辑了我的问题。blendMode不是问题所在。我想有100个粒子,它们在周围移动,并用它们的形状和颜色给白色背景节点着色——所以当我说“绘制”时,我的意思是它们在背景上绘制。我不想创建新的节点,这些节点不会移动,即使这会让我产生效果-就像你说的那样,这会导致性能问题。对不起,我的英语不好,我希望我的问题现在更清楚,再次感谢您的回答。您应该能够应用对单个粒子起作用的着色器,请参见此链接上的示例Spritek它有自己的粒子系统。如果这对你来说还不够的话,我想使用着色器将是一个不错的选择…几乎做到了。。但这需要付出很多代价。希望SpriteKit有一种方法可以简单地画一些东西而不创建对象。想知道p5库如何在没有任何性能问题的情况下工作。我想知道在你的应用程序开始滞后之前,你的最大粒子数是多少?请记住,一个SKShapeNode需要一个draw调用,这是非常不好的。关于这个问题。。。您还没有展示您尝试了什么以及您得到了什么结果(可能是一些截图?)您尝试了什么?嗨@Whirlwind谢谢您的回复。我已经编辑了我的问题。blendMode不是问题所在。我想有100个粒子,它们在周围移动,并用它们的形状和颜色给白色背景节点着色——所以当我说“绘制”时,我的意思是它们在背景上绘制。我不想创建新的节点,这些节点不会移动,即使这会让我产生效果-就像你说的那样,这会导致性能问题。对不起,我的英语不好,我希望我的问题现在更清楚,再次感谢您的回答。您应该能够应用对单个粒子起作用的着色器,请参见此链接上的示例Spritek它有自己的粒子系统。如果这对你来说还不够的话,我想使用着色器将是一个不错的选择…几乎做到了。。但这需要付出很多代价。希望SpriteKit有一种方法可以简单地画一些东西而不创建对象。想知道p5库如何在没有任何性能问题的情况下工作。