v/examples/hot_code_reloading/bounce.v

89 lines
1.3 KiB
Go

// Build this example with
// v -live bounce.v
module main
import gx
import gl
import gg
import glfw
import time
struct Game {
mut:
vg *gg.GG
x int
y int
dy int
dx int
height int
width int
main_wnd *glfw.Window
draw_fn voidptr
}
fn main() {
glfw.init()
width := 600
height := 300
mut game := &Game{
vg: 0
dx: 3
dy: 3
height: height
width: width
}
mut window := glfw.create_window(glfw.WinCfg {
width: width,
height: height,
borderless: false,
title: 'Hot code reloading demo'
ptr: game
})
//window.onkeydown(key_down)
game.main_wnd = window
window.make_context_current()
gg.init()
game.vg = gg.new_context(gg.Cfg {
width: width
height: height
font_size: 20
use_ortho: true
})
println('Starting game loop...')
go game.run()
for {
gl.clear()
gl.clear_color(255, 255, 255, 255)
game.draw()
window.swap_buffers()
glfw.wait_events()
}
}
const (
W = 50
)
//[live] TODO segfaults
fn (ctx &Game) draw() {
ctx.vg.draw_rect(ctx.x, ctx.y, W, W, gx.rgb(0, 0, 255))
}
fn (ctx mut Game) run() {
for {
ctx.x += ctx.dx
ctx.y += ctx.dy
if ctx.y >= ctx.height - W || ctx.y <= 0 {
ctx.dy = - ctx.dy
}
if ctx.x >= ctx.width - W || ctx.x <= 0 {
ctx.dx = - ctx.dx
}
// Refresh
time.sleep_ms(30)
glfw.post_empty_event()
}
}