解决粒子首位帧衔接问题

This commit is contained in:
tianmo committed 2026-09-02 22:55:38 +08:00
1 parent 0656684a92
commit 9c2421110c
22 files changed
+2873 -1407

No files matched your search

+16 -1
View File
@@ -123,8 +123,16 @@ export interface EmitterConfig {
loopDurationFrames: number
/** 循环持续模式下是否生成循环开始动画。 */
generateLoopStartAnimation: boolean
/** 是否手动指定进入循环稳定状态的时长;关闭时按最长粒子生命周期计算。 */
loopStartUseCustomDuration: boolean
/** 进入循环稳定状态的时长(帧)。 */
loopStartDurationFrames: number
/** 循环持续模式下是否生成循环结束动画。 */
generateLoopEndAnimation: boolean
/** 是否手动指定从循环稳定状态消亡的时长;关闭时按最长粒子生命周期计算。 */
loopEndUseCustomDuration: boolean
/** 从循环稳定状态消亡的时长(帧)。 */
loopEndDurationFrames: number
burstCount: number // 爆发:单次数量
burstLoop: boolean // 爆发是否每秒重复
/** 延迟发射(秒)= 粒子条左端位置 */
@@ -405,7 +413,11 @@ export function defaultConfig(): EmitterConfig {
streamBehavior: 'normal',
loopDurationFrames: 30,
generateLoopStartAnimation: false,
loopStartUseCustomDuration: false,
loopStartDurationFrames: 30,
generateLoopEndAnimation: false,
loopEndUseCustomDuration: false,
loopEndDurationFrames: 30,
burstCount: 50,
burstLoop: false, // 一次性爆发(持续爆发开关已移除)
delay: 0,
@@ -618,7 +630,10 @@ export function ensureEmitterConfig(config: EmitterConfig): EmitterConfig {
config.loopDurationFrames = Math.min(1800, Math.max(1, Math.ceil(config.loopDurationFrames)))
if (typeof config.generateLoopStartAnimation !== 'boolean') config.generateLoopStartAnimation = false
if (typeof config.generateLoopEndAnimation !== 'boolean') config.generateLoopEndAnimation = false
if (config.generateLoopStartAnimation && config.generateLoopEndAnimation) config.generateLoopEndAnimation = false
if (typeof config.loopStartUseCustomDuration !== 'boolean') config.loopStartUseCustomDuration = false
if (typeof config.loopEndUseCustomDuration !== 'boolean') config.loopEndUseCustomDuration = false
config.loopStartDurationFrames = Math.min(1800, Math.max(1, Math.ceil(Number(config.loopStartDurationFrames) || 30)))
config.loopEndDurationFrames = Math.min(1800, Math.max(1, Math.ceil(Number(config.loopEndDurationFrames) || 30)))
if (!Array.isArray(config.imageResources) || config.imageResources.length === 0) {
config.imageResources = defaultConfig().imageResources
}