diff --git a/boids.odin b/boids.odin index 4bfef21..856046f 100644 --- a/boids.odin +++ b/boids.odin @@ -77,15 +77,30 @@ player_input :: proc(using s: ^GameState) { } update :: proc(using s: ^GameState) { + max_speed :f32 = 15 if fpoint, ok := follow_point.?; ok { for &boid in boids { + dist := rl.Vector2LengthSqr(fpoint - boid.pos) + if dist < 10 { + continue + } desired := fpoint - boid.pos - desired = rl.Vector2ClampValue(desired, 10, 10) + if dist < 200 { + desired = rl.Vector2Normalize(desired) * (dist / 200 * max_speed) + } else { + desired = rl.Vector2Normalize(desired) * max_speed + } steer := desired - boid.vel - steer = rl.Vector2ClampValue(steer, 0, 0.3) - boid.vel += steer - boid.angle = math.atan2(boid.vel.y, boid.vel.x) + steer = rl.Vector2ClampValue(steer, 0, 5) + boid.accel += steer + boid.vel += boid.accel boid.pos += boid.vel + + desired_angle := math.atan2(boid.vel.y, boid.vel.x) + angle := rl.Lerp(boid.angle, desired_angle, s.dt * 7) + boid.angle = angle + + boid.accel *= 0 } } } @@ -106,7 +121,6 @@ main :: proc() { rl.SetTraceLogLevel(.ERROR) rl.InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Boids") rl.SetTargetFPS(60) - // rl.DisableCursor() state := init_state() defer {