From 174dc73f6cb5920f2e5faccf42473511ee0473d6 Mon Sep 17 00:00:00 2001 From: Jason Hilder Date: Thu, 10 Sep 2026 07:43:46 +0200 Subject: [PATCH] Level logic now lives in a manager. --- src/level_manager.odin | 73 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/level_manager.odin diff --git a/src/level_manager.odin b/src/level_manager.odin new file mode 100644 index 0000000..81dbf38 --- /dev/null +++ b/src/level_manager.odin @@ -0,0 +1,73 @@ +package game + +import rl "vendor:raylib" + +// ------------------------------------------------------------------------------ +// LEVEL specifics +// ------------------------------------------------------------------------------ +Level :: struct { + field_bounds: rl.Rectangle, + player: Entity, + enemy: Entity, + ball: Entity, + serve_timer: f32, + wait_time: f32, + score_player: int, + score_enemy: int, +} + +FIELD_BORDER :: 3 +SERVE_WAIT_TIME :: 0.5 + +init_level :: proc() -> Level { + // positions work off viewport resolution, independent of target display size + // 10% padding around the field + pad_x := f32(VIEWPORT_W) * 0.10 + pad_y := f32(VIEWPORT_H) * 0.10 + + bounds := rl.Rectangle{ + x = pad_x, + y = pad_y, + width = f32(VIEWPORT_W) - (pad_x * 2), + height = f32(VIEWPORT_H) - (pad_y * 2), + } + + player_ent := init_player() + player_ent.pos.x = bounds.x + FIELD_BORDER + player_ent.pos.y = bounds.y + (bounds.height / 2) - (player_ent.size.y / 2) + + enemy_ent := init_enemy() + enemy_ent.pos.x = (bounds.x + bounds.width) - (enemy_ent.size.x) - FIELD_BORDER + enemy_ent.pos.y = bounds.y + (bounds.height / 2) - (enemy_ent.size.y / 2) + + return Level{ + field_bounds = bounds, + player = player_ent, + enemy = enemy_ent, + ball = init_ball(), + serve_timer = SERVE_WAIT_TIME, + wait_time = SERVE_WAIT_TIME, + score_player = 0, + score_enemy = 0, + } +} + +update_level :: proc(level: ^Level, input: Input_Event, dt: f32) { + update_player(&level.player, input, level.field_bounds, dt) + // update_enemy(&level.enemy, level.ball, level.field_bounds, dt) + update_ball(&level.ball, level, dt) +} + +render_level :: proc(level: Level) { + rl.DrawRectangleRec(level.field_bounds, rl.DARKGRAY) + rl.DrawRectangleLinesEx(level.field_bounds, FIELD_BORDER, rl.RAYWHITE) + + center_x := f32(VIEWPORT_W) / 2.0 + start_pos := rl.Vector2{center_x, level.field_bounds.y + FIELD_BORDER} + end_pos := rl.Vector2{center_x, level.field_bounds.y + level.field_bounds.height - FIELD_BORDER} + rl.DrawLineEx(start_pos, end_pos, FIELD_BORDER, rl.WHITE) + + render_player(level.player, level.field_bounds) + render_enemy(level.enemy, level.field_bounds) + render_ball(level.ball, level.field_bounds) +}