package main import hm "core:container/handle_map" import "core:fmt" import rl "vendor:raylib" SCREEN_W :: 1280 SCREEN_H :: 720 MAX_ENEMIES :: 10 MAX_TILES :: 4096 Scene :: struct { player: Player, camera: rl.Camera2D, enemies: hm.Static_Handle_Map(128, Enemy, ent_handle), atlas: Atlas, tiles: [MAX_TILES]Tile, } create_scene :: proc() -> Scene { scene := Scene { player = Player { position = rl.Vector2{100, 100}, hp = 100, walk_speed = 300, run_speed = 500, col = 32, }, camera = rl.Camera2D { zoom = 1, offset = rl.Vector2{SCREEN_W / 2, SCREEN_H / 2}, }, } // _ = hm.add( // &scene.enemies, // Enemy { // position = rl.Vector2{500, 500}, // hp = 100, // speed = 100, // col = 32, // }, // ) // _ = hm.add( // &scene.enemies, // Enemy { // position = rl.Vector2{600, 600}, // hp = 100, // speed = 100, // col = 32, // }, // ) scene.atlas = load_atlas() // append( // &scene.tiles, // Tile{atlas = &scene.atlas, pos = rl.Vector2{0, 0}, frame = 3}, // ) return scene } draw_scene :: proc(scene: ^Scene) { rl.BeginMode2D(scene.camera) for tile in scene.tiles { if tile.atlas == nil do continue draw_tile(tile) } rl.DrawCircle( cast(i32)scene.player.position.x, cast(i32)scene.player.position.y, 32, rl.GREEN, ) rl.DrawRectangle(300, 300, 100, 100, rl.BLUE) it := hm.iterator_make(&scene.enemies) for i, _ in hm.iterate(&it) { rl.DrawCircle(cast(i32)i.position.x, cast(i32)i.position.y, 32, rl.RED) } rl.EndMode2D() } update_scene :: proc(scene: ^Scene, dt: f32) { update_player(&scene.player, dt) scene.camera.target = scene.player.position it := hm.iterator_make(&scene.enemies) for i, _ in hm.iterate(&it) { dir := rl.Vector2Normalize(scene.player.position - i.position) i.position += dir * i.speed * dt } resolve_collisions(scene) } Row :: distinct [16]i32 main :: proc() { fmt.println("Hello, world!") rl.InitWindow(SCREEN_W, SCREEN_H, "HUI") defer rl.CloseWindow() rl.SetTargetFPS(60) scene := create_scene() map_data := [16][16]i32 { {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, {16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18}, } for row, i in map_data { for col, j in row { scene.tiles[i * 16 + j] = Tile { atlas = &scene.atlas, pos = rl.Vector2{f32(j) * 16, f32(i) * 16}, frame = col, } } } for !rl.WindowShouldClose() { dt := rl.GetFrameTime() update_scene(&scene, dt) rl.BeginDrawing() { rl.ClearBackground(rl.BLACK) draw_scene(&scene) } rl.EndDrawing() } }