examples: fix bounce.v; clean up tetris.v

pull/5203/head
Alexander Medvednikov 2020-06-04 16:53:19 +02:00
parent 1c43204224
commit c4a6ba76a1
2 changed files with 19 additions and 56 deletions

View File

@ -3,9 +3,7 @@
module main module main
import gx import gx
import gl
import gg import gg
import glfw
import time import time
struct Game { struct Game {
@ -17,7 +15,6 @@ mut:
dx int dx int
height int height int
width int width int
main_wnd &glfw.Window
draw_fn voidptr draw_fn voidptr
} }
@ -25,64 +22,44 @@ const (
window_width = 400 window_width = 400
window_height = 300 window_height = 300
width = 50 width = 50
red = gx.rgb(255, 0, 0)
green = gx.rgb(0, 255, 0)
blue = gx.rgb(0, 0, 255)
black = gx.rgb(0, 0, 0)
) )
fn main() { fn main() {
glfw.init_glfw()
mut game := &Game{ mut game := &Game{
gg: 0 gg: 0
dx: 2 dx: 2
dy: 2 dy: 2
height: window_height height: window_height
width: window_width width: window_width
main_wnd: 0
draw_fn: 0 draw_fn: 0
} }
window := glfw.create_window(glfw.WinCfg{ game.gg = gg.new_context({
width: window_width
height: window_height
borderless: false
title: 'Hot code reloading demo'
ptr: game
always_on_top: true
})
// window.onkeydown(key_down)
game.main_wnd = window
window.make_context_current()
gg.init_gg()
game.gg = gg.new_context(gg.Cfg{
width: window_width width: window_width
height: window_height height: window_height
font_size: 20 font_size: 20
use_ortho: true use_ortho: true
window_user_ptr: 0 user_data: game
window_title: 'Hot code reloading demo'
create_window: true
frame_fn: frame
bg_color: gx.white
}) })
// window.onkeydown(key_down)
println('Starting the game loop...') println('Starting the game loop...')
go game.run() go game.run()
for { game.gg.run()
if window.should_close() {
break
}
gl.clear()
gl.clear_color(255, 255, 255, 255)
game.draw()
window.swap_buffers()
glfw.wait_events()
}
} }
// Try uncommenting or changing the lines inside the live functions. // Try uncommenting or changing the lines inside the live functions.
// Guess what will happen: // Guess what will happen:
[live] [live]
fn (game &Game) draw() { fn frame (mut game Game) {
game.gg.draw_rect(game.x, game.y, width, width, blue) game.gg.begin()
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(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.draw_rect(game.x - 25, 250 - game.y, width, width, gx.rgb(28, 240, 55))
game.gg.end()
} }
[live] [live]
@ -101,16 +78,10 @@ fn (mut game Game) update_model() {
fn (mut game Game) run() { fn (mut game Game) run() {
for { for {
game.update_model() game.update_model()
glfw.post_empty_event() // Refresh //glfw.post_empty_event() // Refresh
time.sleep_ms(17) // 60fps time.sleep_ms(17) // 60fps
} }
} }

View File

@ -195,7 +195,7 @@ fn (mut g Game) init_game() {
g.parse_tetros() g.parse_tetros()
rand.seed(int(time.now().unix)) rand.seed(int(time.now().unix))
g.generate_tetro() g.generate_tetro()
g.field = [] // TODO: g.field = [][]int g.field = []
// Generate the field, fill it with 0's, add -1's on each edge // Generate the field, fill it with 0's, add -1's on each edge
for _ in 0..field_height + 2 { for _ in 0..field_height + 2 {
mut row := [0].repeat(field_width + 2) mut row := [0].repeat(field_width + 2)
@ -240,10 +240,7 @@ fn (mut g Game) move_tetro() bool {
y := block.y + g.pos_y + 1 y := block.y + g.pos_y + 1
x := block.x + g.pos_x x := block.x + g.pos_x
// Reached the bottom of the screen or another block? // Reached the bottom of the screen or another block?
// TODO: if g.field[y][x] != 0 if g.field[y][x] != 0 {
//if g.field[y][x] != 0 {
row := g.field[y]
if row[x] != 0 {
// The new tetro has no space to drop => end of the game // The new tetro has no space to drop => end of the game
if g.pos_y < 2 { if g.pos_y < 2 {
g.state = .gameover g.state = .gameover
@ -321,9 +318,7 @@ fn (g &Game) drop_tetro() {
x := tetro.x + g.pos_x x := tetro.x + g.pos_x
y := tetro.y + g.pos_y y := tetro.y + g.pos_y
// Remember the color of each block // Remember the color of each block
// TODO: g.field[y][x] = g.tetro_idx + 1 g.field[y][x] = g.tetro_idx + 1
mut row := g.field[y]
row[x] = g.tetro_idx + 1
} }
} }
@ -377,7 +372,7 @@ fn (mut g Game) draw_scene() {
fn parse_binary_tetro(t_ int) []Block { fn parse_binary_tetro(t_ int) []Block {
mut t := t_ mut t := t_
res := [Block{}].repeat(4) mut res := [Block{}].repeat(4)
mut cnt := 0 mut cnt := 0
horizontal := t == 9// special case for the horizontal line horizontal := t == 9// special case for the horizontal line
ten_powers := [1000,100,10,1] ten_powers := [1000,100,10,1]
@ -391,11 +386,8 @@ fn parse_binary_tetro(t_ int) []Block {
bin := digit % 2 bin := digit % 2
digit /= 2 digit /= 2
if bin == 1 || (horizontal && i == tetro_size - 1) { if bin == 1 || (horizontal && i == tetro_size - 1) {
// TODO: res[cnt].x = j res[cnt].x = j
// res[cnt].y = i res[cnt].y = i
mut point := &res[cnt]
point.x = j
point.y = i
cnt++ cnt++
} }
} }