Map Render

This commit is contained in:
2026-08-06 15:25:34 +03:00
parent c2eb4a7b24
commit dee1d4cc0f
8 changed files with 172 additions and 58 deletions
+77 -33
View File
@@ -9,11 +9,14 @@ 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,
}
@@ -31,29 +34,44 @@ create_scene :: proc() -> Scene {
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,
},
)
// _ = 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,
@@ -62,15 +80,12 @@ draw_scene :: proc(scene: ^Scene) {
)
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,
)
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()
}
@@ -79,25 +94,55 @@ 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
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!")
scene := create_scene()
rl.InitWindow(SCREEN_W, SCREEN_H, "HUI")
defer rl.CloseWindow()
rl.SetTargetFPS(200)
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() {
@@ -107,7 +152,6 @@ main :: proc() {
{
rl.ClearBackground(rl.BLACK)
draw_scene(&scene)
}
rl.EndDrawing()
}