package main import hm "core:container/handle_map" import "core:fmt" import rl "vendor:raylib" SCREEN_W :: 1280 SCREEN_H :: 720 MAX_ENEMIES :: 10 Scene :: struct { player: Player, camera: rl.Camera2D, enemies: hm.Static_Handle_Map(128, Enemy, ent_handle), } 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, }, ) return scene } draw_scene :: proc(scene: ^Scene) { rl.BeginMode2D(scene.camera) 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) for enemy in scene.enemies[:scene.enemy_count] { rl.DrawCircle( cast(i32)enemy.position.x, cast(i32)enemy.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 // Сначала двигаем всех врагов к игроку — без страха и упрёка for &enemy in scene.enemies[:scene.enemy_count] { dir := rl.Vector2Normalize(scene.player.position - enemy.position) enemy.position += dir * enemy.speed * dt } // Потом разлепляем коллизии — выталкиваем кто кого переехал resolve_collisions(scene) } main :: proc() { fmt.println("Hello, world!") scene := create_scene() rl.InitWindow(SCREEN_W, SCREEN_H, "HUI") defer rl.CloseWindow() rl.SetTargetFPS(200) for !rl.WindowShouldClose() { dt := rl.GetFrameTime() update_scene(&scene, dt) rl.BeginDrawing() { rl.ClearBackground(rl.BLACK) draw_scene(&scene) } rl.EndDrawing() } }