Sustentada e percutida, lado a lado
import hive.ui
type Msg { Tick }
type Car {
seat: Int
x: Float
z: Float
speed: Float
knock: Bool
}
// Um func como todo outro construtor de formas deste arquivo, e vale notar
// que um som é exatamente tão valor quanto uma box: sessenta destes são
// construídos por segundo e jogados fora, enquanto a voz do outro lado do
// nome segue rodando o tempo todo.
func noises(cars: Car[]): ui.Shape[dyn] {
mut ui.Shape[dyn] out = []
for each car in cars {
// Sustentada: dura enquanto a scene continuar a nomeando, e dobra
// com a velocidade em vez de ser reiniciada em uma nova.
append(out, ui.sound([
ui.at(car.x, 0.6, car.z),
ui.voice(ui.Voice.Engine()),
ui.pitch(0.7 + car.speed / 90.0),
ui.volume(0.6),
], "engine-{car.seat}"))
// Percutida: dispara quando o nome chega e fica surda a tudo depois
// disso. Soltar o nome e trazê-lo de volta é um segundo impacto.
if car.knock {
append(out, ui.sound([
ui.at(car.x, 0.6, car.z),
ui.voice(ui.Voice.Impact()),
ui.pitch(1.0),
ui.volume(0.8),
], "hit-{car.seat}"))
}
}
return out
}
func view(cars: Car[dyn]): ui.View {
solids := [ui.ground([ui.paint(ui.Tone.HEX("#3a3f45"))], 400.0, 400.0)]
return ui.scene([
ui.grow(1),
ui.eye(0.0, 1.4, 6.0),
ui.aim(0.0, 0.0),
ui.background(ui.Tone.HEX("#8ec5ff")),
], solids + noises(cars))
}
proc update(cars: Car[dyn], msg: Msg, envelope: hive.syslink.Envelope): Car[dyn] {
return cars
}
proc main(): void {
Car[dyn] grid = [Car(1, -2.0, 0.0, 40.0, false), Car(2, 2.0, -6.0, 62.0, true)]
ui.window("Som", view, update, grid)
}