Laser2Demo.zip с прыгающим инопланетным чудиком. Вывод за пределами экрана пока не реализован. Бинарь занимает 986 байт, из них:
661 байт - массив спрайтов (4 фазы чудика, 5x4 знакомест каждая, без атрибутов).
123 байта - основная подпрограмма вывода спрайта Laser2_PUT_SPRITE_INSCR.
202 байта - остальной код (в т.ч. процедуры установки цветов, задержки, инициализации и т.д.)
Старый вариант этой же демки (на библиотеке Raydac/Michailov, со сделанной мною смартлинковкой) занимает 2686 байт.Код:MODULE Laser2Demo; (*$MAIN*) (* LASER BASIC 2 Demo for Sinclair ZX Spectrum 48 Kb *) (* Copyright (C) 2016 Oleg N. Cher, VEDAsoft Oberon Club *) IMPORT gr := Laser2, b := Basic; (* Пример взят из книги "Как написать игру для ZX Spectrum" *) CONST FrameSizeBytes = 5(*hdr*) + 8*20(*data*) ; TYPE Sprites = ARRAY FrameSizeBytes * 4 (*frames*) + 1 OF CHAR; CONST Chudik = Sprites ( ... ); (* Данные спрайтов поскипаны *) VAR x, phase: SHORTINT; BEGIN b.Init; b.COLOR(b.Bright + b.Black*b.Paper + b.Yellow); b.BORDER(b.Black); b.CLS; gr.InitSpritesAr(Chudik); gr.ATOF; FOR x := -2+2 TO 30-2 BY 2 DO FOR phase := 1 TO 4 DO gr.PTBL(x, 5, phase); b.PAUSE(5) END; END; b.Quit END Laser2Demo.
Думаю, это хороший результат. Для дерзновенных предлагаю оптимизировать процедуру вывода ещё сильнее. ;-)
В планах реализовать вывод спрайтов за пределами экрана. Потом ещё несколько подпрограмм: скроллинг окон, атрибутов и т.д. Все процедуры из набора LASER BASIC реализовывать не планирую, только нужные (мне).
- - - Добавлено - - -
Сделал процедуру для выбора экрана (по адресу), чтобы иметь возможность выводить на второй экран, да и вообще в виртуальный экран в памяти. Сначала хотел назвать SCRN, сообразно стилю LASER BASIC, но отказался от этого, назвал SetScreen. Так новая, не входящая в набор ранее, процедура будет заметнее, ибо коррелирует с InitSprites, InitSpritesEx и InitSpritesAr.
Конвертер спрайтов LASER BASIC в LASER BASIC 2 будет включен в дистрибутив ZXDev (с исходниками). Конвертирует на уровне исходного текста, но не бинаря. Пока понимает только Оберон, планирую добавить Си. Утилита очень сырая, нет никакой обработки ошибок, но всё, что нужно, она делает, а больше пока не требуется.
Типичный модуль ресурсов игры на Обероне может выглядеть так (сам инициализируя LASER BASIC 2):
Код:MODULE Rsrc; (** Resource *) IMPORT Laser2; TYPE SpritesT = ARRAY SpriteSize OF CHAR; CONST Spr1* = 1; (* Константа - номер спрайта, экспортируется, т.е. её видно извне *) Spr2* = 2; (* ... *) Sprites = SpritesT ( ... ); BEGIN Laser2.InitSpritesAr(Sprites) END Rsrc.Код:MODULE MyGame; (*$MAIN*) IMPORT Laser2, Rsrc; ... BEGIN ... Laser2.PTBL(x, y, Rsrc.Spr2); ... END MyGame.





Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
