颜色显示修正

This commit is contained in:
tianmo committed 2026-09-02 23:19:58 +08:00
1 parent 9c2421110c
commit 535f8d7558
9 files changed
+2197 -48

No files matched your search

+11 -3
View File
@@ -57,7 +57,7 @@ export interface ParticleImageResource {
anchorX: number
anchorY: number
/** 每张贴图独立的颜色、混合与透明度设置 */
colorMode: 'fixed' | 'lifetime'
colorMode: 'fixed' | 'random' | 'lifetime'
colorStart: string
colorEnd: string
colorGradient: ColorGradientStop[]
@@ -661,7 +661,7 @@ export function ensureEmitterConfig(config: EmitterConfig): EmitterConfig {
if (!Number.isFinite(resource.scale)) resource.scale = 1
if (!Number.isFinite(resource.anchorX)) resource.anchorX = 0.5
if (!Number.isFinite(resource.anchorY)) resource.anchorY = 0.5
if (resource.colorMode !== 'fixed' && resource.colorMode !== 'lifetime') {
if (resource.colorMode !== 'fixed' && resource.colorMode !== 'random' && resource.colorMode !== 'lifetime') {
resource.colorMode = config.colorOverLife ? 'lifetime' : 'fixed'
}
if (!resource.colorStart) resource.colorStart = config.colorStart || '#ffffff'
@@ -837,6 +837,8 @@ interface Particle {
trailSampledLength: number
trailSampledWidth: number
resourceId: number
/** 随机颜色模式下,粒子出生时从卡片色带采样并在生命周期内保持的颜色。 */
colorSample: number
imageFrameIndex: number
collisionPaused: boolean
}
@@ -926,6 +928,7 @@ export class ParticleEmitter extends Container {
trailSampledLength: 100,
trailSampledWidth: 100,
resourceId: 1,
colorSample: 0xffffff,
imageFrameIndex: 0,
collisionPaused: false,
})
@@ -1191,6 +1194,8 @@ export class ParticleEmitter extends Container {
const colorStart = resource?.colorStart || '#ffffff'
const rgb = resource?.colorMode === 'lifetime'
? gradientColorAt(resource.colorGradient, t)
: resource?.colorMode === 'random'
? p.colorSample
: hexToNumber(colorStart)
s.tint = rgb
s.blendMode = BLEND_MAP[resource?.blend || 'normal'] as any
@@ -1590,12 +1595,15 @@ export class ParticleEmitter extends Container {
? lerp(cfg.scaleYOverLifeMin, cfg.scaleYOverLifeMax, this.rng())
: cfg.scaleYOverLifeMin
p.resourceId = resource.id
p.colorSample = resource.colorMode === 'random'
? gradientColorAt(resource.colorGradient, seededUnit(cfg.seed, spawnSerial, 0x9e3779b9))
: hexToNumber(resource.colorStart)
const initialFrame = this.imageFrameState(resource, 0)
p.imageFrameIndex = initialFrame.index
p.sprite.texture = this.imageFrameTexture(resource, initialFrame.index)
p.sprite.anchor.set(resource.anchorX, resource.anchorY)
p.sprite.blendMode = BLEND_MAP[resource.blend] as any
p.sprite.tint = hexToNumber(resource.colorStart)
p.sprite.tint = p.colorSample
p.sprite.visible = true
}