mirror of
				https://github.com/yeslayla/golang-game-framework.git
				synced 2025-11-04 08:43:06 +01: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