Skip to content

09 Particle Effect ​

In this chapter, we will add a particle effect to the tap phase's hit event.

Existing Particle ​

The shared Particles class already declares the standard cyan circular tap particle from play mode. This code is for reference. Do not edit guide/lib/particle.py:

python
from sonolus.script.particle import StandardParticle, particles


@particles
class Particles:
    # ...

    note: StandardParticle.NOTE_CIRCULAR_TAP_CYAN

Particle Effect ​

In guide/tutorial/note.py, add this import with the other guide imports:

python
from guide.lib.particle import Particles

Then replace play_note_hit_effects with:

python
def play_note_hit_effects():
    layout = Rect.from_center(
        Vec2(0, 1),
        Vec2(4 * Config.note_radius, -4 * Config.note_radius),
    )
    Effects.perfect.play()
    Particles.note.spawn(layout, duration=0.3)

Sprites and particles use the engine coordinate system, so setting the particle's center to Vec2(0, 1) places it on the judgment line.

Checkpoint ​

Open the tutorial in Sonolus. Confirm that:

  • The judgment line remains visible throughout the phase.
  • The note appears enlarged, falls to the judgment line, and freezes there with the tap text and animated hand.
  • The sound and particle play once when the frozen range ends.
  • A one-second pause follows the hit. The particle remains visible for the first 0.3 seconds of that pause. The phase restarts when the full second ends.
  • Either navigation button restarts the phase immediately.

When these checks pass, rebuild the complete project with the finished tutorial:

shell
uv run sonolus-py build

Supporting more note types requires additional drawing functions, phase functions, resources, and state that selects the active phase. Those extensions are outside the scope of this guide.