From bc11ae4b42547ace656381fb0ed0b3604350fcb1 Mon Sep 17 00:00:00 2001 From: Physcik Date: Tue, 27 Jan 2026 18:37:27 +0500 Subject: Sprites layering --- engine/Components/Layering.go | 67 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 engine/Components/Layering.go (limited to 'engine/Components/Layering.go') 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 +} -- cgit v1.3