diff options
Diffstat (limited to 'engine/Components')
| -rw-r--r-- | engine/Components/Layering.go | 67 | ||||
| -rw-r--r-- | engine/Components/World.go | 33 | ||||
| -rw-r--r-- | engine/Components/World/Tile.go | 40 | ||||
| -rw-r--r-- | engine/Components/World/World.go | 68 |
4 files changed, 98 insertions, 110 deletions
diff --git a/engine/Components/Layering.go b/engine/Components/Layering.go new file mode 100644 index 0000000..3e42b44 --- /dev/null +++ b/engine/Components/Layering.go @@ -0,0 +1,67 @@ +package components + +type LayeringElement interface { + Draw() + // returnt Y-index of the element + GetYIndex() float32 +} + +// Stores elements by their Y-layer ordered in decreasing order. +// Used to draw objects in the correct order on screen +type layering struct { + ObjectCount int + firstLayer *layer +} + +func (base *layering) Insert(new LayeringElement) { + base.ObjectCount += 1 + var y = new.GetYIndex() + var newLayer = layer { + Index: y, + Objects: []LayeringElement { new }, + } + if base.firstLayer == nil { + base.firstLayer = &newLayer + return + } + + // The first layer is greater than the current first layer + if base.firstLayer.Index > y { + newLayer.next = base.firstLayer + base.firstLayer = &newLayer + return + } + + var current = base.firstLayer + var next *layer + for { + if current == nil { + break + } + next = current.Next() + if current.Index == y { + current.Objects = append(current.Objects, new) + return + } + if y < current.Index && y > next.Index { + newLayer.next = next + current.next = &newLayer + return + } + if current.Next() == nil { + current.next = &newLayer + return + } + next = current + } +} + +type layer struct { + Index float32 + Objects []LayeringElement + next *layer +} + +func (base *layer) Next() *layer { + return base.next +} diff --git a/engine/Components/World.go b/engine/Components/World.go index 3f7a0d4..0c322ba 100644 --- a/engine/Components/World.go +++ b/engine/Components/World.go @@ -16,6 +16,8 @@ type World struct { Camera *rl.Camera2D + layersStatic layering + // ========== Cache ========== // the collection of the colliders that belong to static objects - world, buildings, etc @@ -25,6 +27,8 @@ type World struct { func (base *World) Create(manager coreobjects.SceneManager) { base.Manager = manager base.Player.Init(manager) + base.layersStatic = layering{} + base.generateStaticLayers() } func (base *World) Destroy() { @@ -64,10 +68,35 @@ func (base *World) Draw() { for _, v := range base.Floor { v.Draw() } + + var playerDrawn = false + var layer = base.layersStatic.firstLayer + var i = 0 + for { + if layer == nil { + break + } + if !playerDrawn && base.Player.Position.Y < layer.Index { + playerDrawn = true + // fmt.Printf("Player drawn at layer %d\n", i) + base.Player.Draw() + } + for _, v := range layer.Objects { + v.Draw() + } + layer = layer.Next() + i++ + } + // Ensure that the player was drawn + if !playerDrawn { + base.Player.Draw() + } +} + +func (base *World) generateStaticLayers() { for _, v := range base.StaticObjects { - v.Draw() + base.layersStatic.Insert(v) } - base.Player.Draw() } // The single texture drawn at level 0 of the world diff --git a/engine/Components/World/Tile.go b/engine/Components/World/Tile.go deleted file mode 100644 index a8ee827..0000000 --- a/engine/Components/World/Tile.go +++ /dev/null @@ -1,40 +0,0 @@ -// DEPRECATED -package world - -import ( - descriptors "github.com/DegustatorPonos/RuinesOfRafdolon/Dynamic/Descriptors" - rl "github.com/gen2brain/raylib-go/raylib" -) - -// The square that will be displayed at the screen -type Tile interface { - Update() - Draw() -} - -type StandardTile struct { - X float32 - Y float32 - ParentWorld *World - Descriptor descriptors.TileDescriptor -} - -func (base *StandardTile) Update() { -} - -func (base *StandardTile) Draw() { - rl.DrawTexture(base.ParentWorld.Textures[base.Descriptor.TextureId], - int32(base.X) * int32(base.ParentWorld.TileSize.X), - int32(base.Y) * int32(base.ParentWorld.TileSize.Y), - rl.White) - if base.Descriptor.OveralyTextureId != 0 { - var overlayTexture = base.ParentWorld.Textures[base.Descriptor.OveralyTextureId] - var dx = (base.ParentWorld.TileSize.X - float32(overlayTexture.Width)) / 2 - var dy = (float32(overlayTexture.Height) - base.ParentWorld.TileSize.Y) - - rl.DrawTexture(overlayTexture, - int32(base.X) * int32(base.ParentWorld.TileSize.X) + int32(dx), - int32(base.Y) * int32(base.ParentWorld.TileSize.Y) - int32(dy), - rl.White) - } -} diff --git a/engine/Components/World/World.go b/engine/Components/World/World.go deleted file mode 100644 index 8809409..0000000 --- a/engine/Components/World/World.go +++ /dev/null @@ -1,68 +0,0 @@ -// DEPRECATED -package world - -import ( - coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects" - rl "github.com/gen2brain/raylib-go/raylib" -) - -var Texture rl.Texture2D - -// The scene full of tiles -type World struct { - Name string `json:"name"` - TileSize rl.Vector2 `json:"tilesize"` - TextureNames map[int]string `json:"textures"` - Textures map[int]rl.Texture2D `json:"-"` - Tiles [][]Tile `json:"tiles"` - Camera rl.Camera2D `json:"-"` -} - -func (base *World) IsValid() error { - return nil -} - -func (base *World) Create(_ coreobjects.SceneManager) { - base.Textures = map[int]rl.Texture2D{} - for k, v := range base.TextureNames { - var image = rl.LoadImage(v) - base.Textures[k] = rl.LoadTextureFromImage(image) - rl.UnloadImage(image) - } - - base.Camera = rl.Camera2D{} - base.Camera.Target = rl.Vector2 { X: 0, Y: 0 } - base.Camera.Offset = rl.Vector2 { X: 0, Y: 0 } - base.Camera.Rotation = 0 - base.Camera.Zoom = 2 -} - -func (base *World) Destroy() { - rl.UnloadTexture(Texture) -} - -func (base *World) Update() { - if rl.IsKeyDown(rl.KeyW) { - base.Camera.Target.Y -= 0.3 - } - if rl.IsKeyDown(rl.KeyS) { - base.Camera.Target.Y += 0.3 - } - if rl.IsKeyDown(rl.KeyA) { - base.Camera.Target.X -= 0.3 - } - if rl.IsKeyDown(rl.KeyD) { - base.Camera.Target.X += 0.3 - } -} - -func (base *World) Draw() { - rl.BeginMode2D(base.Camera) - defer rl.EndMode2D() - - for _, r := range base.Tiles { - for _, v := range r { - v.Draw() - } - } -} |
