Files
pong_raylib/src/game.odin
T

82 lines
2.3 KiB
Odin

package game
import rl "vendor:raylib"
VIEWPORT_W :: 1280
VIEWPORT_H :: 720
WINDOW_W :: 2560
WINDOW_H :: 1440
WINDOW_TITLE :: "Pong"
Game :: struct {
viewport: rl.RenderTexture2D,
// base scene (gameplay, mainmenu)
scene: Scene,
// active overlay (pause, settings, or nil)
overlay_scene: Maybe(Overlay_Scene),
}
// ------------------------------------------------------------------------------
// Game Lifecycle
// ------------------------------------------------------------------------------
game_init :: proc(game: ^Game) {
rl.InitWindow(WINDOW_W, WINDOW_H, WINDOW_TITLE)
rl.SetTargetFPS(60)
game.viewport = rl.LoadRenderTexture(VIEWPORT_W, VIEWPORT_H)
game.scene = init_gameplay_scene()
}
game_update :: proc(game: ^Game) {
dt := rl.GetFrameTime()
input := poll_input()
// update the overlay if active, otherwise update base scene
if game.overlay_scene != nil {
overlay_update(game, input, dt)
} else {
scene_update(game, input, dt)
}
}
game_render :: proc(game: ^Game) {
rl.BeginDrawing()
rl.ClearBackground(rl.BLACK)
// offscreen pass render everything into virtual 1280x720 target
rl.BeginTextureMode(game.viewport)
rl.ClearBackground(rl.BLACK)
scene_render(game) // Renders base scene (Level field or Main Menu)
overlay_render(game) // Renders active overlay on top if present
rl.EndTextureMode()
// upscale pass stretch virtual buffer onto physical window display
render_game_to_window(game.viewport.texture)
rl.EndDrawing()
}
game_quit :: proc(game: ^Game) {
rl.UnloadRenderTexture(game.viewport)
rl.CloseWindow()
}
game_should_run :: proc() -> bool {
return !rl.WindowShouldClose()
}
// ------------------------------------------------------------------------------
// Window Upscale Render
// ------------------------------------------------------------------------------
render_game_to_window :: proc(texture: rl.Texture) {
rl.DrawTexturePro(
texture,
// src: inverted y coordinate flips opengl texture buffer correctly
rl.Rectangle{0, 0, f32(texture.width), -f32(texture.height)},
// dst: scales viewport canvas to fill window resolution
rl.Rectangle{0, 0, f32(WINDOW_W), f32(WINDOW_H)},
rl.Vector2{},
0,
rl.WHITE,
)
}