o
odinpkg.dev
packages / library / osignals

osignals

85248a2library

A lightweight package that implements Godot-style signals to enable the observer pattern in Odin

MIT · updated 9 months ago

osignals

A lightweight package that implements Godot-style signals to enable the observer pattern in Odin

Example Usage

HealthStruct :: struct {
    health: int,
    max: int,
    damage_taken: int
}

Player :: struct {
    health: int,
    max: int,

    health_changed: osignals.Signal(HealthStruct)
}

player_init :: proc(p: ^Player) {
    p.health = 100
    p.max = 100

    osignals.signal_init(&p.health_changed)
}

player_destroy :: proc(p: ^Player) {
    osignals.signal_destroy(&p.health_changed)
}

player_take_damage :: proc(p: ^Player, amount: int) {
    old_health := p.health
    p.health = max(0, p.health - amount)

    data := HealthStruct{
        health = p.health,
        max = p.max,
        damage_taken = amount,
    }

    osignals.signal_emit(&p.health_changed, data)
}

player_health_updated :: proc(data: HealthStruct) {
    fmt.println("Current health: ", data.health)
    fmt.println("Damage Taken: ", data.damage_taken)
}

main :: proc() {
    player: Player
    player_init(&player)
    defer player_destroy(&player)

    osignals.signal_connect(&player.health_changed, player_health_updated)

    player_take_damage(&player, 10)
}