优化碰撞识别,加入暖场帧数
This commit is contained in:
1 parent
b8652acce0
commit
fed1015849
21 files changed
+195
-23
No files matched your search
@@ -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('粒子事件校验通过:暖场 / 出生 / 死亡 / 碰撞 / 非等比矩形碰撞面 / 子发射器生成与禁用自动发射 / 属性继承 / 深度上限')
|
||||
Reference in new issue
Block a user