aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/examples/hot_reload/bounce.v
blob: 135ad52b2911e8e8899e16d3191a32345d55f520 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Build this example with
// v -live bounce.v
module main

import gx
import gg
import time

struct Game {
mut:
	gg      &gg.Context
	x       int
	y       int
	dy      int
	dx      int
	height  int
	width   int
	draw_fn voidptr
}

const (
	window_width  = 400
	window_height = 300
	width         = 50
)

fn main() {
	mut game := &Game{
		gg: 0
		dx: 2
		dy: 2
		height: window_height
		width: window_width
		draw_fn: 0
	}
	game.gg = gg.new_context(
		width: window_width
		height: window_height
		font_size: 20
		user_data: game
		window_title: 'Hot code reloading demo'
		create_window: true
		frame_fn: frame
		bg_color: gx.white
		font_path: gg.system_font_path()
	)
	// window.onkeydown(key_down)
	println('Starting the game loop...')
	go game.run()
	game.gg.run()
}

// Try uncommenting or changing the lines inside the live functions.
// Guess what will happen:
[live]
fn frame(mut game Game) {
	game.gg.begin()
	game.gg.draw_text_def(10, 5, 'Modify examples/hot_reload/bounce.v to get instant updates')
	game.gg.draw_rect(game.x, game.y, width, width, gx.blue)
	game.gg.draw_rect(window_width - width - game.x + 10, 200 - game.y + width, width,
		width, gx.rgb(228, 10, 55))
	game.gg.draw_rect(game.x - 25, 250 - game.y, width, width, gx.rgb(28, 240, 55))
	game.gg.end()
}

[live]
fn (mut game Game) update_model() {
	speed := 2
	game.x += speed * game.dx
	game.y += speed * game.dy
	if game.y >= game.height - width || game.y <= 0 {
		game.dy = -game.dy
	}
	if game.x >= game.width - width || game.x <= 0 {
		game.dx = -game.dx
	}
}

fn (mut game Game) run() {
	for {
		game.update_model()
		time.sleep(16 * time.millisecond) // 60fps
	}
}