优化碰撞识别,加入暖场帧数

This commit is contained in:
tianmo committed 2026-10-29 17:20:05 +08:00
1 parent b8652acce0
commit fed1015849
21 files changed
+195 -23

No files matched your search

+54 -1
View File
@@ -13,6 +13,13 @@ const { ParticleEmitter, defaultConfig } = await import(
)
const { Texture } = await import('./pixi-stub.mjs')
if (defaultConfig().warmupFrames !== 0) throw new Error('暖场帧数默认值必须为 0')
const normalizedWarmup = makeConfig({ warmupFrames: -2.7 })
const normalizedWarmupEmitter = new ParticleEmitter(normalizedWarmup)
if (normalizedWarmup.warmupFrames !== 0 || normalizedWarmupEmitter.activeCount !== 0) {
throw new Error('暖场帧数必须归一化为不小于 0 的整数')
}
const subBundled = await build({
bundle: true,
entryPoints: ['src/core/subEmitterIds.ts'],
@@ -171,4 +178,50 @@ if (![...collisionCountsBySpawn.values()].some((counts) => counts[0] === 1 && co
throw new Error('同一粒子的碰撞次数未正确累计')
}
console.log('粒子事件校验通过:出生 / 死亡 / 碰撞 / 子发射器生成与禁用自动发射 / 属性继承 / 深度上限')
const warmupEmitter = new ParticleEmitter(makeConfig({
mode: 'stream',
streamBehavior: 'normal',
rate: 30,
duration: 10,
lifeMin: 10,
lifeMax: 10,
speedMin: 0,
speedMax: 0,
}))
warmupEmitter.reset()
warmupEmitter.warmup(3, step)
if (warmupEmitter.activeCount !== 3) {
throw new Error(`暖场 3 帧后应有 3 颗粒子,实际 ${warmupEmitter.activeCount} 颗`)
}
// 非等比缩放下,应按世界距离选择最近面,不能让宽扁矩形的顶面碰撞跳到侧面。
const scaledRectEmitter = new ParticleEmitter(makeConfig({
collision: true,
lifeMin: 1,
lifeMax: 1,
speedMin: 0,
speedMax: 0,
useGravity: false,
}))
scaledRectEmitter.setColliders([{
...collider,
shape: 'rect',
x: 0,
y: -60,
scaleX: 4,
scaleY: 0.5,
width: 120,
height: 80,
}])
scaledRectEmitter.setAutoEmission(false)
scaledRectEmitter.spawnEventParticle(-125.02, -56.58, 1)
const scaledRectEvents = []
scaledRectEmitter.onParticleEvent = (event) => scaledRectEvents.push(event)
scaledRectEmitter.update(step, 'force')
const scaledRectHit = scaledRectEvents.find((event) => event.kind === 'collision')
if (!scaledRectHit) throw new Error('非等比矩形未产生碰撞事件')
if (Math.abs(scaledRectHit.worldX + 125.02) > 0.1 || Math.abs(scaledRectHit.worldY + 40) > 0.1) {
throw new Error(`非等比矩形吸附面错误:实际命中 (${scaledRectHit.worldX}, ${scaledRectHit.worldY})`)
}
console.log('粒子事件校验通过:暖场 / 出生 / 死亡 / 碰撞 / 非等比矩形碰撞面 / 子发射器生成与禁用自动发射 / 属性继承 / 深度上限')