Files
hello/main.odin
T
2026-08-06 13:25:21 +03:00

115 lines
2.1 KiB
Odin

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()
}
}