ebiten-camera
A simple camera implementation based on vrld's hump for LรVE
Usage
๐ Docs
Look at the examples to see how to use the library.
Here is a stripped-down version of the example code, highlighting the most important functions.
It won't run, so please don't bother trying it ๐
var (
cam *ebitenCamera.Camera
)
func main() {
w,h := 640, 480
cam = camera.NewCamera(w, h, 0, 0, 0, 1)
}
func (g *Game) Update() error {
cam.SetPosition(PlayerX+float64(PlayerSize)/2, PlayerY+float64(PlayerSize)/2)
return nil
}
func (g *Game) Draw(screen *ebiten.Image) {
cam.Surface.Clear()
cam.Surface.Fill(color.RGBA{255, 128, 128, 255})
tileOps := &ebiten.DrawImageOptions{}
cam.Surface.DrawImage(tiles, cam.GetTranslation(tileOps, 0, 0))
playerOps := &ebiten.DrawImageOptions{}
playerOps = cam.GetRotation(playerOps, PlayerRot, -float64(PlayerSize)/2, -float64(PlayerSize)/2)
playerOps = cam.GetScale(playerOps, 0.5, 0.5)
playerOps = cam.GetSkew(playerOps, 0, -0.5)
playerOps = cam.GetTranslation(playerOps, PlayerX, PlayerY)
cam.Surface.DrawImage(player, playerOps)
cam.Blit(screen)
}
Considerations
-
When setting the *ebiten.DrawImageOptions
in the ebitenCamera.Surface.DrawImage
function, the order of operation is
important!
Rotate, Scale, Skew and then Translate!
-
My example doesn't include a range for the camera's zoom to highlight what happens if you zoom too far in either direction. This is because I use a render texture to draw everything to, and I simply resize this when zooming in or out. This texture has a max size, causing the positioning logic to stop centering it. I'll probably change this at some point (unless you beat me to it with a PR, of course ๐)