66 lines
1.6 KiB
Odin
66 lines
1.6 KiB
Odin
package main
|
|
|
|
import rl "vendor:raylib"
|
|
import "core:math"
|
|
|
|
|
|
PAD_MAX_SPEED : f32 = 600
|
|
PAD_ACCELERATION : f32 = 2000
|
|
PAD_ACCELERATION_REV : f32 = 2900
|
|
PAD_DECCELERATION : f32 = 2000
|
|
|
|
Pad :: struct {
|
|
position: Vec2,
|
|
velocity: Vec2,
|
|
size: Vec2,
|
|
health: f32,
|
|
}
|
|
|
|
|
|
pad_update :: proc(pad: ^Pad, delta: f32) {
|
|
pad.health = min(pad.health + delta, 100)
|
|
target : f32 = 0
|
|
if rl.IsKeyDown(rl.KeyboardKey.LEFT) {
|
|
target = -PAD_MAX_SPEED
|
|
}
|
|
if rl.IsKeyDown(rl.KeyboardKey.RIGHT) {
|
|
target = PAD_MAX_SPEED
|
|
}
|
|
|
|
target_sign := math.sign(target)
|
|
if target != 0 {
|
|
accel : f32 = PAD_ACCELERATION
|
|
if pad.velocity.x * target < 0 {
|
|
accel = PAD_ACCELERATION_REV
|
|
}
|
|
pad.velocity.x = clamp(pad.velocity.x + accel * target_sign * delta, -PAD_MAX_SPEED, PAD_MAX_SPEED)
|
|
} else {
|
|
vel_sign := math.sign(pad.velocity.x)
|
|
deccel := PAD_DECCELERATION * vel_sign * delta
|
|
if math.abs(pad.velocity.x) > math.abs(deccel) {
|
|
pad.velocity.x -= deccel
|
|
}
|
|
else {
|
|
pad.velocity.x = 0
|
|
}
|
|
}
|
|
pad.position += pad.velocity * delta
|
|
|
|
pad_half_width := pad.size.x / 2
|
|
if pad.position.x < pad_half_width {
|
|
pad.position.x = pad_half_width
|
|
pad.velocity.x = 0
|
|
}
|
|
if pad.position.x > GameField.x - pad_half_width {
|
|
pad.position.x = GameField.x - pad_half_width
|
|
pad.velocity.x = 0
|
|
}
|
|
|
|
}
|
|
|
|
pad_draw :: proc(pad: ^Pad) {
|
|
rl.DrawRectanglePro(rl.Rectangle{pad.position.x, pad.position.y, pad.size.x, pad.size.y}, pad.size / 2, 0, rl.RED)
|
|
hbar_x := pad.health / 100 * pad.size.x
|
|
rl.DrawRectanglePro(rl.Rectangle{pad.position.x, pad.position.y, hbar_x, pad.size.y/2}, {hbar_x / 2, pad.size.y / 4}, 0, rl.GREEN)
|
|
}
|