v/examples/fireworks/fireworks.v

78 lines
1.4 KiB
V
Raw Normal View History

import os
import objects
import gg
import gx
import rand
struct App {
mut:
gg &gg.Context = 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 :)
}
fn on_frame(mut app App) {
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 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.gg = gg.new_context(
width: objects.width
height: objects.height
window_title: 'Fireworks!'
bg_color: gx.black
use_ortho: true
user_data: app
frame_fn: on_frame
font_path: font_path
)
app.gg.run()
}