aboutsummaryrefslogtreecommitdiff
path: root/src/player.odin
diff options
context:
space:
mode:
authorXander Swan <no email>2025-12-05 09:27:12 -0500
committerXander Swan <no email>2025-12-05 09:27:12 -0500
commit3375d712e40cce1d17198ba20839f58a2a77d202 (patch)
tree856f517c9e9e59173b81b62a40bd4d2f1115d378 /src/player.odin
parent53cba1d004451f0782312cb203afb7da47a29c5f (diff)
add platforms and AABB collision
Diffstat (limited to 'src/player.odin')
-rw-r--r--src/player.odin52
1 files changed, 43 insertions, 9 deletions
diff --git a/src/player.odin b/src/player.odin
index e098167..1dd79ae 100644
--- a/src/player.odin
+++ b/src/player.odin
@@ -2,7 +2,6 @@ package demonchime
import "core:fmt"
import "core:math"
-import "core:math/linalg"
import sapp "shared:sokol/app"
@@ -13,11 +12,12 @@ Player :: struct {
vel: Vec2,
anim: draw.Animation,
sprite: draw.Sprite,
+ on_floor: bool
}
PLAYER_SPEED :: 100
PLAYER_ACCEL :: 10
-PLAYER_JUMP_FORCE :: 300
+PLAYER_JUMP_FORCE :: 350
init_player :: proc(p: ^Player) {
p.pos = Vec2{50, 50}
@@ -58,7 +58,7 @@ update_player :: proc(p: ^Player, dt: f32) {
draw.set_sprite_active_tag(&p.sprite, "down_idle")
}
- if is_keybind_down(state.input, state.input.jump) && p.pos.y >= 256 {
+ if is_keybind_down(state.input, state.input.jump) && p.on_floor {
p.vel.y = -PLAYER_JUMP_FORCE
}
@@ -69,18 +69,52 @@ update_player :: proc(p: ^Player, dt: f32) {
)
p.vel.y = math.min(p.vel.y + GRAVITY * dt, TERMINAL_VELOCITY)
- p.pos += p.vel * dt
-
- if p.pos.y > 256 {
- p.pos.y = 256
- p.vel.y = 0
+ res_pos := p.pos + p.vel * dt
+
+ rect_size := Vec2{f32(p.sprite.width), f32(p.sprite.height)}
+ rect_offset := Vec2{-rect_size.x / 2, -rect_size.y}
+
+ rect := Rect{
+ res_pos + rect_offset,
+ rect_size,
}
+ p.on_floor = false
+
+ iter := iter_entity_list(state.platform_list)
+ for plat in entity_list_iter(&iter) {
+ if aabb(rect, plat.rect) {
+ prev_rect := Rect{
+ p.pos + rect_offset,
+ rect_size,
+ }
+ if aabb_hori(prev_rect, plat.rect) {
+ if p.vel.y > 0 {
+ res_pos.y = plat.rect.start.y - rect.size.y - rect_offset.y
+ p.on_floor = true
+ } else {
+ res_pos.y = plat.rect.start.y + plat.rect.size.y - rect_offset.y
+ }
+ p.vel.y = 0
+ } else if aabb_vert(prev_rect, plat.rect) {
+ if p.vel.x > 0 {
+ res_pos.x = plat.rect.start.x - rect.size.x - rect_offset.x
+ } else {
+ res_pos.x = plat.rect.start.x + plat.rect.size.x - rect_offset.x
+ }
+ p.vel.x = 0
+ }
+ }
+ }
+
+ p.pos = res_pos
+
p.sprite.pos = p.pos
draw.update_sprite(&p.sprite, dt)
}
draw_player :: proc(p: Player) {
- draw.draw_sprite(&state.renderer, p.sprite)
+ draw.sprite(&state.renderer, p.sprite)
}
+