Перед тем, как попасть на экран, видеоинформация о состоянии игры сначала организуется по слоям. На каждый слой выводятся объекты одного типа. Например, нижний уровень - это тайловая карта местности, на следующем уровне расположены юниты и здания, на следующем - деревья, горы и другая "растительность".
Слой - это битмапина, на которую один раз рисуется изображение, а затем оно в нужный момент выкидывается на экран. Если точнее, то сначала во временном буфере готовится изображение, которое надо вывести, а только потом оно блиттится на экран. Чтобы подготовить это изображение, я последовательно накладываю на чистый буфер все слои - от нижнего до верхнего. Так при изменении какого-то участка 3-го слоя, я перерисовываю маленький квадратик на третьей битмапине, а потом указанным способом копирую весь стек слоев под и над этой клеткой на экран.
Самый нижний уровень (карта ландшафта) представляет собой клеточную структуру, то есть тайлы местности неделимы.
Мост через реку не должен входить в клеточную структуру, потому что он имеет характеристики, которые не может иметь клетка - уровень повреждений, возможно какие-то дефекты в изображении, такие как воронка от снаряда, трещина, ну или чего там художники наделают... То есть мост - это обычный объект, такой, как кстати как и дерево, как вулкан и др.
У каждого юнита есть два параметра: "visible rectangle" (vrect) и "collision rectangle" (crect). vrect - это место, которое занимают все спрайты данного конкретного объекта, а crect - это параметр, характеризующий область юнита, обладающую массой, то есть которая собственно участвует в определении столкновений объектов. Так например для дерева:

Объектам с того же самого уровня, что и дерево, нельзя пересекать vrect, так как иначе нарушится вывод изображений. А юнитам с другого уровня я даю ограничение не заезжать за crect. Поэтому вулкан например нельзя поместить вплотную к дереву, а танк можно.
Специально для "user interface" выделен четвертый слой. Hапример в редакторе туда помещается слои радиоактивности, вязкости и др. В игре туда можно будет лепить менюхи и прочую лабуду типа отладчиков программ.
Анализ в игровом цикле изменяет поведение объектов. При этой обработке (Object::idle) у объекта могут поменяться некоторые характеристики, такие как координата, картинка, количество жизней, выводимые в виде полоски рядом с юнитом. А при вызове Object::draw объект смотрит: а не изменился ли я? (это делается вызовом virtual Object::changed, виртуальным, потому что у навороченных объектов могут быть свои представления о том изменились они или нет) Если изменился, то на старом месте рисуется прямоугольник прозрачного (0) цвета и вызывается Object::do_draw, по которой каждый объект делает свою отрисовку в указанных координатах и на указанной битмапине.