From c818ad97ebd30bab76d2a519afcc8fc56e0e816f Mon Sep 17 00:00:00 2001 From: Larpon Date: Tue, 2 Feb 2021 18:37:43 +0100 Subject: [PATCH] examples: tetris: better mobile device support (#8519) --- examples/tetris/tetris.v | 86 +++++++++++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 23 deletions(-) diff --git a/examples/tetris/tetris.v b/examples/tetris/tetris.v index 09aa801f60..befa21d663 100644 --- a/examples/tetris/tetris.v +++ b/examples/tetris/tetris.v @@ -11,7 +11,7 @@ import gg import sokol.sapp const ( - block_size = 20 // pixels + block_size = 20 // virtual pixels field_height = 20 // # of blocks field_width = 10 tetro_size = 4 @@ -88,6 +88,10 @@ mut: lines int // State of the current game state GameState + // Block size in screen dimensions + block_size int = block_size + // Field margin + margin int // Position of the current tetro pos_x int pos_y int @@ -119,6 +123,10 @@ mut: second_sw time.StopWatch = time.new_stopwatch({}) } +fn remap(v f32, min f32, max f32, new_min f32, new_max f32) f32 { + return (((v - min) * (new_max - new_min)) / (max - min)) + new_min +} + [if showfps] fn (mut game Game) showfps() { game.frame++ @@ -135,6 +143,11 @@ fn (mut game Game) showfps() { } fn frame(mut game Game) { + ws := gg.window_size() + bs := remap(block_size, 0, win_height, 0, ws.height) + m := (f32(ws.width) - bs * field_width) * 0.5 + game.block_size = int(bs) + game.margin = int(m) game.frame_sw.restart() game.gg.begin() game.draw_scene() @@ -343,8 +356,8 @@ fn (g &Game) draw_next_tetro() { } fn (g &Game) draw_block_color(i int, j int, color gx.Color) { - g.gg.draw_rect(f32((j - 1) * block_size), f32((i - 1) * block_size), f32(block_size - 1), - f32(block_size - 1), color) + g.gg.draw_rect(f32((j - 1) * g.block_size) + g.margin, f32((i - 1) * g.block_size), + f32(g.block_size - 1), f32(g.block_size - 1), color) } fn (g &Game) draw_block(i int, j int, color_idx int) { @@ -363,17 +376,19 @@ fn (g &Game) draw_field() { } fn (mut g Game) draw_ui() { + ws := gg.window_size() + textsize := int(remap(text_size, 0, win_width, 0, ws.width)) g.gg.draw_text(1, 3, g.score.str(), text_cfg) lines := g.lines.str() - g.gg.draw_text(win_width - lines.len * text_size, 3, lines, text_cfg) + g.gg.draw_text(ws.width - lines.len * textsize, 3, lines, text_cfg) if g.state == .gameover { - g.gg.draw_rect(0, win_height / 2 - text_size, win_width, 5 * text_size, ui_color) - g.gg.draw_text(1, win_height / 2 + 0 * text_size, 'Game Over', over_cfg) - g.gg.draw_text(1, win_height / 2 + 2 * text_size, 'Space to restart', over_cfg) + g.gg.draw_rect(0, ws.height / 2 - textsize, ws.width, 5 * textsize, ui_color) + g.gg.draw_text(1, ws.height / 2 + 0 * textsize, 'Game Over', over_cfg) + g.gg.draw_text(1, ws.height / 2 + 2 * textsize, 'Space to restart', over_cfg) } else if g.state == .paused { - g.gg.draw_rect(0, win_height / 2 - text_size, win_width, 5 * text_size, ui_color) - g.gg.draw_text(1, win_height / 2 + 0 * text_size, 'Game Paused', text_cfg) - g.gg.draw_text(1, win_height / 2 + 2 * text_size, 'SPACE to resume', text_cfg) + g.gg.draw_rect(0, ws.height / 2 - textsize, ws.width, 5 * textsize, ui_color) + g.gg.draw_text(1, ws.height / 2 + 0 * textsize, 'Game Paused', text_cfg) + g.gg.draw_text(1, ws.height / 2 + 2 * textsize, 'SPACE to resume', text_cfg) } // g.gg.draw_rect(0, block_size, win_width, limit_thickness, ui_color) } @@ -416,6 +431,28 @@ fn on_event(e &sapp.Event, mut game Game) { if e.typ == .key_down { game.key_down(e.key_code) } + if e.typ == .touches_began || e.typ == .touches_moved { + if e.num_touches > 0 { + touch_point := e.touches[0] + game.touch_event(touch_point) + } + } +} + +fn (mut game Game) rotate_tetro() { + old_rotation_idx := game.rotation_idx + game.rotation_idx++ + if game.rotation_idx == tetro_size { + game.rotation_idx = 0 + } + game.get_tetro() + if !game.move_right(0) { + game.rotation_idx = old_rotation_idx + game.get_tetro() + } + if game.pos_x < 0 { + // game.pos_x = 1 + } } fn (mut game Game) key_down(key sapp.KeyCode) { @@ -443,19 +480,7 @@ fn (mut game Game) key_down(key sapp.KeyCode) { match key { .up { // Rotate the tetro - old_rotation_idx := game.rotation_idx - game.rotation_idx++ - if game.rotation_idx == tetro_size { - game.rotation_idx = 0 - } - game.get_tetro() - if !game.move_right(0) { - game.rotation_idx = old_rotation_idx - game.get_tetro() - } - if game.pos_x < 0 { - // game.pos_x = 1 - } + game.rotate_tetro() } .left { game.move_right(-1) @@ -476,3 +501,18 @@ fn (mut game Game) key_down(key sapp.KeyCode) { else {} } } + +fn (mut game Game) touch_event(touch_point C.sapp_touchpoint) { + ws := gg.window_size() + tx := touch_point.pos_x + ty := touch_point.pos_y + if ty < f32(ws.height) * 0.5 { + game.rotate_tetro() + } else { + if tx <= f32(ws.width) * 0.5 { + game.move_right(-1) + } else { + game.move_right(1) + } + } +}