775 lines
15 KiB
TypeScript
775 lines
15 KiB
TypeScript
|
|
/**
|
|||
|
|
* 粒子效果预设
|
|||
|
|
* Particle effect presets
|
|||
|
|
*
|
|||
|
|
* Collection of pre-configured particle system settings.
|
|||
|
|
* 预配置的粒子系统设置集合。
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
import { EmissionShape, type ColorValue } from '../ParticleEmitter';
|
|||
|
|
import { ParticleBlendMode, SimulationSpace } from '../ParticleSystemComponent';
|
|||
|
|
import { ForceFieldType } from '../modules/ForceFieldModule';
|
|||
|
|
import { BoundaryType, CollisionBehavior } from '../modules/CollisionModule';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 辅助函数:十六进制转 ColorValue
|
|||
|
|
* Helper: hex to ColorValue
|
|||
|
|
*/
|
|||
|
|
function hexToColor(hex: string, alpha = 1): ColorValue {
|
|||
|
|
const h = hex.replace('#', '');
|
|||
|
|
return {
|
|||
|
|
r: parseInt(h.slice(0, 2), 16) / 255,
|
|||
|
|
g: parseInt(h.slice(2, 4), 16) / 255,
|
|||
|
|
b: parseInt(h.slice(4, 6), 16) / 255,
|
|||
|
|
a: alpha,
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 预设配置接口
|
|||
|
|
* Preset configuration interface
|
|||
|
|
*/
|
|||
|
|
export interface ParticlePreset {
|
|||
|
|
/** 预设名称 | Preset name */
|
|||
|
|
name: string;
|
|||
|
|
/** 预设描述 | Preset description */
|
|||
|
|
description: string;
|
|||
|
|
/** 预设分类 | Preset category */
|
|||
|
|
category: PresetCategory;
|
|||
|
|
/** 预设图标 | Preset icon */
|
|||
|
|
icon?: string;
|
|||
|
|
|
|||
|
|
// 基础属性 | Basic properties
|
|||
|
|
maxParticles: number;
|
|||
|
|
looping: boolean;
|
|||
|
|
duration: number;
|
|||
|
|
playbackSpeed: number;
|
|||
|
|
|
|||
|
|
// 发射属性 | Emission properties
|
|||
|
|
emissionRate: number;
|
|||
|
|
emissionShape: EmissionShape;
|
|||
|
|
shapeRadius: number;
|
|||
|
|
shapeWidth: number;
|
|||
|
|
shapeHeight: number;
|
|||
|
|
shapeAngle: number;
|
|||
|
|
|
|||
|
|
// 粒子属性 | Particle properties
|
|||
|
|
lifetimeMin: number;
|
|||
|
|
lifetimeMax: number;
|
|||
|
|
speedMin: number;
|
|||
|
|
speedMax: number;
|
|||
|
|
direction: number;
|
|||
|
|
directionSpread: number;
|
|||
|
|
scaleMin: number;
|
|||
|
|
scaleMax: number;
|
|||
|
|
gravityX: number;
|
|||
|
|
gravityY: number;
|
|||
|
|
|
|||
|
|
// 颜色属性 | Color properties
|
|||
|
|
startColor: ColorValue;
|
|||
|
|
endColor?: ColorValue;
|
|||
|
|
startAlpha: number;
|
|||
|
|
endAlpha: number;
|
|||
|
|
endScale: number;
|
|||
|
|
|
|||
|
|
// 渲染属性 | Rendering properties
|
|||
|
|
particleSize: number;
|
|||
|
|
blendMode: ParticleBlendMode;
|
|||
|
|
|
|||
|
|
// 可选模块 | Optional modules
|
|||
|
|
simulationSpace?: SimulationSpace;
|
|||
|
|
forceField?: {
|
|||
|
|
type: ForceFieldType;
|
|||
|
|
strength: number;
|
|||
|
|
directionX?: number;
|
|||
|
|
directionY?: number;
|
|||
|
|
centerX?: number;
|
|||
|
|
centerY?: number;
|
|||
|
|
inwardStrength?: number;
|
|||
|
|
frequency?: number;
|
|||
|
|
};
|
|||
|
|
collision?: {
|
|||
|
|
boundaryType: BoundaryType;
|
|||
|
|
behavior: CollisionBehavior;
|
|||
|
|
radius?: number;
|
|||
|
|
bounceFactor?: number;
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 预设分类
|
|||
|
|
* Preset category
|
|||
|
|
*/
|
|||
|
|
export enum PresetCategory {
|
|||
|
|
/** 自然效果 | Natural effects */
|
|||
|
|
Nature = 'nature',
|
|||
|
|
/** 魔法效果 | Magic effects */
|
|||
|
|
Magic = 'magic',
|
|||
|
|
/** 爆炸效果 | Explosion effects */
|
|||
|
|
Explosion = 'explosion',
|
|||
|
|
/** 环境效果 | Environment effects */
|
|||
|
|
Environment = 'environment',
|
|||
|
|
/** UI 效果 | UI effects */
|
|||
|
|
UI = 'ui',
|
|||
|
|
/** 基础效果 | Basic effects */
|
|||
|
|
Basic = 'basic',
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 火焰预设
|
|||
|
|
* Fire preset
|
|||
|
|
*/
|
|||
|
|
export const FirePreset: ParticlePreset = {
|
|||
|
|
name: 'Fire',
|
|||
|
|
description: 'Realistic fire effect with hot colors',
|
|||
|
|
category: PresetCategory.Nature,
|
|||
|
|
icon: 'Flame',
|
|||
|
|
|
|||
|
|
maxParticles: 200,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 5,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 40,
|
|||
|
|
emissionShape: EmissionShape.Rectangle,
|
|||
|
|
shapeRadius: 20,
|
|||
|
|
shapeWidth: 30,
|
|||
|
|
shapeHeight: 5,
|
|||
|
|
shapeAngle: 30,
|
|||
|
|
|
|||
|
|
lifetimeMin: 0.5,
|
|||
|
|
lifetimeMax: 1.2,
|
|||
|
|
speedMin: 80,
|
|||
|
|
speedMax: 150,
|
|||
|
|
direction: 90,
|
|||
|
|
directionSpread: 25,
|
|||
|
|
scaleMin: 0.8,
|
|||
|
|
scaleMax: 1.2,
|
|||
|
|
gravityX: 0,
|
|||
|
|
gravityY: 50,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#ff6600'),
|
|||
|
|
endColor: hexToColor('#ff0000'),
|
|||
|
|
startAlpha: 1,
|
|||
|
|
endAlpha: 0,
|
|||
|
|
endScale: 0.3,
|
|||
|
|
|
|||
|
|
particleSize: 16,
|
|||
|
|
blendMode: ParticleBlendMode.Additive,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 烟雾预设
|
|||
|
|
* Smoke preset
|
|||
|
|
*/
|
|||
|
|
export const SmokePreset: ParticlePreset = {
|
|||
|
|
name: 'Smoke',
|
|||
|
|
description: 'Soft rising smoke effect',
|
|||
|
|
category: PresetCategory.Nature,
|
|||
|
|
icon: 'Cloud',
|
|||
|
|
|
|||
|
|
maxParticles: 150,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 5,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 15,
|
|||
|
|
emissionShape: EmissionShape.Circle,
|
|||
|
|
shapeRadius: 15,
|
|||
|
|
shapeWidth: 30,
|
|||
|
|
shapeHeight: 30,
|
|||
|
|
shapeAngle: 30,
|
|||
|
|
|
|||
|
|
lifetimeMin: 2,
|
|||
|
|
lifetimeMax: 4,
|
|||
|
|
speedMin: 20,
|
|||
|
|
speedMax: 50,
|
|||
|
|
direction: 90,
|
|||
|
|
directionSpread: 20,
|
|||
|
|
scaleMin: 0.5,
|
|||
|
|
scaleMax: 1,
|
|||
|
|
gravityX: 10,
|
|||
|
|
gravityY: -5,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#888888'),
|
|||
|
|
endColor: hexToColor('#cccccc'),
|
|||
|
|
startAlpha: 0.6,
|
|||
|
|
endAlpha: 0,
|
|||
|
|
endScale: 2.5,
|
|||
|
|
|
|||
|
|
particleSize: 32,
|
|||
|
|
blendMode: ParticleBlendMode.Normal,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 火花预设
|
|||
|
|
* Sparkle preset
|
|||
|
|
*/
|
|||
|
|
export const SparklePreset: ParticlePreset = {
|
|||
|
|
name: 'Sparkle',
|
|||
|
|
description: 'Twinkling star-like particles',
|
|||
|
|
category: PresetCategory.Magic,
|
|||
|
|
icon: 'Sparkles',
|
|||
|
|
|
|||
|
|
maxParticles: 100,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 5,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 20,
|
|||
|
|
emissionShape: EmissionShape.Circle,
|
|||
|
|
shapeRadius: 40,
|
|||
|
|
shapeWidth: 40,
|
|||
|
|
shapeHeight: 40,
|
|||
|
|
shapeAngle: 360,
|
|||
|
|
|
|||
|
|
lifetimeMin: 0.3,
|
|||
|
|
lifetimeMax: 0.8,
|
|||
|
|
speedMin: 10,
|
|||
|
|
speedMax: 30,
|
|||
|
|
direction: 90,
|
|||
|
|
directionSpread: 360,
|
|||
|
|
scaleMin: 0.5,
|
|||
|
|
scaleMax: 1.5,
|
|||
|
|
gravityX: 0,
|
|||
|
|
gravityY: -20,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#ffffff'),
|
|||
|
|
startAlpha: 1,
|
|||
|
|
endAlpha: 0,
|
|||
|
|
endScale: 0,
|
|||
|
|
|
|||
|
|
particleSize: 8,
|
|||
|
|
blendMode: ParticleBlendMode.Additive,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 爆炸预设
|
|||
|
|
* Explosion preset
|
|||
|
|
*/
|
|||
|
|
export const ExplosionPreset: ParticlePreset = {
|
|||
|
|
name: 'Explosion',
|
|||
|
|
description: 'Radial burst explosion effect',
|
|||
|
|
category: PresetCategory.Explosion,
|
|||
|
|
icon: 'Zap',
|
|||
|
|
|
|||
|
|
maxParticles: 300,
|
|||
|
|
looping: false,
|
|||
|
|
duration: 1,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 0, // Burst only
|
|||
|
|
emissionShape: EmissionShape.Point,
|
|||
|
|
shapeRadius: 5,
|
|||
|
|
shapeWidth: 10,
|
|||
|
|
shapeHeight: 10,
|
|||
|
|
shapeAngle: 360,
|
|||
|
|
|
|||
|
|
lifetimeMin: 0.3,
|
|||
|
|
lifetimeMax: 0.8,
|
|||
|
|
speedMin: 200,
|
|||
|
|
speedMax: 400,
|
|||
|
|
direction: 0,
|
|||
|
|
directionSpread: 360,
|
|||
|
|
scaleMin: 0.8,
|
|||
|
|
scaleMax: 1.2,
|
|||
|
|
gravityX: 0,
|
|||
|
|
gravityY: 200,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#ffaa00'),
|
|||
|
|
endColor: hexToColor('#ff4400'),
|
|||
|
|
startAlpha: 1,
|
|||
|
|
endAlpha: 0,
|
|||
|
|
endScale: 0.2,
|
|||
|
|
|
|||
|
|
particleSize: 12,
|
|||
|
|
blendMode: ParticleBlendMode.Additive,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 雨滴预设
|
|||
|
|
* Rain preset
|
|||
|
|
*/
|
|||
|
|
export const RainPreset: ParticlePreset = {
|
|||
|
|
name: 'Rain',
|
|||
|
|
description: 'Falling rain drops',
|
|||
|
|
category: PresetCategory.Environment,
|
|||
|
|
icon: 'CloudRain',
|
|||
|
|
|
|||
|
|
maxParticles: 500,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 10,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 80,
|
|||
|
|
emissionShape: EmissionShape.Line,
|
|||
|
|
shapeRadius: 200,
|
|||
|
|
shapeWidth: 400,
|
|||
|
|
shapeHeight: 10,
|
|||
|
|
shapeAngle: 0,
|
|||
|
|
|
|||
|
|
lifetimeMin: 0.5,
|
|||
|
|
lifetimeMax: 1,
|
|||
|
|
speedMin: 400,
|
|||
|
|
speedMax: 600,
|
|||
|
|
direction: -80,
|
|||
|
|
directionSpread: 5,
|
|||
|
|
scaleMin: 0.8,
|
|||
|
|
scaleMax: 1,
|
|||
|
|
gravityX: 0,
|
|||
|
|
gravityY: 0,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#88ccff'),
|
|||
|
|
startAlpha: 0.7,
|
|||
|
|
endAlpha: 0.3,
|
|||
|
|
endScale: 1,
|
|||
|
|
|
|||
|
|
particleSize: 6,
|
|||
|
|
blendMode: ParticleBlendMode.Normal,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 雪花预设
|
|||
|
|
* Snow preset
|
|||
|
|
*/
|
|||
|
|
export const SnowPreset: ParticlePreset = {
|
|||
|
|
name: 'Snow',
|
|||
|
|
description: 'Gently falling snowflakes',
|
|||
|
|
category: PresetCategory.Environment,
|
|||
|
|
icon: 'Snowflake',
|
|||
|
|
|
|||
|
|
maxParticles: 300,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 10,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 30,
|
|||
|
|
emissionShape: EmissionShape.Line,
|
|||
|
|
shapeRadius: 200,
|
|||
|
|
shapeWidth: 400,
|
|||
|
|
shapeHeight: 10,
|
|||
|
|
shapeAngle: 0,
|
|||
|
|
|
|||
|
|
lifetimeMin: 3,
|
|||
|
|
lifetimeMax: 6,
|
|||
|
|
speedMin: 20,
|
|||
|
|
speedMax: 50,
|
|||
|
|
direction: -90,
|
|||
|
|
directionSpread: 30,
|
|||
|
|
scaleMin: 0.3,
|
|||
|
|
scaleMax: 1,
|
|||
|
|
gravityX: 0,
|
|||
|
|
gravityY: 0,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#ffffff'),
|
|||
|
|
startAlpha: 0.9,
|
|||
|
|
endAlpha: 0.5,
|
|||
|
|
endScale: 1,
|
|||
|
|
|
|||
|
|
particleSize: 8,
|
|||
|
|
blendMode: ParticleBlendMode.Normal,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 魔法光环预设
|
|||
|
|
* Magic aura preset
|
|||
|
|
*/
|
|||
|
|
export const MagicAuraPreset: ParticlePreset = {
|
|||
|
|
name: 'Magic Aura',
|
|||
|
|
description: 'Mystical swirling aura',
|
|||
|
|
category: PresetCategory.Magic,
|
|||
|
|
icon: 'Star',
|
|||
|
|
|
|||
|
|
maxParticles: 100,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 5,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 20,
|
|||
|
|
emissionShape: EmissionShape.Circle,
|
|||
|
|
shapeRadius: 50,
|
|||
|
|
shapeWidth: 50,
|
|||
|
|
shapeHeight: 50,
|
|||
|
|
shapeAngle: 360,
|
|||
|
|
|
|||
|
|
lifetimeMin: 1,
|
|||
|
|
lifetimeMax: 2,
|
|||
|
|
speedMin: 5,
|
|||
|
|
speedMax: 15,
|
|||
|
|
direction: 0,
|
|||
|
|
directionSpread: 360,
|
|||
|
|
scaleMin: 0.5,
|
|||
|
|
scaleMax: 1,
|
|||
|
|
gravityX: 0,
|
|||
|
|
gravityY: -30,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#aa55ff'),
|
|||
|
|
endColor: hexToColor('#5555ff'),
|
|||
|
|
startAlpha: 0.8,
|
|||
|
|
endAlpha: 0,
|
|||
|
|
endScale: 0.5,
|
|||
|
|
|
|||
|
|
particleSize: 10,
|
|||
|
|
blendMode: ParticleBlendMode.Additive,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 灰尘预设
|
|||
|
|
* Dust preset
|
|||
|
|
*/
|
|||
|
|
export const DustPreset: ParticlePreset = {
|
|||
|
|
name: 'Dust',
|
|||
|
|
description: 'Floating dust particles',
|
|||
|
|
category: PresetCategory.Environment,
|
|||
|
|
icon: 'Wind',
|
|||
|
|
|
|||
|
|
maxParticles: 200,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 10,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 15,
|
|||
|
|
emissionShape: EmissionShape.Rectangle,
|
|||
|
|
shapeRadius: 100,
|
|||
|
|
shapeWidth: 200,
|
|||
|
|
shapeHeight: 150,
|
|||
|
|
shapeAngle: 0,
|
|||
|
|
|
|||
|
|
lifetimeMin: 4,
|
|||
|
|
lifetimeMax: 8,
|
|||
|
|
speedMin: 5,
|
|||
|
|
speedMax: 15,
|
|||
|
|
direction: 45,
|
|||
|
|
directionSpread: 90,
|
|||
|
|
scaleMin: 0.2,
|
|||
|
|
scaleMax: 0.6,
|
|||
|
|
gravityX: 10,
|
|||
|
|
gravityY: -2,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#ccbb99'),
|
|||
|
|
startAlpha: 0.3,
|
|||
|
|
endAlpha: 0.1,
|
|||
|
|
endScale: 1.2,
|
|||
|
|
|
|||
|
|
particleSize: 4,
|
|||
|
|
blendMode: ParticleBlendMode.Normal,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 泡泡预设
|
|||
|
|
* Bubble preset
|
|||
|
|
*/
|
|||
|
|
export const BubblePreset: ParticlePreset = {
|
|||
|
|
name: 'Bubbles',
|
|||
|
|
description: 'Rising soap bubbles',
|
|||
|
|
category: PresetCategory.Environment,
|
|||
|
|
icon: 'CircleDot',
|
|||
|
|
|
|||
|
|
maxParticles: 50,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 10,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 5,
|
|||
|
|
emissionShape: EmissionShape.Rectangle,
|
|||
|
|
shapeRadius: 40,
|
|||
|
|
shapeWidth: 80,
|
|||
|
|
shapeHeight: 20,
|
|||
|
|
shapeAngle: 0,
|
|||
|
|
|
|||
|
|
lifetimeMin: 2,
|
|||
|
|
lifetimeMax: 4,
|
|||
|
|
speedMin: 30,
|
|||
|
|
speedMax: 60,
|
|||
|
|
direction: 90,
|
|||
|
|
directionSpread: 20,
|
|||
|
|
scaleMin: 0.5,
|
|||
|
|
scaleMax: 1.5,
|
|||
|
|
gravityX: 10,
|
|||
|
|
gravityY: -10,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#aaddff'),
|
|||
|
|
startAlpha: 0.5,
|
|||
|
|
endAlpha: 0.2,
|
|||
|
|
endScale: 1.3,
|
|||
|
|
|
|||
|
|
particleSize: 16,
|
|||
|
|
blendMode: ParticleBlendMode.Normal,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 星轨预设
|
|||
|
|
* Star trail preset
|
|||
|
|
*/
|
|||
|
|
export const StarTrailPreset: ParticlePreset = {
|
|||
|
|
name: 'Star Trail',
|
|||
|
|
description: 'Glowing star trail effect',
|
|||
|
|
category: PresetCategory.Magic,
|
|||
|
|
icon: 'Sparkle',
|
|||
|
|
|
|||
|
|
maxParticles: 150,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 5,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 50,
|
|||
|
|
emissionShape: EmissionShape.Point,
|
|||
|
|
shapeRadius: 2,
|
|||
|
|
shapeWidth: 4,
|
|||
|
|
shapeHeight: 4,
|
|||
|
|
shapeAngle: 0,
|
|||
|
|
|
|||
|
|
lifetimeMin: 0.2,
|
|||
|
|
lifetimeMax: 0.6,
|
|||
|
|
speedMin: 5,
|
|||
|
|
speedMax: 20,
|
|||
|
|
direction: 180,
|
|||
|
|
directionSpread: 30,
|
|||
|
|
scaleMin: 0.8,
|
|||
|
|
scaleMax: 1.2,
|
|||
|
|
gravityX: 0,
|
|||
|
|
gravityY: 0,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#ffff88'),
|
|||
|
|
endColor: hexToColor('#ffaa44'),
|
|||
|
|
startAlpha: 1,
|
|||
|
|
endAlpha: 0,
|
|||
|
|
endScale: 0.1,
|
|||
|
|
|
|||
|
|
particleSize: 6,
|
|||
|
|
blendMode: ParticleBlendMode.Additive,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 默认预设(简单)
|
|||
|
|
* Default preset (simple)
|
|||
|
|
*/
|
|||
|
|
export const DefaultPreset: ParticlePreset = {
|
|||
|
|
name: 'Default',
|
|||
|
|
description: 'Basic particle emitter',
|
|||
|
|
category: PresetCategory.Basic,
|
|||
|
|
icon: 'Circle',
|
|||
|
|
|
|||
|
|
maxParticles: 100,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 5,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 10,
|
|||
|
|
emissionShape: EmissionShape.Point,
|
|||
|
|
shapeRadius: 0,
|
|||
|
|
shapeWidth: 0,
|
|||
|
|
shapeHeight: 0,
|
|||
|
|
shapeAngle: 0,
|
|||
|
|
|
|||
|
|
lifetimeMin: 1,
|
|||
|
|
lifetimeMax: 2,
|
|||
|
|
speedMin: 50,
|
|||
|
|
speedMax: 100,
|
|||
|
|
direction: 90,
|
|||
|
|
directionSpread: 30,
|
|||
|
|
scaleMin: 1,
|
|||
|
|
scaleMax: 1,
|
|||
|
|
gravityX: 0,
|
|||
|
|
gravityY: 0,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#ffffff'),
|
|||
|
|
startAlpha: 1,
|
|||
|
|
endAlpha: 0,
|
|||
|
|
endScale: 1,
|
|||
|
|
|
|||
|
|
particleSize: 8,
|
|||
|
|
blendMode: ParticleBlendMode.Normal,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 漩涡预设
|
|||
|
|
* Vortex preset
|
|||
|
|
*/
|
|||
|
|
export const VortexPreset: ParticlePreset = {
|
|||
|
|
name: 'Vortex',
|
|||
|
|
description: 'Swirling vortex with inward pull',
|
|||
|
|
category: PresetCategory.Magic,
|
|||
|
|
icon: 'Tornado',
|
|||
|
|
|
|||
|
|
maxParticles: 200,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 10,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 30,
|
|||
|
|
emissionShape: EmissionShape.Circle,
|
|||
|
|
shapeRadius: 80,
|
|||
|
|
shapeWidth: 160,
|
|||
|
|
shapeHeight: 160,
|
|||
|
|
shapeAngle: 360,
|
|||
|
|
|
|||
|
|
lifetimeMin: 2,
|
|||
|
|
lifetimeMax: 4,
|
|||
|
|
speedMin: 10,
|
|||
|
|
speedMax: 30,
|
|||
|
|
direction: 0,
|
|||
|
|
directionSpread: 360,
|
|||
|
|
scaleMin: 0.5,
|
|||
|
|
scaleMax: 1,
|
|||
|
|
gravityX: 0,
|
|||
|
|
gravityY: 0,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#88ccff'),
|
|||
|
|
startAlpha: 0.8,
|
|||
|
|
endAlpha: 0,
|
|||
|
|
endScale: 0.3,
|
|||
|
|
|
|||
|
|
particleSize: 8,
|
|||
|
|
blendMode: ParticleBlendMode.Additive,
|
|||
|
|
|
|||
|
|
forceField: {
|
|||
|
|
type: ForceFieldType.Vortex,
|
|||
|
|
strength: 150,
|
|||
|
|
centerX: 0,
|
|||
|
|
centerY: 0,
|
|||
|
|
inwardStrength: 30,
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 落叶预设
|
|||
|
|
* Falling leaves preset
|
|||
|
|
*/
|
|||
|
|
export const LeavesPreset: ParticlePreset = {
|
|||
|
|
name: 'Leaves',
|
|||
|
|
description: 'Falling leaves with wind effect',
|
|||
|
|
category: PresetCategory.Environment,
|
|||
|
|
icon: 'Leaf',
|
|||
|
|
|
|||
|
|
maxParticles: 100,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 10,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 8,
|
|||
|
|
emissionShape: EmissionShape.Line,
|
|||
|
|
shapeRadius: 200,
|
|||
|
|
shapeWidth: 400,
|
|||
|
|
shapeHeight: 10,
|
|||
|
|
shapeAngle: 0,
|
|||
|
|
|
|||
|
|
lifetimeMin: 4,
|
|||
|
|
lifetimeMax: 8,
|
|||
|
|
speedMin: 30,
|
|||
|
|
speedMax: 60,
|
|||
|
|
direction: -90,
|
|||
|
|
directionSpread: 20,
|
|||
|
|
scaleMin: 0.6,
|
|||
|
|
scaleMax: 1.2,
|
|||
|
|
gravityX: 0,
|
|||
|
|
gravityY: 20,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#dd8844'),
|
|||
|
|
startAlpha: 0.9,
|
|||
|
|
endAlpha: 0.6,
|
|||
|
|
endScale: 1,
|
|||
|
|
|
|||
|
|
particleSize: 12,
|
|||
|
|
blendMode: ParticleBlendMode.Normal,
|
|||
|
|
|
|||
|
|
forceField: {
|
|||
|
|
type: ForceFieldType.Turbulence,
|
|||
|
|
strength: 40,
|
|||
|
|
frequency: 0.5,
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 弹球预设
|
|||
|
|
* Bouncing balls preset
|
|||
|
|
*/
|
|||
|
|
export const BouncingPreset: ParticlePreset = {
|
|||
|
|
name: 'Bouncing',
|
|||
|
|
description: 'Bouncing particles in a box',
|
|||
|
|
category: PresetCategory.Basic,
|
|||
|
|
icon: 'Circle',
|
|||
|
|
|
|||
|
|
maxParticles: 50,
|
|||
|
|
looping: true,
|
|||
|
|
duration: 10,
|
|||
|
|
playbackSpeed: 1,
|
|||
|
|
|
|||
|
|
emissionRate: 5,
|
|||
|
|
emissionShape: EmissionShape.Point,
|
|||
|
|
shapeRadius: 0,
|
|||
|
|
shapeWidth: 0,
|
|||
|
|
shapeHeight: 0,
|
|||
|
|
shapeAngle: 0,
|
|||
|
|
|
|||
|
|
lifetimeMin: 8,
|
|||
|
|
lifetimeMax: 12,
|
|||
|
|
speedMin: 100,
|
|||
|
|
speedMax: 200,
|
|||
|
|
direction: 90,
|
|||
|
|
directionSpread: 60,
|
|||
|
|
scaleMin: 0.8,
|
|||
|
|
scaleMax: 1.2,
|
|||
|
|
gravityX: 0,
|
|||
|
|
gravityY: 200,
|
|||
|
|
|
|||
|
|
startColor: hexToColor('#66aaff'),
|
|||
|
|
startAlpha: 1,
|
|||
|
|
endAlpha: 0.8,
|
|||
|
|
endScale: 1,
|
|||
|
|
|
|||
|
|
particleSize: 16,
|
|||
|
|
blendMode: ParticleBlendMode.Normal,
|
|||
|
|
|
|||
|
|
collision: {
|
|||
|
|
boundaryType: BoundaryType.Rectangle,
|
|||
|
|
behavior: CollisionBehavior.Bounce,
|
|||
|
|
bounceFactor: 0.8,
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 所有预设
|
|||
|
|
* All presets
|
|||
|
|
*/
|
|||
|
|
export const AllPresets: ParticlePreset[] = [
|
|||
|
|
DefaultPreset,
|
|||
|
|
FirePreset,
|
|||
|
|
SmokePreset,
|
|||
|
|
SparklePreset,
|
|||
|
|
ExplosionPreset,
|
|||
|
|
RainPreset,
|
|||
|
|
SnowPreset,
|
|||
|
|
MagicAuraPreset,
|
|||
|
|
DustPreset,
|
|||
|
|
BubblePreset,
|
|||
|
|
StarTrailPreset,
|
|||
|
|
VortexPreset,
|
|||
|
|
LeavesPreset,
|
|||
|
|
BouncingPreset,
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 按分类获取预设
|
|||
|
|
* Get presets by category
|
|||
|
|
*/
|
|||
|
|
export function getPresetsByCategory(category: PresetCategory): ParticlePreset[] {
|
|||
|
|
return AllPresets.filter(p => p.category === category);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取预设名称列表
|
|||
|
|
* Get preset name list
|
|||
|
|
*/
|
|||
|
|
export function getPresetNames(): string[] {
|
|||
|
|
return AllPresets.map(p => p.name);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 按名称获取预设
|
|||
|
|
* Get preset by name
|
|||
|
|
*/
|
|||
|
|
export function getPresetByName(name: string): ParticlePreset | undefined {
|
|||
|
|
return AllPresets.find(p => p.name === name);
|
|||
|
|
}
|