module main
import vendor.raylib rl
let PipeRectangles = type struct {
top: rl.Rectangle,
bottom: rl.Rectangle,
}
let playfield_pixel_height_for(screen_height: i32): i32 =
(screen_height.(f64) * (1.0 - base_height_fraction)).(i32)
let playfield_pixel_height(): i32 =
playfield_pixel_height_for(rl.get_screen_height())
let world_to_pixel_x(world_x: f64): i32 {
// Horizontal world units use screen height as their scale. A wider window
// displays more world space without changing the width of game objects.
return (world_x * playfield_pixel_height().(f64)).(i32)
}
let world_to_pixel_y(world_y: f64): i32 {
return ((1.0 - world_y) * playfield_pixel_height().(f64)).(i32)
}
let world_size_to_pixels(size: f64): i32 {
return (size * playfield_pixel_height().(f64)).(i32)
}
let base_rectangle(): rl.Rectangle {
let screen_height = rl.get_screen_height()
let playfield_height = playfield_pixel_height()
return .{
x = 0.0,
y = playfield_height.(f32),
width = rl.get_screen_width().(f32),
height = (screen_height - playfield_height).(f32),
}
}
let bird_rectangle(state: *GameState): rl.Rectangle {
let bird_pixel_size = world_size_to_pixels(bird_size)
let bird_pixel_x = world_to_pixel_x(bird_x)
let bird_pixel_y = world_to_pixel_y(state.bird_y)
return .{
x = (bird_pixel_x - bird_pixel_size / 2).(f32),
y = (bird_pixel_y - bird_pixel_size / 2).(f32),
width = bird_pixel_size.(f32),
height = bird_pixel_size.(f32),
}
}
let pipe_rectangles(pipe: *Pipe): PipeRectangles {
let playfield_height = playfield_pixel_height()
let pipe_pixel_width = world_size_to_pixels(pipe_width)
let pipe_pixel_left = world_to_pixel_x(pipe.x) - pipe_pixel_width / 2
let gap_centre_pixel_y = world_to_pixel_y(pipe.gap_y)
let gap_pixel_size = world_size_to_pixels(pipe_gap_size)
let gap_top = gap_centre_pixel_y - gap_pixel_size / 2
let gap_bottom = gap_centre_pixel_y + gap_pixel_size / 2
return .{
top = .{
x = pipe_pixel_left.(f32),
y = 0.0,
width = pipe_pixel_width.(f32),
height = gap_top.(f32),
},
bottom = .{
x = pipe_pixel_left.(f32),
y = gap_bottom.(f32),
width = pipe_pixel_width.(f32),
height = (playfield_height - gap_bottom).(f32),
},
}
}
let bird_collides_with_pipes(state: *GameState): bool {
let bird = bird_rectangle(state)
for let mut i: usz = 0; i < @len(state.pipes); i += 1 {
let rectangles = pipe_rectangles(state.pipes[i].&)
if rl.check_collision_recs(bird, rectangles.top) ||
rl.check_collision_recs(bird, rectangles.bottom) {
return true
}
}
return false
}