--- /dev/null
+package main
+
+import rl "github.com/gen2brain/raylib-go/raylib"
+
+type Entity struct {
+ Texture rl.Texture2D
+ Position rl.Vector2
+ Size rl.Vector2
+ Flip bool
+}
+
+func NewEntity(
+ texture rl.Texture2D,
+ position rl.Vector2,
+ size rl.Vector2,
+) Entity {
+ return Entity{
+ Texture: texture,
+ Position: position,
+ Size: size,
+ }
+}
+
+func DrawEntity(entity Entity) {
+ srcRect := rl.Rectangle{
+ Width: entity.Size.X,
+ Height: entity.Size.Y,
+ }
+
+ if entity.Flip {
+ srcRect.Width = -srcRect.Width
+ }
+
+ dstRect := rl.Rectangle{
+ X: entity.Position.X,
+ Y: entity.Position.Y,
+ Width: entity.Size.X,
+ Height: entity.Size.Y,
+ }
+
+ origin := rl.Vector2{
+ X: entity.Size.X / 2,
+ Y: entity.Size.Y,
+ }
+
+ rl.DrawTexturePro(entity.Texture, srcRect, dstRect, origin, 0, rl.RayWhite)
+}
--- /dev/null
+github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I=
+github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
+github.com/gen2brain/raylib-go/raylib v0.0.0-20250215042252-db8e47f0e5c5 h1:k8ZAxLgb/p5TvCi5VHFHM8JdnjwShNK4A0bLIwbktAU=
+github.com/gen2brain/raylib-go/raylib v0.0.0-20250215042252-db8e47f0e5c5/go.mod h1:BaY76bZk7nw1/kVOSQObPY1v1iwVE1KHAGMfvI6oK1Q=
+golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
+golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=
+golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
--- /dev/null
+package main
+
+import (
+ rl "github.com/gen2brain/raylib-go/raylib"
+
+ "they-gone/assets"
+)
+
+const mapSize = 100
+
+type Tile uint8
+
+type App struct {
+ Camera rl.Camera2D
+ Entities []Entity
+}
+
+func moveVector() rl.Vector2 {
+ var vector rl.Vector2
+
+ if rl.IsKeyDown(rl.KeyA) { vector.X -= 1 }
+ if rl.IsKeyDown(rl.KeyD) { vector.X += 1 }
+
+ if rl.IsKeyDown(rl.KeyW) { vector.Y -= 1 }
+ if rl.IsKeyDown(rl.KeyS) { vector.Y += 1 }
+
+ return vector
+}
+
+func main() {
+ const windowWidth int = 800
+ const windowHeight int = 600
+
+ const playerSpeed float32 = 3
+
+ rl.InitWindow(int32(windowWidth), int32(windowHeight), "They left.")
+ defer rl.CloseWindow()
+
+ rl.SetTargetFPS(30)
+
+ playerImage := rl.LoadImageFromMemory(".png", assets.Player, int32(len(assets.Player)))
+
+ playerTexture := rl.LoadTextureFromImage(playerImage)
+ defer rl.UnloadTexture(playerTexture)
+
+ rl.UnloadImage(playerImage)
+
+ playerSize := rl.Vector2{ 300, 300 }
+
+ app := App{
+ Camera: rl.Camera2D{
+ Offset: rl.Vector2{ float32(windowWidth) / 2, float32(windowHeight) - playerSize.Y / 2 },
+ Zoom: 1,
+ },
+ Entities: make([]Entity, 0),
+ }
+
+ {
+ player := NewEntity(playerTexture, rl.Vector2{}, playerSize)
+ app.Entities = append(app.Entities, player)
+ }
+
+ player := &app.Entities[0]
+
+ for !rl.WindowShouldClose() {
+ moveVec := moveVector()
+
+ if moveVec.X > 0 { player.Flip = false }
+ if moveVec.X < 0 { player.Flip = true }
+
+ player.Position.X += playerSpeed * moveVec.X
+ player.Position.Y += playerSpeed * moveVec.Y
+
+ rl.BeginDrawing()
+
+ rl.ClearBackground(rl.Black)
+
+ {
+ rl.BeginMode2D(app.Camera)
+
+ for _, entity := range app.Entities {
+ DrawEntity(entity)
+ }
+
+ rl.EndMode2D()
+ }
+
+ rl.EndDrawing()
+ }
+}