Самый простой способ «заставить это работать» - это рендерить в обратном Z-порядке. Это самое последнее.
В противном случае у вас есть проблема N ^ 2 по обнаружению окклюзии. Вы оптимизируете это путем создания деревьев окклюзии.
Другим вариантом может быть проверка буфера на глубину.
class Sprite
def occluded?(other)
# check collision in X and Y
# if they are colliding and self.z < other.z then self is partially or fully occluded
end
end