Cada pieza dice con qué colisiona desde su propio cuerpo, así que el disparo y los murciélagos se escriben por separado y nada en la escena tiene que conocer a los dos. useCollisionWith(Bat, (bat) => bat.api.hurt(1)) solo encuentra las piezas creadas con Bat, y TypeScript sabe lo que devuelven: sin comprobaciones ni conversiones. useCollisionWith('breakable', …) encuentra todo lo que lleve la etiqueta; aquí, cajas que son sprites sueltos, sin componente propio, etiquetados con useTag('breakable').add(sprite).
Una etiqueta es también la forma de encontrar las cosas de un tipo: los murciélagos se crean con useSpawn(Bat, { tags: ['enemy'] }), y el HUD cuenta enemies.all(), que deja fuera los ya destruidos. useCollisionBetween(Ship, Bat, …) es al revés, una regla de la escena que conoce a los dos: la nave parpadea mientras un murciélago la toca. Las flechas mueven, X dispara.