Updated simple entity code.

This commit is contained in:
2026-09-08 08:26:43 +02:00
parent 85417a6335
commit 2ce0d52e69
4 changed files with 82 additions and 25 deletions
+14 -6
View File
@@ -2,10 +2,10 @@ package game
import rl "vendor:raylib" import rl "vendor:raylib"
/* // ------------------------------------------------------------------------------
Entites are generic structures shared between enemies, environment items, player etc // Generic base structure shared by all world objects.
Anything here is intended to be used with any entity some optional and some required // Fields are populated selectively based on entity type.
*/ // ------------------------------------------------------------------------------
Entity_Type :: enum { Entity_Type :: enum {
Player, Player,
@@ -15,14 +15,22 @@ Entity_Type :: enum {
Shape_Type :: enum { Shape_Type :: enum {
Rectangle, Rectangle,
Circle Circle,
} }
Entity :: struct { Entity :: struct {
type: Entity_Type, type: Entity_Type,
active: bool, active: bool,
pos: rl.Vector2, pos: rl.Vector2,
vel: rl.Vector2,
shape: Shape_Type, shape: Shape_Type,
shape_size: rl.Vector2, shape_size: rl.Vector2,
// Fixed input speed (paddles)
speed: f32,
// 2D momentum & direction (ball / physics)
vel: rl.Vector2,
} }
// ------------------------------------------------------------------------------
// TODO: Entity Dispatchers
// ------------------------------------------------------------------------------
+20
View File
@@ -0,0 +1,20 @@
package game
import rl "vendor:raylib"
init_ball :: proc() -> Entity {
ball_radius: f32 = 25
return Entity{
type = .Ball,
active = true,
pos = rl.Vector2{(WINDOW_WIDTH / 2), (WINDOW_HEIGHT / 2) - (ball_radius / 2)},
speed = 900,
shape = .Circle,
shape_size = rl.Vector2{25, 0}
}
}
render_ball :: proc(ball: Entity, field_bounds: rl.Rectangle) {
rl.DrawCircleV(ball.pos, ball.shape_size.x, rl.MAROON)
}
+18
View File
@@ -0,0 +1,18 @@
package game
import rl "vendor:raylib"
init_enemy :: proc() -> Entity {
return Entity{
type = .Enemy,
active = true,
pos = rl.Vector2{0,0},
speed = 900,
shape = .Rectangle,
shape_size = rl.Vector2{50, 250}
}
}
render_enemy :: proc(enemy: Entity, field_bounds: rl.Rectangle) {
rl.DrawRectangleV(enemy.pos, enemy.shape_size, rl.BLACK)
}
+24 -13
View File
@@ -1,5 +1,6 @@
package game package game
import "core:math"
import rl "vendor:raylib" import rl "vendor:raylib"
init_player :: proc() -> Entity { init_player :: proc() -> Entity {
@@ -7,24 +8,34 @@ init_player :: proc() -> Entity {
type = .Player, type = .Player,
active = true, active = true,
pos = rl.Vector2{0,0}, pos = rl.Vector2{0,0},
vel = rl.Vector2{450,0}, speed = 900,
shape = .Rectangle, shape = .Rectangle,
shape_size = rl.Vector2{50, 250} shape_size = rl.Vector2{50, 250}
} }
} }
update_player :: proc(dt: f32, player: ^Entity) { update_player :: proc(dt: f32, player: ^Entity, level: ^Level) {
// Input bounds : rl.Rectangle = level.field_bounds
if rl.IsKeyDown(.W) do player.pos.y -= player.vel.x * dt
if rl.IsKeyDown(.S) do player.pos.y += player.vel.x * dt // 1. Gather Directional Input
move_dir: f32 = 0
if rl.IsKeyDown(.W) || rl.IsKeyDown(.UP) {
move_dir -= 1.0
}
if rl.IsKeyDown(.S) || rl.IsKeyDown(.DOWN) {
move_dir += 1.0
} }
render_player :: proc(player: Entity) { // 2. Apply Movement (Frame-rate independent)
rl.DrawRectangle( player.pos.y += move_dir * player.speed * dt
i32(player.pos.x),
i32(player.pos.y), // 3. Clamp Position within Field Bounds
i32(player.shape_size.x), min_y := bounds.y + 3 // Padding offset inside border
i32(player.shape_size.y), max_y := bounds.y + bounds.height - player.shape_size.y - 3
rl.BLACK
) player.pos.y = math.clamp(player.pos.y, min_y, max_y)
}
render_player :: proc(player: Entity, field_bounds: rl.Rectangle) {
rl.DrawRectangleV(player.pos, player.shape_size, rl.BLACK)
} }