//go:build linux package main import ( "time" rl "github.com/gen2brain/raylib-go/raylib" "symph/audio" "symph/game" "symph/input" raylibrender "symph/render/raylib" ) const ( defaultScreenW = 800 defaultScreenH = 600 ) func main() { rl.SetConfigFlags(rl.FlagWindowResizable | rl.FlagVsyncHint) rl.InitWindow(defaultScreenW, defaultScreenH, "Symph") defer rl.CloseWindow() rl.SetTargetFPS(60) state := game.New() sfx := audio.NewMuter(audio.NewEngine()) defer sfx.Close() renderer := raylibrender.NewRenderer(state) for !rl.WindowShouldClose() { now := time.Now() // Modifier state is polled, not queued ctrl := rl.IsKeyDown(rl.KeyLeftControl) || rl.IsKeyDown(rl.KeyRightControl) for { k := rl.GetKeyPressed() if k == 0 { break } if k == rl.KeyS && ctrl { renderer.Muted = sfx.Toggle() continue } if ik := keyFromRaylib(k); ik != input.KeyNone { state.Dispatch(input.Translate(ik), now) } } state.Update(now) for _, ge := range state.DrainEvents() { sfx.Play(audio.MapGameEvent(ge)) } rl.BeginDrawing() renderer.Draw(int32(rl.GetScreenWidth()), int32(rl.GetScreenHeight()), now) rl.EndDrawing() } } // keyFromRaylib translates a raylib keycode to a platform-neutral input.Key func keyFromRaylib(k int32) input.Key { switch k { case rl.KeyH: return input.KeyH case rl.KeyJ: return input.KeyJ case rl.KeyK: return input.KeyK case rl.KeyL: return input.KeyL case rl.KeySemicolon: return input.KeySemicolon case rl.KeyA: return input.KeyA case rl.KeyS: return input.KeyS case rl.KeyD: return input.KeyD case rl.KeyF: return input.KeyF case rl.KeySpace: return input.KeySpace case rl.KeyEnter, rl.KeyKpEnter: return input.KeyEnter } return input.KeyNone }