Particles¶
Particle effects are typically used for visuals such as the effect when a note is hit. They are somewhat similar to sprites, but may contain their own animations and support functionality such as looping. However, they come with the restriction that they do not have their own z-indexes, and thus are always drawn on top of sprites while having no set order between themselves.
Declaration¶
Particles are declared with the @particles
decorator. Standard Sonolus particles
are declared by using a value from StandardParticle
as the type hint.
Custom particles may also be defined using the Particle
type hint and the
particle
function.
from sonolus.script.particle import particles, particle, StandardParticle, Particle
@particles
class Particle:
tap_note_hit_linear: StandardParticle.NOTE_LINEAR_TAP_CYAN
tap_note_hit_circular: StandardParticle.NOTE_CIRCULAR_TAP_CYAN
custom_particle: Particle = particle("name_of_custom_particle")
Spawning a Particle¶
To spawn a particle, you can use the spawn
method of the particle. This
method accepts a Quad
object that defines the position of the particle on the screen,
a duration in seconds determining how quick the particle animation should play, and optionally whether the particle
should loop:
from sonolus.script.particle import Particle
from sonolus.script.quad import Quad
my_particle: Particle = ...
my_quad = Quad(
tl=Vec2(-0.5, 0.5),
tr=Vec2(0.5, 0.5),
bl=Vec2(-0.5, -0.5),
br=Vec2(0.5, -0.5),
)
handle = my_particle.spawn(my_quad, duration=0.5, loop=False)
The call to spawn
will return a
ParticleHandle
that can be used to control the particle after it has been
spawned.
Moving a Particle¶
A particle can be moved using the move
method of the
ParticleHandle
:
from sonolus.script.particle import ParticleHandle
from sonolus.script.quad import Quad
my_particle_handle: ParticleHandle = ...
new_position: Quad = ...
my_particle_handle.move(new_position)
Destroying a Particle¶
A particle can be destroyed using the destroy
method of the
ParticleHandle
:
from sonolus.script.particle import ParticleHandle
my_particle_handle: ParticleHandle = ...
my_particle_handle.destroy()
Checking Particle Availability¶
A particle effect may not be available depending on which effects a user has selected. To check if a particle is
available, you can use the is_available
method of a
Particle
:
from sonolus.script.particle import Particle
my_particle: Particle = ...
if my_particle.is_available():
# The particle is available, you can spawn it.
...
else:
# Do something else, such as using a fallback particle.
...