utils/Particle.js

import FireEffect from './particle/FireEffect'
import { setCustomMark } from '../utils/Layers'
import { flyToPos } from './Navigation'
import WaterGunEffect from './particle/WaterGunEffect'
// import explosionEffect from './particle/ExplotEffect'

/**
 * 粒子效果类
 * @class
 */
export class Particle {
  /**
   * 构造函数
   * @param {Object} viewer 地图场景对象
   */
  constructor(viewer) {
    this._viewer = viewer
    this._collection = []
  }
  /**
   * 创建新的火焰粒子对象
   * @param {Cartesian3} position 火焰粒子位置,笛卡尔坐标
   * @param {String} [type="cone"] 粒子类型:"cone"-锥型,"sphere"-球型,"box"-盒型,"circle"-圆型,
   * @param {Number} [size=25] 粒子大小
   * @returns {FireEffect} 火焰粒子对象
   */
  newFire(position, type = 'cone', size = 25) {
    const fire = new FireEffect(this._viewer, position, type, size)
    this._mark(fire, 'fire')
    this._collection.push(fire)
    return fire
  }

  /**
   * 水枪粒子
   * @param {Cartesian3} sourcePos 起始点位置,笛卡尔坐标
   * @param {Cartesian3} targetPos 目标点位置,笛卡尔坐标
   * @param {WaterGunOption} [options={}] 粒子参数,主要包括喷射角度,重力系数和喷射速度
   * @returns {WaterGunEffect} 水枪粒子对象
   */
  newWaterGun(sourcePos, targetPos, options = {}) {
    const water = new WaterGunEffect(
      this._viewer,
      sourcePos,
      targetPos,
      options
    )
    this._mark(water, 'water')
    this._collection.push(water)
    return water
  }

  // newExplosion() {
  //   const explosion = new explosionEffect(this._viewer)
  //   return explosion
  // }

  _mark(item, type) {
    setCustomMark(item, 'particle', type, true)
  }
  /**
   * 移除对象
   * @param {FireEffect | WaterGunEffect} item 待移除粒子对象
   */
  remove(item) {
    if (!item) return
    const index = this._collection.findIndex((ele) => ele.id === item.id)
    this._collection.splice(index, 1)
    item.remove()
  }

  /**
   * 移除所有
   */
  removeAll() {
    this._collection.forEach((element) => {
      element && element.remove()
    })
    this._collection = []
  }
}
/***
 * 跳转到粒子对象
 * @param {*} viewer
 * @param {*} item
 */
export const flyToParticle = (viewer, item) => {
  const geo = item.CustomGeo
  switch (geo) {
    case 'fire':
    case 'water':
      flyToPos(viewer, item.position)
      break
    default:
      break
  }
}