diff options
| author | Physcik <mynameisgennadiy@vk.com> | 2026-01-27 18:37:27 +0500 |
|---|---|---|
| committer | Physcik <mynameisgennadiy@vk.com> | 2026-01-27 18:37:27 +0500 |
| commit | bc11ae4b42547ace656381fb0ed0b3604350fcb1 (patch) | |
| tree | bb18c160d117becadc86093b274a03d656b25405 /engine/Components/Layering.go | |
| parent | d240f6fa5fa4784def3f0ee291a51fecbab43ac3 (diff) | |
Sprites layering
Diffstat (limited to 'engine/Components/Layering.go')
| -rw-r--r-- | engine/Components/Layering.go | 67 |
1 files changed, 67 insertions, 0 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 +} |
