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 }