mirror of
https://github.com/yeslayla/golang-game-framework.git
synced 2025-09-13 11:33:53 +02:00
Initial commit
This commit is contained in:
133
sdl/sdl_render2d.go
Normal file
133
sdl/sdl_render2d.go
Normal file
@ -0,0 +1,133 @@
|
||||
package sdl
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"log"
|
||||
|
||||
"github.com/manleydev/golang-game-framework/core"
|
||||
"github.com/manleydev/golang-game-framework/rendering"
|
||||
"github.com/veandco/go-sdl2/sdl"
|
||||
)
|
||||
|
||||
type SdlRenderer2D struct {
|
||||
window *sdl.Window
|
||||
renderer *sdl.Renderer
|
||||
currentCamera *rendering.Camera2D
|
||||
}
|
||||
|
||||
type SdlRenderer2DInput struct {
|
||||
WindowTitle string
|
||||
WindowWidth int32
|
||||
WindowHeight int32
|
||||
Fullscreen bool
|
||||
}
|
||||
|
||||
func NewSdlRenderer2D(input SdlRenderer2DInput) *SdlRenderer2D {
|
||||
w := &SdlRenderer2D{}
|
||||
var err error
|
||||
|
||||
w.window, err = sdl.CreateWindow(input.WindowTitle,
|
||||
sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED,
|
||||
input.WindowWidth, input.WindowHeight,
|
||||
sdl.WINDOW_VULKAN)
|
||||
if err != nil {
|
||||
log.Print("Failed to create SDL window: ", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
if input.Fullscreen {
|
||||
if err := w.window.SetFullscreen(sdl.WINDOW_FULLSCREEN_DESKTOP); err != nil {
|
||||
log.Print("Failed to set fullscreen: ", err)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
w.window.SetResizable(true)
|
||||
|
||||
w.renderer, err = sdl.CreateRenderer(w.window, -1, sdl.RENDERER_ACCELERATED)
|
||||
if err != nil {
|
||||
log.Print("Failed to create SDL renderer: ", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
return w
|
||||
}
|
||||
|
||||
func (w SdlRenderer2D) Destroy() {
|
||||
if err := w.window.Destroy(); err != nil {
|
||||
log.Print("Failed to destroy SDL window: ", err)
|
||||
}
|
||||
|
||||
if err := w.renderer.Destroy(); err != nil {
|
||||
log.Print("Failed to destroy SDL renderer: ", err)
|
||||
}
|
||||
}
|
||||
|
||||
func (w *SdlRenderer2D) SetCamera(camera *rendering.Camera2D) error {
|
||||
w.currentCamera = camera
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w SdlRenderer2D) Update() error {
|
||||
for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
|
||||
switch event.(type) {
|
||||
case *sdl.QuitEvent:
|
||||
return errors.New("Quit system not yet implemented!")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w SdlRenderer2D) DrawTexture2D(input rendering.DrawTexture2DInput) error {
|
||||
tex, ok := input.Texture.(*SdlTexture2D)
|
||||
if !ok {
|
||||
return errors.New("Texture is not an SdlTexture2D!")
|
||||
}
|
||||
|
||||
center := tex.GetCenter()
|
||||
modifiers := rendering.Camera2DModifiers{
|
||||
Zoom: 1.0,
|
||||
Offset: core.Vector2{X: 0, Y: 0},
|
||||
}
|
||||
if w.currentCamera != nil {
|
||||
modifiers = (*w.currentCamera).GetModifiers()
|
||||
}
|
||||
|
||||
if err := w.renderer.CopyEx(tex.texture,
|
||||
&sdl.Rect{
|
||||
X: int32(input.Rect.X),
|
||||
Y: int32(input.Rect.Y),
|
||||
W: int32(input.Rect.W),
|
||||
H: int32(input.Rect.H),
|
||||
},
|
||||
&sdl.Rect{
|
||||
X: int32((input.Position.X - modifiers.Offset.X) * modifiers.Zoom),
|
||||
Y: int32((input.Position.Y - modifiers.Offset.Y) * modifiers.Zoom),
|
||||
W: int32(input.Rect.W * modifiers.Zoom),
|
||||
H: int32(input.Rect.H * modifiers.Zoom),
|
||||
}, input.Rotation,
|
||||
&sdl.Point{
|
||||
X: int32(center.X * modifiers.Zoom),
|
||||
Y: int32(center.Y * modifiers.Zoom),
|
||||
},
|
||||
sdl.FLIP_NONE); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w SdlRenderer2D) Draw() error {
|
||||
|
||||
w.renderer.Present()
|
||||
|
||||
if err := w.renderer.SetDrawColor(0, 0, 0, 255); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := w.renderer.Clear(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
70
sdl/sdl_texture2d.go
Normal file
70
sdl/sdl_texture2d.go
Normal file
@ -0,0 +1,70 @@
|
||||
package sdl
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/manleydev/golang-game-framework/core"
|
||||
"github.com/manleydev/golang-game-framework/rendering"
|
||||
"github.com/veandco/go-sdl2/sdl"
|
||||
)
|
||||
|
||||
type SdlTexture2D struct {
|
||||
texture *sdl.Texture
|
||||
}
|
||||
|
||||
func NewSdlTexture2D(renderer rendering.Renderer2D, bmpPath string) *SdlTexture2D {
|
||||
sdlRenderer, ok := renderer.(*SdlRenderer2D)
|
||||
if !ok {
|
||||
log.Print("Renderer is not an SDL renderer")
|
||||
return nil
|
||||
}
|
||||
|
||||
tex := SdlTexture2D{}
|
||||
surface, err := sdl.LoadBMP(bmpPath)
|
||||
if err != nil {
|
||||
log.Print("Failed to load bmp: ", err)
|
||||
return nil
|
||||
}
|
||||
defer surface.Free()
|
||||
|
||||
tex.texture, err = sdlRenderer.renderer.CreateTextureFromSurface(surface)
|
||||
if err != nil {
|
||||
log.Print("Failed to create SDL texture: ", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
return &tex
|
||||
}
|
||||
|
||||
func (tex SdlTexture2D) GetCenter() core.Vector2 {
|
||||
_, _, width, height, err := tex.texture.Query()
|
||||
if err != nil {
|
||||
log.Print("Could not get texture center: ", err)
|
||||
return core.Vector2{}
|
||||
}
|
||||
|
||||
return core.Vector2{
|
||||
X: float64(width / 2),
|
||||
Y: float64(height / 2),
|
||||
}
|
||||
}
|
||||
|
||||
func (tex SdlTexture2D) GetRect() core.Rect2D {
|
||||
_, _, width, height, err := tex.texture.Query()
|
||||
if err != nil {
|
||||
log.Print("Could not get texture data: ", err)
|
||||
return core.Rect2D{}
|
||||
}
|
||||
return core.Rect2D{
|
||||
X: 0,
|
||||
Y: 0,
|
||||
W: float64(width),
|
||||
H: float64(height),
|
||||
}
|
||||
}
|
||||
|
||||
func (tex SdlTexture2D) Destroy() {
|
||||
if err := tex.texture.Destroy(); err != nil {
|
||||
log.Print("Failed to destroy SDL texture: ", err)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user