examples: Add gameloop example
Signed-off-by: Lilis Iskandar <lilis@veand.co>
This commit is contained in:
parent
4b17b2bbcf
commit
f382722f5f
|
@ -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
|
||||||
|
}
|
|
@ -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()
|
||||||
|
}
|
Loading…
Reference in New Issue