Заранее всё прорисовано. В памяти хранятся четвертинки или половинки спрайтов. Движок в реальном времени достраивает симметрию/зеркалку/копии. Масштабирования в программе нет, это очень долго будет рисоваться. Поэтому для разных удалений от игрока хранятся разные части спрайтов. Все необходимые спрайты под разными углами и удалениями из одного исходного bmp-файла получаю в своей программе 3D-View, вот тут она лежит: http://zx.pk.ru/showthread.php?t=15341
Каждая клетка лабиринта кодируется 16 значениями, занимает полбайта. Весь лабиринт 128х128 (8192 байта). Значения такие:
0 - пустота
1 - труп
2 - аптечка
3 - бассейн
4 - колонна
5 - сплошная стена
6 - враг стоит
7 - враг (фаза 1) вперед
8 - враг (фаза 1) назад
9 - враг (фаза 1) влево
A - враг (фаза 1) вправо
B - враг стреляет
C - враг (фаза 2) вперед
D - враг (фаза 2) назад
E - враг (фаза 2) влево
F - враг (фаза 2) вправо
Т.е., стена только одного вида. Другие никак не впихнешь. Если только ликвидировать колонны или бассейны. Бассейны кстати решил сделать просто - это всего лишь срезанные сверху до половины стены. Т.е., это уже больше похоже на барьеры, чем на бассейны. Изначально хотел делать бассейны с движущейся водой (2 фазы). Места в памяти уже впритык.
Врагов храню на карте, т.к.:
1. Единая процедура вывода сцены для всех элементов;
2. Иначе пришлось бы хранить отдельно и проверять все координаты врагов на каждом ходу, что сожрало бы память и быстродействие.