examples: Add gameloop example

Signed-off-by: Lilis Iskandar <lilis@veand.co>
This commit is contained in:
Lilis Iskandar 2024-03-26 12:32:03 +08:00
parent 4b17b2bbcf
commit f382722f5f
No known key found for this signature in database
GPG Key ID: 7EE2F0C4E86662C6
2 changed files with 183 additions and 0 deletions

View File

@ -0,0 +1,101 @@
package main
import "github.com/veandco/go-sdl2/sdl"
const (
TITLE = "README"
WIDTH = 800
HEIGHT = 600
FRAMERATE = 60
)
var (
playerX, playerY = int32(WIDTH / 2), int32(HEIGHT / 2)
playerVX, playerVY = int32(0), int32(0)
running = true
)
func main() {
if err := sdl.Init(sdl.INIT_EVERYTHING); err != nil {
panic(err)
}
defer sdl.Quit()
window, err := sdl.CreateWindow(TITLE, sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, sdl.WINDOW_SHOWN)
if err != nil {
panic(err)
}
defer window.Destroy()
surface, err := window.GetSurface()
if err != nil {
panic(err)
}
for running {
for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
handleEvent(event)
}
loopTime := loop(surface)
window.UpdateSurface()
delay := (1000 / FRAMERATE) - loopTime
sdl.Delay(delay)
}
}
func handleEvent(event sdl.Event) {
switch t := event.(type) {
case sdl.QuitEvent: // NOTE: Please use `*sdl.QuitEvent` for `v0.4.x` (current version).
println("Quitting..")
running = false
break
case sdl.KeyboardEvent:
if t.State == sdl.RELEASED {
if t.Keysym.Sym == sdl.K_LEFT {
playerVX -= 1
} else if t.Keysym.Sym == sdl.K_RIGHT {
playerVX += 1
}
if t.Keysym.Sym == sdl.K_UP {
playerVY -= 1
} else if t.Keysym.Sym == sdl.K_DOWN {
playerVY += 1
}
}
break
}
}
func loop(surface *sdl.Surface) (loopTime uint32) {
// Get time at the start of the function
startTime := sdl.GetTicks()
// Update player position
playerX += playerVX
playerY += playerVY
if playerX < 0 {
playerX = WIDTH
} else if playerX > WIDTH {
playerX = 0
}
if playerY < 0 {
playerY = HEIGHT
} else if playerY > HEIGHT {
playerY = 0
}
// Clear surface
surface.FillRect(nil, 0)
// Draw on the surface
rect := sdl.Rect{playerX, playerY, 4, 4}
colour := sdl.Color{R: 255, G: 0, B: 255, A: 255} // purple
pixel := sdl.MapRGBA(surface.Format, colour.R, colour.G, colour.B, colour.A)
surface.FillRect(&rect, pixel)
// Calculate time passed since start of the function
endTime := sdl.GetTicks()
return endTime - startTime
}

View File

@ -0,0 +1,82 @@
package main
import "github.com/veandco/go-sdl2/sdl"
const (
TITLE = "README"
WIDTH = 800
HEIGHT = 600
)
var (
playerX, playerY = int32(WIDTH / 2), int32(HEIGHT / 2)
running = true
)
func main() {
if err := sdl.Init(sdl.INIT_EVERYTHING); err != nil {
panic(err)
}
defer sdl.Quit()
window, err := sdl.CreateWindow(TITLE, sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, sdl.WINDOW_SHOWN)
if err != nil {
panic(err)
}
defer window.Destroy()
surface, err := window.GetSurface()
if err != nil {
panic(err)
}
// Draw initial frame
draw(window, surface)
// Event loop
for event := sdl.WaitEvent(); event != nil; event = sdl.WaitEvent() {
switch t := event.(type) {
case sdl.QuitEvent: // NOTE: Please use `*sdl.QuitEvent` for `v0.4.x` (current version).
println("Quitting..")
return
case sdl.KeyboardEvent:
if t.State == sdl.RELEASED {
if t.Keysym.Sym == sdl.K_LEFT {
playerX -= 4
} else if t.Keysym.Sym == sdl.K_RIGHT {
playerX += 4
}
if t.Keysym.Sym == sdl.K_UP {
playerY -= 4
} else if t.Keysym.Sym == sdl.K_DOWN {
playerY += 4
}
if playerX < 0 {
playerX = WIDTH
} else if playerX > WIDTH {
playerX = 0
}
if playerY < 0 {
playerY = HEIGHT
} else if playerY > HEIGHT {
playerY = 0
}
draw(window, surface)
}
break
}
}
}
func draw(window *sdl.Window, surface *sdl.Surface) {
// Clear surface
surface.FillRect(nil, 0)
// Draw on the surface
rect := sdl.Rect{playerX, playerY, 4, 4}
colour := sdl.Color{R: 255, G: 0, B: 255, A: 255} // purple
pixel := sdl.MapRGBA(surface.Format, colour.R, colour.G, colour.B, colour.A)
surface.FillRect(&rect, pixel)
window.UpdateSurface()
}