Руслану нужно что-то вроде лазер бейсика, только с меньшим расходом памяти и желательно с поддержкой 128 кб. Чтобы показать юзабельность ZXDev в этом случае на примере игры «Бега мышей» хотелось бы подробнее осветить вопросы оптимизации программ, разработанных с помощью этой среды.
Итак, пункт 1 — наиболее очевидный. К игре подключен весь набор спрайтов LaserSprite2B, а мы можем ограничиться одной мышкой. Что я иллюстрирую приложенным архивом. Размер игры сократился до 6,8 кб. Это безусловно не предел, ведь мы почти не коснулись кода.
Дальнейшая оптимизация по размеру может быть достигнута путём разбиения кода Laser Basic на отдельные подпрограммы, из которых к нашей игре будут подключены только использованные фрагменты. Это сложная и квалифицированная работа, к которой я питаю устойчивое отвращение. И, видимо, не только я.
Но такая оптимизация дала бы нам несколько килобайт выигрыша. Ладно, не будем огорчаться. Я предлагаю другое. Чтобы и оптимизировать игру, и заодно чуть-чуть вывести её из абстракций Laser Basic'а, слишком ориентированных на Спектрум-экран с атрибутами, приходит такая идея: обозначить спрайт мышки, выводимый без атрибутов (что нужно для игры), как двухцветный спрайт с задаваемыми отдельно цветами фона и чернил. Это не бог весть какая удобная абстракция для современных высокотехнологичных игр, но для «мышек» вполне сгодится. По крайней мере, тут уже нету упоминания об атрибутах. Да и двухцветный спрайт на других платформах может быть, например, оранжево-фиолетовым, что недостижимо на Спеке.
Сейчас на данный момент я реализовал аппарат прозрачных и непрозрачных двухцветных (моно) тайлов размером 8x8 точек для платформ Windows и Linux (используется библиотека SDL), а также Java ME. Для Спекки разбирать мышку на тайлы мне не хочется, это чуть-чуть неправильно — потому что вычисление смещений и вывод мышки по кусочкам придётся поднять на высокий уровень, теряя необходимую эффективность. Поэтому дальнейшая оптимизация будет выглядеть как вариативная:
- Просто оторвать процедуру Laser.PTBL от остального кода библиотеки. Побочным эффектом будет отрывание PTOR, PTXR и PTND, которые построены на этой же базе.
- Разработать процедуру вывода двухцветного спрайта (с задаваемыми цветами фона и чернил) произвольного размера. В Спектрум-варианте пусть не будут забыты: формат (важно для скорости вывода!) спрайта (в каком порядке лучше хранить массив пикселей), способ вывода (XOR, OR, AND, PUT, на первое время можно ограничиться выводом PUT), специфическая координатная система (пусть будет только вывод по координатам, кратным 8, т.е. знакоместам) и конечно корректная работа при выходе спрайта за пределы экрана. Отдельно хотелось бы не забыть возможность выхода за пределы экрана не только справа/снизу, но и слева/сверху.
Подобную же процедуру разработать и для других платформ (перечисленных выше с SDL и Java ME). Это позволит чуть-чуть сместить акценты от Спектрума в пользу других платформ.
Считаю полезными оба эти направления. В качестве чернового варианта можно было бы конечно побить «мышку» на моно-тайлы и выводить не с помощью Laser.PTBL, а по GrTiles.DrawMonoTile8x8, но это направление мне кажется не очень удачным. Для Спектрум-варианта игры — пока мы не откажемся от Laser'а полностью, заменив его другими процедурами, или пока Laser не будет разбит на фрагменты для смартлинковки — это не даст никакого выигрыша в размере кода, т.к. код Laser Basic'а всё равно пристёгнут к игре полностью.
Я не ставлю цели оптимизировать «Бега мышей» по самое небалуйся, просто размышляю на тему оптимизации в ZXDev и миграции кода на другие платформы возможными средствами XDev с точки зрения абстракций, которыми выражена эта игра. Можно взять и другую игру конечно. Только сперва несложную. В ZXDev и XDev ещё мало библиотек.