v2 / examples / fireworks / modules / objects / rocket.v
68 lines · 57 sloc · 1.27 KB · e2e5cf8db56f3562c7baa735061690be936bdf3e
Raw
1module objects
2
3import gg
4import rand
5
6pub struct Rocket {
7pub mut:
8 color gg.Color
9 pos Vector
10 vel Vector
11 accel Vector
12 exploded bool
13 particles []Particle
14 dead bool
15}
16
17pub fn (rocket Rocket) draw(mut ctx gg.Context) {
18 ctx.draw_circle_filled(rocket.pos.x, get_params().height - rocket.pos.y,
19 get_params().rocket_radius, rocket.color)
20}
21
22pub fn (mut rocket Rocket) explode() {
23 rocket.exploded = true
24
25 for _ in 0 .. get_params().offspring_count {
26 rocket.spawn_particle()
27 }
28}
29
30pub fn (mut rocket Rocket) tick(mut ctx gg.Context) {
31 if !rocket.exploded {
32 if rocket.vel.y <= 1 {
33 rocket.explode()
34 }
35
36 rocket.accel += get_params().gravity
37 rocket.vel += rocket.accel
38 rocket.pos += rocket.vel
39 rocket.draw(mut ctx)
40
41 rocket.accel = Vector{}
42 }
43
44 for mut particle in rocket.particles {
45 particle.tick(mut rocket, mut ctx)
46 }
47}
48
49pub fn new_rocket() Rocket {
50 return Rocket{
51 color: random_color()
52 pos: Vector{
53 x: rand.f32_in_range(50, get_params().width - 50) or { 50 }
54 }
55 vel: Vector{
56 x: rand.f32_in_range(-1.5, 1.5) or { -1.5 }
57 y: rand.f32_in_range(5, 7) or { 5 }
58 }
59 }
60}
61
62pub fn (mut rocket Rocket) spawn_particle() {
63 rocket.particles << Particle{
64 color: rocket.color
65 pos: rocket.pos
66 accel: random_vector_in_circle().mult(2)
67 }
68}
69