Skip to content

06 Desenho de Notas

Neste capítulo, implementaremos a lógica de desenho do Note.

Declarando

Declare o sprite da skin da nota:

TypeScript
export const skin = defineSkin({
    sprites: {
        // ...
        note: SkinSpriteName.NoteHeadCyan,
    },
})
JavaScript
export const skin = defineSkin({
    sprites: {
        // ...
        note: SkinSpriteName.NoteHeadCyan,
    },
})

Desenho

Semelhante ao modo de reprodução, calculamos o valor z no retorno de chamada initialize e desenhamos o sprite da nota no retorno de chamada updateParallel .

No entanto, as notas podem aparecer e desaparecer várias vezes devido ao salto temporal dos jogadores. Devemos calcular o valor z apenas uma vez. Podemos usar uma variável extra para evitar recálculos desnecessários.

TypeScript
export class Note extends Archetype {
    // ...

    initialized = this.entityMemory(Boolean)

    // ...

    z = this.entityMemory(Number)

    // ...

    initialize() {
        if (this.initialized) return
        this.initialized = true

        this.z = 1000 - this.targetTime
    }

    updateParallel() {
        const y = Math.unlerp(this.visualTime.min, this.visualTime.max, time.scaled)

        const layout = Rect.one.mul(note.radius).scale(1, -1).translate(0, y)

        skin.sprites.note.draw(layout, this.z, 1)
    }
}
JavaScript
export class Note extends Archetype {
    // ...

    initialized = this.entityMemory(Boolean)

    // ...

    z = this.entityMemory(Number)

    // ...

    initialize() {
        if (this.initialized) return
        this.initialized = true

        this.z = 1000 - this.targetTime
    }

    updateParallel() {
        const y = Math.unlerp(this.visualTime.min, this.visualTime.max, time.scaled)

        const layout = Rect.one.mul(note.radius).scale(1, -1).translate(0, y)

        skin.sprites.note.draw(layout, this.z, 1)
    }
}