2017-08-09 3 views
0

の配列はCAEmitterCellです。私はすべての細胞の各出力が混ざり合って欲しいです。現在、配列の最初のセルは常に他のセルの上に描画されます。CAEmitterLayer複数のセルがインターリーブされています

レイヤのrenderModeと各セルのzAccelerationを調整しましたが、どちらもこの問題を解決していません。


いくつかのサンプルコード:

func layoutSubviews() { 
    // ... 
    emitterLayer.frame = self.bounds 
    emitterLayer.seed = UInt32(Date().timeIntervalSinceNow) 
    emitterLayer.renderMode = kCAEmitterLayerOldestFirst 
    emitterLayer.emitterPosition = CGPoint(x: bounds.midX, y: bounds.midY) 
    emitterLayer.emitterSize = CGSize.init(width: bounds.width, height: 0) 
    emitterLayer.emitterShape = kCAEmitterLayerLine 
    self.layer.addSublayer(emitterLayer) 
} 

private func animate() { 
    // ... 
    if emitterLayer.emitterCells == nil || emitterLayer.emitterCells?.count == 0 { 
     let cells = (1...8).map { i -> CAEmitterCell in 
      if let img = UIImage.init(named: "Slice-\(i)") { 
       return createEmitterCell(image: img, index: i) 
      } else { 
       fatalError() 
      } 
     } 
     emitterLayer.emitterCells = cells 
    } 
} 

private func createEmitterCell(image: UIImage, index: Int) -> CAEmitterCell { 
    let cell = CAEmitterCell.init() 
    cell.isEnabled = true 
    cell.contents = image.cgImage 

    cell.contentsRect = CGRect(origin: CGPoint.zero, size: CGSize(width: 1, height: 1)) 

    cell.birthRate = Float(index) 
    cell.lifetime = 3 
    cell.velocity = 7 
    cell.velocityRange = 3 
    cell.scale = 0.5 

    cell.emissionRange = (95 * CGFloat.pi/180.0) 
    cell.emissionLatitude = (27 * CGFloat.pi/180.0) 
    cell.emissionLongitude = (139 * CGFloat.pi/180.0) 

    cell.xAcceleration = 10.0 
    cell.yAcceleration = 100.0 
    cell.zAcceleration = 10 * CGFloat(index) 

    return cell 
} 

+0

アレイに配置された重複エミッタがこの効果を生み出すことがあります。例: '[cell1、cell2、cell1]' – JoePasq

答えて

0

私は12個のエミッター細胞を持っているし、私の解決策は、エミッタの順序をランダム化することです。このようにして、アプリケーションの実行ごとに異なる順序が生成されます。

 emojiCells = "✨✅" 
      .characters 
      .sorted(by: { (a, b) -> Bool in 
       return arc4random() % 2 == 0 
      }).enumerated().map({ (offset: Int, element: Character) -> CAEmitterCell in 
       // create emitter cells for each emoji 
       let raster = rasterize(emoji: element) 
       return createEmitterCell(image: raster, index: offset) 
      }) 
     emitterLayer.emitterCells = emojiCells 

私は少数のエミッター細胞を持っていた場合、私はお互いの周りに重複発光体が含まれます。例えば、[cell1, cell2, cell1]。出生率を高めるなど、そのような状況では他の調整が役立ちますcell2

関連する問題