package main import ( "log" stdmath "math" "time" "github.com/pnx/go-raytracer/graphics" "github.com/pnx/go-raytracer/math" "github.com/pnx/go-raytracer/render" "github.com/pnx/go-raytracer/world" "github.com/veandco/go-sdl2/sdl" ) var ( gfxContext *graphics.Context player Player level *world.Level startOfFrame time.Time ) func loadLevel(newLevel *world.Level) { level = newLevel // Set player start position start := level.PlayerStart() player.Position = math.Position{ X: (float64(start.X) + 0.5) * world.TileSize, Y: (float64(start.Y) + 0.5) * world.TileSize, } } func update() bool { for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() { switch ev := event.(type) { case *sdl.QuitEvent: return true case *sdl.KeyboardEvent: if ev.Type == sdl.KEYDOWN { switch ev.Keysym.Sym { case sdl.K_ESCAPE: return true } } } } keys := sdl.GetKeyboardState() if keys[sdl.SCANCODE_UP] != 0 { player.MoveForward(level) } if keys[sdl.SCANCODE_DOWN] != 0 { player.MoveBackward(level) } if keys[sdl.SCANCODE_LEFT] != 0 { player.RotateLeft() } if keys[sdl.SCANCODE_RIGHT] != 0 { player.RotateRight() } return false } func main() { var err error gfxContext, err = graphics.Init("Go Raycaster", 1024, 768) if err != nil { log.Fatal(err) } player = Player{ MoveSpd: 2, RotSpd: 0.05, } loadLevel(&world.Level1) for { startOfFrame := time.Now() if update() { break } render.DrawScene(gfxContext, player.Transform, level) render.DrawMiniMap(gfxContext, player.Transform, level) gfxContext.Sync() elapsed := time.Since(startOfFrame) sdl.Delay(uint32(stdmath.Max(16-float64(elapsed.Milliseconds()), 1))) } gfxContext.Exit() }