diff options
Diffstat (limited to 'v_windows/v/examples/fireworks/fireworks.v')
-rw-r--r-- | v_windows/v/examples/fireworks/fireworks.v | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/v_windows/v/examples/fireworks/fireworks.v b/v_windows/v/examples/fireworks/fireworks.v new file mode 100644 index 0000000..9581cc5 --- /dev/null +++ b/v_windows/v/examples/fireworks/fireworks.v @@ -0,0 +1,119 @@ +import os +import objects +import gg +import gx +import rand + +struct App { +mut: + gg &gg.Context = 0 + ui &objects.UIParams = 0 + rockets []objects.Rocket + frames [][]objects.Rocket + // i thought about using a fixed fifo queue for the frames but the array + // seemed to work fine, if you'd like a challenge try implementing it with the queue :) + draw_flag bool = true +} + +fn on_frame(mut app App) { + if !app.draw_flag { + return + } + app.gg.begin() + + // drawing previous frames + for mut frame in app.frames { + for mut rocket in frame { + if !rocket.exploded { + rocket.color.a = byte(f32_max(rocket.color.a - 8, 0)) + rocket.draw(mut app.gg) + } + } + } + + // chance of firing new rocket + if rand.intn(30) == 0 { + app.rockets << objects.new_rocket() + } + // simulating rockets + app.rockets = app.rockets.filter(!it.dead) + + for mut rocket in app.rockets { + rocket.tick(mut app.gg) + } + + // adding frame + mut frame := app.rockets.clone() + + for mut rocket in frame { + rocket.particles = [] + } + + app.frames << frame + + // trimming out frames + if app.frames.len > 30 { + app.frames.delete(0) + } + + app.gg.end() +} + +fn on_event(e &gg.Event, mut app App) { + match e.typ { + .resized, .resumed { + app.resize() + } + .iconified { + app.draw_flag = false + } + .restored { + app.draw_flag = true + app.resize() + } + else { + // println("Type ${e.typ}") + } + } +} + +fn (mut app App) resize() { + size := gg.window_size() + // avoid calls when minimized + if size.width < 2 && size.height < 2 { + return + } + mut s := gg.dpi_scale() + + if s == 0.0 { + s = 1.0 + } + app.ui.dpi_scale = s + app.ui.width = size.width + app.ui.height = size.height +} + +// is needed for easier diagnostics on windows +[console] +fn main() { + mut font_path := os.resource_abs_path(os.join_path('../assets/fonts/', 'RobotoMono-Regular.ttf')) + $if android { + font_path = 'fonts/RobotoMono-Regular.ttf' + } + + mut app := &App{} + app.ui = objects.get_params() + + app.gg = gg.new_context( + width: app.ui.width + height: app.ui.height + window_title: 'Fireworks!' + bg_color: gx.black + user_data: app + frame_fn: on_frame + event_fn: on_event + font_path: font_path + ) + + app.gg.run() +} |