diff --git a/src/main.odin b/src/main.odin index 3cbbd3d..976dcbd 100644 --- a/src/main.odin +++ b/src/main.odin @@ -21,10 +21,10 @@ main :: proc() { TILEMAP_TILE_SIZE, TILEMAP_TILE_SIZE, ) - grid = create_tile_grid(300, 300) + grid = create_tile_grid(1500, 1500) player = { - position = {20, 20}, + position = {1500, 500}, camera = { zoom = 4, offset = {f32(raylib.GetScreenWidth()) / 2, f32(raylib.GetScreenHeight()) / 2}, @@ -66,7 +66,7 @@ update :: proc(delta: f32) { @(private = "file") draw :: proc() { - draw_tile_grid(&tilemap_sheet, grid) + draw_tile_grid(&tilemap_sheet, grid, &player.camera) draw_player(&player) } diff --git a/src/player.odin b/src/player.odin index 9e35948..78fd23c 100644 --- a/src/player.odin +++ b/src/player.odin @@ -59,17 +59,17 @@ handle_player_input :: proc(p: ^Player, delta: f32) { is_moving := dir.x != 0 || dir.y != 0 if (is_moving) { - is_sprinting:= false + is_sprinting := false if raylib.IsKeyDown(.LEFT_SHIFT) { is_sprinting = true } else { is_sprinting = false } - + dir = raylib.Vector2Normalize(dir) - if is_sprinting{ + if is_sprinting { dir = dir * PLAYER_SPRINT_SPEED p.animator.anim.fps = 11 } else { diff --git a/src/tilemap.odin b/src/tilemap.odin index 563bf8e..16e8356 100644 --- a/src/tilemap.odin +++ b/src/tilemap.odin @@ -1,5 +1,6 @@ package main +import "core:fmt" import "vendor:raylib" TilemapSpritesheet :: struct { @@ -43,14 +44,37 @@ update_tile_grid :: proc(grid: [][]Tile, delta: f32) { } } -draw_tile_grid :: proc(sheet: ^TilemapSpritesheet, grid: [][]Tile) { - for y := 0; y < len(grid); y += 1 { + +draw_tile_grid :: proc(sheet: ^TilemapSpritesheet, grid: [][]Tile, camera: ^raylib.Camera2D) { + screen_w := f32(raylib.GetScreenWidth()) + screen_h := f32(raylib.GetScreenHeight()) + + world_w := screen_w / camera.zoom + world_h := screen_h / camera.zoom + + min_x := camera.target.x - world_w * 0.5 + min_y := camera.target.y - world_h * 0.5 + max_x := min_x + world_w + max_y := min_y + world_h + + tile_w := f32(sheet.tile_width) + tile_h := f32(sheet.tile_height) + + start_x := max(int(min_x / tile_w), 0) + start_y := max(int(min_y / tile_h), 0) + + end_x := min(int(max_x / tile_w), len(grid[0]) - 1) + end_y := min(int(max_y / tile_h), len(grid) - 1) + + for y := start_y; y <= end_y; y += 1 { row := grid[y] - for x := 0; x < len(row); x += 1 { + for x := start_x; x <= end_x; x += 1 { tile := &row[x] - if (tile.type == TileType.NOTHING) do continue - pos := raylib.Vector2{f32(x * int(sheet.tile_width)), f32(y * int(sheet.tile_height))} - draw_tile(sheet, tile, pos, raylib.Color{255, 136, 0, 255}) + if tile.type == TileType.NOTHING do continue + + pos := raylib.Vector2{f32(x) * tile_w, f32(y) * tile_h} + + draw_tile(sheet, tile, pos, raylib.Color{0, 136, 200, 255}) } } }