97 lines
1.7 KiB
Go
97 lines
1.7 KiB
Go
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()
|
|
}
|