false for a pooled particle waiting to be reused
seconds since birth
Index into the emitter's frames for this particle's own age, or 0 without a frame
sequence. Readable here for the same reason the rest of this interface is: a frame
sequence is simulation state (which frame a flame is on), so a test asserts it without a
renderer.
seconds this particle lives for
current interpolated values, recomputed every step from the emitter's range or curve
this particle's own tint, picked once at birth from the emitter's range
One live particle. Exposed as plain readable state rather than hidden inside the emitter, because that is what makes the simulation testable without a renderer at all: an emitter given no
textureruns the whole physics step and draws nothing, so a test drivesupdate(dt)and reads positions directly, the same splitLevelandTileMapalready draw between what a thing is and how it is drawn.