Просмотр полной версии : Sprite graber - проба пера
Alex Rider
09.01.2012, 01:44
Ударила меня ностальгия по Спектруму в новогодние праздники, решил вспомнить старый опыт. Почитал любимый самоучитель - "Как написать игру на ассемблере", увидел там бейсиковскую программу (с ассемблерными рутинами) для захвата спрайтов из экранного файла в формат, который автор пропагандировал. Для разминки переписал его на ассемблере (творил в SjAsm Plus + Unreal), кое-что дописал от себя. Можно смотреть как устроено (ибо не сложно), можно даже использовать, коли кому сгодится. Если случится вдруг чудо и кому-то это станет надо по жизни, готов даже поддерживать.
upd: SpriteGraber.zip - последняя актуальная версия. Также приложена инструкция.
увидел там бейсиковскую программу (с ассемблерными рутинами) для захвата спрайтов из экранного файла в формат, который автор пропагандировал.
В наше время спрайты рисовать и грабить сподручнее на пц...
Я правильно понимаю, что сама процедура печати спрайтов осталась без изменения?
(она ведь наверняка подлежит оптимизации)
Alex Rider
13.01.2012, 00:07
Процедуры захвата и печати спрайта полностью самописные, от оригинала остался только формат. Из процедуры печати спрайтов убран контроль выхода за границы экрана (ибо нужна она только для показа спрайта в левом верхнем углу). Во внутренних циклах печати спрайта для хранения промежуточных данных не используется стек в пользу альтернативных регистров. Думаю, там еще куча простора для оптимизации. Я старался писать не транжиря память и такты, но не думаю, что получился верх совершенства. Алгоритмы сдирания спрайта с экрана и печати его обратно живут в модуле SpriteTools.a80.
Если случится вдруг чудо и кому-то это станет надо по жизни, готов даже поддерживать.
вот сделай, чтоб программа выгружала вырезанные спрайты и кодовый блок, чтоб я потом мог их использовать подкидывая координаты в знакоместах!
Alex Rider
22.01.2012, 23:12
вот сделай, чтоб программа выгружала вырезанные спрайты и кодовый блок, чтоб я потом мог их использовать подкидывая координаты в знакоместах!
Совсем это на техзадание не похоже... Ты вот хотя бы на такие вопросы дай ответы:
1) Как должны передаваться координаты и номер спрайта?
2) Должен ли блок быть релоцируем?
3) Надо ли проверять выход всего спрайта или его части за пределы экрана? Что делать, если часть спрайта выходит за пределы экрана?
4) Надо ли делать печать по LD/OR/XOR/AND?
5) Надо ли уметь печатать в теневой экран? Если да, как должен задаваться его адрес?
---------- Post added at 23:12 ---------- Previous post was at 23:07 ----------
Кстати, еще в догонку: формат спрайта подразумевает, что, если он не прямоугольный, информация о пустых знакоместах может не храниться. Однако, моя тулза выдирает всегда прямоугольник, поскольку не может угадать пустое ли знакоместо она выдирает. Надо ли здесь сделать какую-то оптимизацию?
P.S. "Пустое" знакоместо - это знакоместо без пикселов (это легко узнать) и без фона. А вот как сказать, что у знакоместа "пустой" ("прозрачный") фон - я не знаю, альфа-канала нет. ;)
1. каждый спрайт вызывается по call "адрес спрайта", координаты передаются для каждого спрайта в "адрес спрайта+5 (,6)" в знакоместах. затем он обращается к процедуре вывода его.
2.да надо релоцируемость. или же чтоб я мог указать с какого адреса я буду распологать весь блок .(но чтоб вырезатель спрайтов показывал списком все адреса спрайтов+код в конце)
3.проверять ненадо. (хотя хорошо бы было чтоб скрывались части вне экрана)
4.обычная печать (цветная)
5.не печатать.
пример_____________
ld (адресс спрайта+N),x
ld (адресс спрайта+N),y
call адресс спрайта.
у каждого спрайта получится заголовок передающий данные координат,размера и запускающий выводилку.
---------- Post added at 22:42 ---------- Previous post was at 22:41 ----------
в догонку: простые прямоугольные спрайты. разного размера.
альфа-канала нет
Есть - папер = инк
---------- Post added at 23:52 ---------- Previous post was at 23:51 ----------
Либо - flash
Alex Rider
23.01.2012, 00:17
каждый спрайт вызывается по call "адрес спрайта", координаты передаются для каждого спрайта в "адрес спрайта+5 (,6)" в знакоместах.
Странный способ вызова... А не проще печатать спрайт по его номеру? Это и памяти меньше схавает, и вызывающий код меньше править если надо перенести блок или поменять размер спрайтов в нем. Мне все равно придется к каждому спрайту прилеплять такой код:
ld a,<номер спрайта>
jp <печать спрайта по номеру>
Я бы предложил такие способы указания координат и номера (адреса) спрайта:
-- за командой вызова, типа, так:
call put_sprite
defb x
defb y
defb n
-- через фиксированные (абсолютные или относительно начала блока) ячейки пямяти;
-- через регистры;
-- на стеке.
А по поводу релоцируемости - если ты даешь мне право выбора способа, то я за ввод базового адреса блока при сохранении. Только не хочу совсем этот адрес рисовать в параметры файла на диске.
---------- Post added at 00:17 ---------- Previous post was at 00:11 ----------
Есть - папер = инк
Либо - flash
Обо всем этом надо договариваться при оформлении экрана, с которого сдирается спрайт. Папер=инк может быть внутри спрайта если в нем пустое знакоместо, которое должно быть обязательно перекрашено при выводе. Для Flash тоже актуально. Как вариант - (paper == ink) && (flash == 1), но опять же требует предварительной обработки картинки перед сдиранием. Неудобно если внезапно захочется выкушать спрайт с экрана свежеиспеченного @-файла, к примеру.
за ввод базового адреса блока при сохранении
да, пусть так. или ввод адреса блока перед началом работы.
вот пример, посмотри как тут сделано.
в данном случае адресс спрайта 54214,
54214+13, - меняется координата Y,
65330 - кодовый блок.
Alex Rider
12.02.2012, 19:45
Сделал как просил AER.
В программе добавился пункт меню "Save Module", который выгружает набор спрайтов вместе с кодом отрисовки. Формат спрайта теперь другой: 2 байта - ширина, высота, потом байты атрибутов, потом растр. Соответственно, спрайты теперь всегда прямоугольные. Переписаны процедуры захвата и вывода под формат - сначала забираются/рисуются атрибуты, потом растр забирается/отрисовывается сверху вниз по линиям. Выгруженный модуль кода вместе со спрайтами релоцируем. Он имеет три точки входа со следующими смещениями от адреса загрузки:
-- +00 - координаты спрайта и его номер в наборе берутся по смещению +06..+08 от адреса загрузки в порядке x, y, n (подходит для вызова из BASIC'а);
-- +02 - координаты и номер передаются на регистрах (C = x, B = y, A = n);
-- +04 - координаты передаются в BC (C = x, B = y), адрес начала спрайта в памяти в HL.
отлично! все как просил.
даже переписал захваты,выводы как просил!
будем пробовать!!!
-- +04 - координаты передаются в BC (C = x, B = y), адрес начала спрайта в памяти в HL.
для какого случая так? быстрый вывод?
Alex Rider
12.02.2012, 20:31
для какого случая так? быстрый вывод?
Хороший вопрос... С учетом того, что данных для загрузки в HL взять негде, не знаю. Таблицу, которую дает программа, потребно пользовать для спрайтов без кодового блока. А как надо сделать?
P.S. Изначально было задумано, что так быстрее, ибо для вывода спрайта все равно надо считать его адрес по номеру, что делают точки по смещению +00 и +02.
А как надо сделать?
да никак. вызов этот мне непонадобится.
---------- Post added at 20:20 ---------- Previous post was at 20:15 ----------
для бейсика
poke adr+6,x
poke adr+7,y
poke adr+8,n
rand usr adr
так?
---------- Post added at 20:32 ---------- Previous post was at 20:20 ----------
не. нетак.
кстати, на черном фоне, не видно курсора выделения спрайта.
Alex Rider
12.02.2012, 23:46
да никак. вызов этот мне непонадобится.
Что-нить придумаю с ним. Спецификацию по остальным точкам это не затронет.
для бейсика
poke adr+6,x
poke adr+7,y
poke adr+8,n
rand usr adr
так?
не. нетак.
Если сделал LOAD "<имя файла>" CODE adr, то странно, что не так. Предполагалось, что так. А после LOAD "<имя файла>" CODE и не получится. В каталоге диска будет жить тот адрес, по которому этот блок лежит в грабилке.
кстати, на черном фоне, не видно курсора выделения спрайта.
Логично. Вывод рамки не изменяет атрибуты. Если в знакоместах INK == PAPER, ты не увидишь рамку. Перекрашивать цвета на экране при выделении тоже не дело.
RAND USR 15619:REM:LOAD "<имя файла>" CODE adr - так делал.
повисло после rand usr adr
по поводу курсяки его можно сделать мигающим по over 1 только чтоб потом скан спрайта прошел без отпечатка курсора.
Alex Rider
13.02.2012, 17:15
RAND USR 15619:REM:LOAD "<имя файла>" CODE adr - так делал.
повисло после rand usr adr
Странно. Приду домой - посмотрю.
по поводу курсяки его можно сделать мигающим по over 1 только чтоб потом скан спрайта прошел без отпечатка курсора.
Если в знакоместе INK = PAPER, то любые способы вывода пикселов в такое знакоместо дадут увиденный уже тобой результат. Равно как и включение FLASH. А любое изменение INK и PAPER исказит выделяемый спрайт визуально (ясно, что перед снятием с экрана цвета неплохо вернуть обратно).
незнаю как выделялка у тебя устроена. а если марать спрайт ровно вне его границ атрибутами? ай незнаю.
Alex Rider
13.02.2012, 19:53
незнаю как выделялка у тебя устроена. а если марать спрайт ровно вне его границ атрибутами? ай незнаю.
Предлагаю оставить как есть и не выдирать спрайты с экранов, где много знакомест с INK = PAPER (или не жаловаться, или готовить экраны с учетом этого ограничения). Выделялка рисует рамку по OVER 1 с текущими атрибутами знакоместа на экране, из которого выдираем.
Если "марать спрайт ровно вне его границ" (что, как я понял, все равно подрезумевает перекрашивание знакомест, в которых выводится рамка), то, во-первых, на раскрашенных картинках выглядеть рамка будет все равно ужасно, а, во-вторых, где рисовать рамку вне границ спрайта когда он прижат к краю экрана, я не соображу ни разу.
Alex Rider
13.02.2012, 22:40
RAND USR 15619:REM:LOAD "<имя файла>" CODE adr - так делал.
повисло после rand usr adr
Не поучилось у меня повесить. Сделал так:
1) Скачал свой архив с форума.
2) На trd записал экран со спрайтами.
3) Запустил SPTGEN.
4) Загрузил экран.
5) Сделал 1 спрайт командой "Create sprite".
6) Сохранил код и спрайт новой командой "Save module" под именем "test".
7) Перезагрузился.
8) Из 48-го BASIC'а написал RANDOMIZE USR 15619: REM: LOAD "test" CODE 32768
9) Сделал RANDOMIZE USR 32768 - спрайт появился в позиции (0, 0), рисовалка вышла в BASIC.
Если у тебя воспроизводится зависание всегда, сделай снапшот перед запуском непосредственно, я поковыряюсь.
Из 48-го BASIC'а написал RANDOMIZE USR 15619: REM: LOAD "test" CODE 32768
а я из 128 basica. только 128!
Alex Rider
14.02.2012, 22:35
Не, давай все-таки снапшот перед зависанием. На Unreal Spectrum в режиме Pentagon из 128-го BASIC'а все работает по тому рецепту, что я писал выше. Что-то ты по-хитрому делаешь и не делишься секретом.
тогда, делал в speculator basic128 и зависло.
теперь сделал на unreal basic 48 - работат.(см. probe.zip)
нумерация спрайтов идёт от 0 ? или от 1 ?
пока спекулятора нет,потом на нем еще попробую.
Alex Rider
15.02.2012, 00:47
нумерация спрайтов идёт от 0 ? или от 1 ?
От 0.
А картинка классная.
работа вашей проги в программе TBAM.zip (5.2кб) в МУЗЫКА - БИПЕРНАЯ МУЗЫКА -
Alex Rider
26.02.2012, 23:35
По личным просьбам трудящихся подпилил граббер для повышения юзабилити.
Что приделал:
в меню и режиме выделения спрайта на экране теперь работает не только Sinclair II, но и Cursor Keys, QAOPM, плюс, бонусом, Enter и Space теперь тоже "огонь";
BREAKом можно "шагать" назад по стадиям выденения спрайта - при задании размера BREAK вернет в режим задания координат, а из задания координат выкинет в меню безо всяких последствий;
при случайном попадании в команды работы с диском теперь можно не бояться ни разу, а давить BREAK (научил-таки BASIC-редактор на него реагировать), CS+"вниз" (только без сообщения "STOP in INPUT"), или просто Enter - пустое имя файла тоже вернет на путь истинный (в меню);
в режиме выделения спрайта на экране желтый BORDER означает задание координат, зеленый - задание размера;
в режиме удаления спрайта при нажатии на Enter при вводе номера спрайта (без нажатия цифр) спросится про удаление последнего спрайта, если нажать "Y", Вас не обманут (удалится последний захваченный спрайт);
в режиме удаления спрайта наконец-то для первых 0Fh спрайтов можно вводить их номер одной цифрой (да, 16-ричной);
при вводе 16-ричных чисел появился контроль ввода; теперь при неверных цифрах кидает не на первую попавшуюся ошибку, а на нормальное сообщение (правда, ввести повторно не предлагается);
и, наконец, я придумал как работать с точкой входа по адресу +4 от начала сохраненного модуля: теперь модуль можно сохраниить и при наличии 0 спрайтов в пямяти, что позволит грузить его куда хочется, а сохраненные командой "Save sprites" спрайты - в другое "куда хочется", и, используя таблицы смещений, выводить спрайты по адресу.
Осталось одно противоречие, которое меня (и не только меня) несколько коробит: в тулзе номера спрайтов начинаются с 1, а выгруженный модуль рисования считает их с 0. Должно путать всех. И путает. Есть у кого мысли где подпилить это досадное недоразумение?
Как всегда, сорцы и trd с готовым продуктом в аттаче.
хорошо. все хорошо.
в режиме выделения спрайта на экране желтый BORDER означает задание координат, зеленый - задание размера;
а зачем это? я прочитал и уже забыл,какой цвет что означает.
в режиме удаления спрайта наконец-то для первых 0Fh спрайтов можно вводить их номер одной цифрой (да, 16-ричной)
опять 16чные...
а выгруженный модуль рисования считает их с 0.
ну напиши в коде INC n, делов-то.
По личным просьбам трудящихся подпилил граббер для повышения юзабилити.
это о мне.
Alex Rider
28.02.2012, 01:57
хорошо. все хорошо.
Спасибо. Будет лучше.
в режиме выделения спрайта на экране желтый BORDER означает задание координат, зеленый - задание размера;
а зачем это? я прочитал и уже забыл,какой цвет что означает.
Потому что раньше при нажатии на "огонь" после задания левого верхнего угла ничего визуально не происходило. Теперь хоть BORDER реагирует.
в режиме удаления спрайта наконец-то для первых 0Fh спрайтов можно вводить их номер одной цифрой (да, 16-ричной)
опять 16чные...
А у меня уже версия с десятичными :-P. Но я ее не отдам. Сделаю еще несколько косметических правок, тогда только. Приоткрою немного завесу тайны - специально для AER я придумал как сделать так, чтобы рамка не исчезала в знакоместах, где INK == PAPER. Только тсс...
а выгруженный модуль рисования считает их с 0.
ну напиши в коде INC n, делов-то.
Не, тут вопрос филосовский... Меня самого корябить будет (если вдруг стану своим пользователем) при нумерации спрайтов с 1, когда из машкода звать. Подумаю.
для AER я придумал как сделать так, чтобы рамка не исчезала в знакоместах, где INK == PAPER.
во, дельньная вещь. а то мало ли че. а то по умолчанию в рисовалке,все в 0. а я иногда хочу выделять спрайт по покам на одно знакоместо больше, чтоб оно затирало его остатки при движении.
---------- Post added at 08:46 ---------- Previous post was at 07:20 ----------
твоя прога в действии - ищи "игры - моя игра - ......"
Alex Rider
28.02.2012, 13:27
Сообщение от Alex Rider
для AER я придумал как сделать так, чтобы рамка не исчезала в знакоместах, где INK == PAPER.
во, дельньная вещь. а то мало ли че. а то по умолчанию в рисовалке,все в 0. а я иногда хочу выделять спрайт по покам на одно знакоместо больше, чтоб оно затирало его остатки при движении.
Не обольщайся. Будет пока не красиво, на коленке. Красиво будет потом. Все планы уже расписаны.
твоя прога в действии - ищи "игры - моя игра - ......"
Вот за это спасибо! Приятно когда творчество обретает признание и выходит в массы.
Alex Rider
03.03.2012, 00:41
Сделал еще несколько косметических правок для трудящихся. Пока изменений немного и они не превращают пробу пера в подобие чего-то серьезного, но грабер меняется (надеюсь, к лучшему), что и мне в радость, и другим в нее же. Итак:
обещанные десятичные числа везде;
из кодового блока выкинуто 6912 байт нулей (сам смеялся когда нашел);
запись и загрузка с любого дисковода (перед именем файла сказать 2:, B: или b: для дисковода B, например);
хитрорежим выделения спрайта без исчезания рамки (см. ниже)
фикс мелкого бага с одъеданием стека при нажатии BREAK;
Как же удалось уважить AER'а с его чудо-рисовалкой, делающей знакоместа с атрибутами #00 там, где нет изображения? Пока криво, но как-то. Сам признаю, каюсь, знаю как лучше, но это тоже потом. Суть лекарства: при выделении спрайта теперь можно жать кнопку "B" - при этом настоящие атрибуты экрана сгинут, а картинка станет "черно-белой" (чтобы не выбиваться из общего вида интерфейса, она станет все-таки черно-ярко-голубой). Если станет страшно, еще раз нажатие "B" вернет все на место. Не зависимо от того, "черно-белая" картинка рисуется, или как родилась, спрайты захватятся с правильными атрибутами.
Собсна, как всегда, результат плюс сорцы прикладываются.
хочу выделять спрайт по покам на одно знакоместо
по "бокам" а не "покам".
из кодового блока выкинуто 6912 байт нулей (сам смеялся когда нашел);
когда делал,незамечал,файл не сильно большой, как никак, хоть оформи экран твоей спрайтовой прогой, чем полностью выведенной картинкой.
Как же удалось уважить AER'а с его чудо-рисовалкой, делающей знакоместа с атрибутами #00 там, где нет изображения
верно. просто бывает забываешь обвсети спрайт бумага=0 чернила=7
Собсна, как всегда, результат плюс сорцы прикладываются.
исполняешь мои мечты. а как бы придумать, чтоб стереть спрайт с экрана?
при игре к примеру?
---------- Post added at 13:28 ---------- Previous post was at 13:27 ----------
обвести - обсети - написал.
---------- Post added at 13:35 ---------- Previous post was at 13:28 ----------
вот еще , работа твоей проги. ну непередает, мой комп zip архивы на сайт и все. rar делаю.
---------- Post added at 13:37 ---------- Previous post was at 13:35 ----------
ой и тоже и это неберет - http://sderni.ru/113520
---------- Post added at 14:10 ---------- Previous post was at 13:37 ----------
есть небольшой вопрос,
1.твой код не тревожит ли прерывания,
2.тоже что и "1" , мой антивирус на спеке, зацепил обращение твоей проги к ПЗУ.
Alex Rider
03.03.2012, 19:00
из кодового блока выкинуто 6912 байт нулей (сам смеялся когда нашел);
когда делал,незамечал,файл не сильно большой, как никак, хоть оформи экран твоей спрайтовой прогой, чем полностью выведенной картинкой.
[/quote]
Это про sptgrb.c, а не про код, который сохраняется вместе со спрайтами. У меня случайно экранный буфер попал в выходной файл.
исполняешь мои мечты. а как бы придумать, чтоб стереть спрайт с экрана?
при игре к примеру?
Давай опять ближе к техзаданию. Что такое "стереть спрайт"? В растр нулей напихать по размеру спрайта - дело не хитрое. А как быть с атрибутами? Может, ловчее сделать сохранение фона под спрайтом и его восстановление потом?
есть небольшой вопрос,
1.твой код не тревожит ли прерывания,
2.тоже что и "1" , мой антивирус на спеке, зацепил обращение твоей проги к ПЗУ.
Ты про сам грабер, или тот модуль, который он выгружает со спрайтами?
Ни сам грабер, ни модуль прерывания не трогают. Грабер в будущем будет делать IM2. Модуль "бэйсикобезопасен" - прерывания не меняет (запрещает на мгновение для определения своего метоположения, потом тут же вертает назад), IY не трогает, HL' не калечит, в системные переменные бэйсика не лазит. Зовет команду "ret" из ПЗУ по адресу #007c и подпрограмму умножения по адресу #30a9. Graber ПЗУ использует очень активно. А что это за зверь - антивирус на спеке?
когда вывожу спрайты играя ay музыку, происходят зависания.
Alex Rider
19.03.2012, 19:23
Ответил в "Музыке" - выводилка спрайтов не любит когда во время ее работы портят регистры. A', например.
ага, вроде вопрос решился, сохранением af'.
Привет, по маске сможете реализовать вывод спрайтов? Еще не совсем пойму по каким адресам выставлять координаты спрайтов? Потом, координаты через поке выставляются? Спрайт можно загружать по любому адресу? Спасибо!
goblinish
25.07.2012, 10:36
Привет, по маске сможете реализовать вывод спрайтов? Еще не совсем пойму по каким адресам выставлять координаты спрайтов? Потом, координаты через поке выставляются? Спрайт можно загружать по любому адресу? Спасибо!
ты спрайты хочешь попиксельно выводить, или как?
Alex Rider
25.07.2012, 11:47
Привет, по маске сможете реализовать вывод спрайтов?
Да, если надо, то могу.
Еще не совсем пойму по каким адресам выставлять координаты спрайтов?
По адресу загрузки +6, +7, +8 - соответственно, x, y и номер спрайта из коллекции.
Потом, координаты через поке выставляются?
Да
Спрайт можно загружать по любому адресу?
Если вызываешь из Бэйсика, то нет. Программа сама выгружает кодовый блок, в котором есть код для вывода спрайтов и сами спрайты, снятые с экрана. Этот кодовый блок можешь грузить по любому адресу.
Alex Rider,видишь народ вопросы задает, а чита как небыло и нету.
ты спрайты хочешь попиксельно выводить, или как?
Если попиксельно возможно, то это было бы здорово!
---------- Post added at 12:34 ---------- Previous post was at 12:32 ----------
Если вызываешь из Бэйсика, то нет. Программа сама выгружает кодовый блок, в котором есть код для вывода спрайтов и сами спрайты, снятые с экрана. Этот кодовый блок можешь грузить по любому адресу.
Прошу прощения, не пойму. Допустим у меня есть код. Мне его надо загрузить с 32768, - он под бейсиком запуститься?
goblinish
25.07.2012, 13:49
Если попиксельно возможно, то это было бы здорово!
а не написать ли ради тебя спрайтовый движок?:v2_dizzy_coder:
а не написать ли ради тебя спрайтовый движок?:v2_dizzy_coder:
Ну если ты умеешь то почему бы и нет? :) Или ты только в игрушки играешь? :D
а не написать ли ради тебя спрайтовый движок?
блин ну есть же уже готовый спрайтграбер одноименный с темой. выделяем спрайты, выбираем save module, после если басик то - adr+6=x adr+7=y adr+8=номер спрайта (от нуля) и рандомазя узер adr. а если ассемблер, то - ld c,x ld b,y ld a,номер спрайта call adr+2
вот и все дела. но все познакоместно! потому что спрайты цветные и вообще.
у меня черно белые будут. Со знакоместом разберусь :)
goblinish
25.07.2012, 15:38
Или ты только в игрушки играешь?
играю. но не в спрайтовые.
Alex Rider
25.07.2012, 23:11
Если попиксельно возможно, то это было бы здорово!
Нет, с попиксельно все сложно. Не в смысле код вывода сложный, а в смысле с грабером это плохо сочетается. Надо много думать. Грабер не для этого был задуман. Может быть когда-нибудь нескоро.
Допустим у меня есть код. Мне его надо загрузить с 32768, - он под бейсиком запуститься?
Да, только зачем тебе код с 32768? Сколько на Бэйсик-то тогда останется? Я бы сделал так:
1) нарисовал бы в грабере спрайты;
2) Командой save module сохралил бы файл с кодом вывода и спрайтами;
3) домустим, после шага 2 получится файл размером 1234 байт. Тогда я бы из BASIC'а дал команду CLEAR 64301, грузил бы файл по адресу 64302 и с этого адреса бы его запускал (64302 = 65536 - 1234). Тогда под бэйсик остается максимальный объем памяти. А для вывода второго спрайта в координаты x = 3, y = 7 делал бы так: POKE 64308,3:POKE 64309,7:POKE 64310,2:RANDOMIZE USR 64302.
Да это я так к примеру просто сказал. Ну а как, с маской получится? И еще по поводу зеркального отображения, сможешь реализовать?
Andrew771
26.07.2012, 10:28
Руслан, если у тебя такие планы на игру, то изучай ассемблер. Бейсик фтопку.
Вот скажи зачем мне изучать ассемблер если для игры мне за глаза бэйсика хватит? Первый Мышонок Мики, тоже на бэйсике, сам персонаж состоит из редактированных символов. Но насколько я знаю его не обсерали, да и если обсерали, то только те кто сам ни хера не делает и не делал.
Да и понимаю если я собирался не одну игру делать. А так ведь только ту которую к сожалению забросил много лет назад. Я конечно не утверждаю что после ее я ни чего больше делать не буду, кто знает. Но изучения ассемблера, тем более написание игры на нем займет гораздо больше времени и сил.
Что касаемо Alex Rider, если он не станет делать маску и зеркалку, то я буду игру без них делать, конечно не так будет выглядеть как с маской - ну да ладно. Главное что она будет. Ведь сейчас по моему от наших любителей спектрума очень мало игр поступает. Если вообще поступает.
Alex Rider
26.07.2012, 11:32
Что касаемо Alex Rider, если он не станет делать маску и зеркалку,
Маску постараюсь сделать сегодня или на следующей неделе, а вот зеркальное отражение делать не буду. Оно совершенно не вписывается в концепцию тулы, поскольку миссия грабера - выдирание спрайтов из экранов. Никакие функции редактирования в нем не нужны. Использование грабера предполагает, что все спрайты во всех модификациях уже есть на экране, с которого происходит выдирание. Для зеркального отражения спрайтов можно воспользоваться, например, Art Studio.
Alex Rider, крайне признателен и думаю не один я. На счет зеркалки конечно - это не обязательно. Благодарю вас за помощь!
Alex Rider
26.07.2012, 12:38
AER, если сделаю маску, с тебя демка с движением маскированного объекта. А то что ж я, зря писать буду что ли?
goblinish
27.07.2012, 02:15
Вот скажи зачем мне изучать ассемблер если для игры мне за глаза бэйсика хватит?
а зачем тебе игра на бейсике? если только отладить и отточить логику, то -пожалуйста. я не игродел, но две игрушки написал, причем одну тогда, когда увидел, что прога для адвентюр не подходит под задумку.
Другое дело, когда мы с приятелем на пьянке на спор "слабо?" стрелялку написали.
Но насколько я знаю его не обсерали, да и если обсерали, то только те кто сам ни хера не делает и не делал.
"Мысли свои собери в узду, не охай, не ахай"... понял, да?)
---------- Post added at 02:15 ---------- Previous post was at 02:06 ----------
http://pouet.net/prod.php?which=59570
пример, достойный подражанию..
а зачем тебе игра на бейсике?
Я же написал, что быстрей и проще. Для нее бэйсика хватит за глаза.
"Мысли свои собери в узду, не охай, не ахай"... понял, да?)
Что понял? Скажешь я не прав и таких типов нет, которые кроме того как по обсуждать ни чего не делают... Понял нет?)
http://pouet.net/prod.php?which=59570
и что это?
goblinish
27.07.2012, 09:50
Я же написал, что быстрей и проще. Для нее бэйсика хватит за глаза.
ну, пиши, посмотрим.
Что понял? Скажешь я не прав и таких типов нет, которые кроме того как по обсуждать ни чего не делают... Понял нет?)
погугли, раз баянов не знаешь. Мат в стихе тут не приветствуют.
и что это?
это - рукалицо, посмотри сам.
Мат в стихе тут не приветствуют
И где это ты мат нашел?
---------- Post added at 09:55 ---------- Previous post was at 09:52 ----------
Хер - это буква кириллицы.
Заходит мужчина в страховой офис и просит-"Застрахерте меня пожайлуста".Ему в ответ-"да как Вам не стыдно!!?".он в ответ-"а что лучше застрахуйте?"
Скажешь я не прав и таких типов нет, которые кроме того как по обсуждать ни чего не делают...
извиняюсь за такой тон, но подрастешь - еще переосмыслишь эту фразу;) я не просто про пообсуждать, а про советы, к которым ты не прислушиваешься.
goblinish
27.07.2012, 12:09
И где это ты мат нашел?
тут (http://lmgtfy.com/?q=%D0%BC%D1%8B%D1%81%D0%BB%D0%B8+%D1%81%D0%B2%D0% BE%D0%B8+%D1%81%D0%BE%D0%B1%D0%B5%D1%80%D0%B8+%D0% B2+%D1%83%D0%B7%D0%B4%D1%83&l=1)
Советы или рекомендации? И с чего это ты взял что не прислушиваюсь?. Или имеешь ввиду - не следую им? )
---------- Post added at 11:12 ---------- Previous post was at 11:10 ----------
goblinish, да с тобой без гугла не обойтись похоже. )
goblinish
27.07.2012, 12:45
goblinish, да с тобой без гугла не обойтись похоже. )
я еще и в инглише набалатыкался)
хватит трепаться не по делу, займитесь уже игрописанием
Alex Rider
31.07.2012, 18:02
Привет, по маске сможете реализовать вывод спрайтов?
А вот кто сможет ответить мне на хитрые вопросы... Вот грабер заточен под вывод спрайта с атрибутами. Ну допустим сделаю я способ вызова, который кинет на экран маску спрайта как маску, потом спрайт как спрайт. А как быть с атрибутами? Выводить оба раза - не эффективно. Выводить только для спрайта - криво (во-первых, атрибуты будут храниться и для маски, поскольку в момент выдирания грабер не знает маску он выдирает, или спрайт, а, во-вторых, не понятно по какому параметру определять надо выводить атрибуты, или нет). Предложение добавить еще одну переменную тоже не хорошо, поскольку грабер задумывался для вызова из бэйсика, а POKE: POKE: ... : POKE до бесконечности перед вызовами стремительно снижают скорость работы до уровня блочной графики и PRINT'а. Как быть?
надо спрайт делать в спец.формате - чередовать маску и спрайт. тогда вывод один раз и атрибуты 1 раз.
Alex Rider
31.07.2012, 19:09
Пока не придумал как оно в концепцию грабера плавно вольется. Вот есть тул, который сдирает с экрна спрайты, делает из них файл, лепит к нему процедуру вывода и выплевывает на диск. А как гармонично к нему прилепить масковые спрайты... Можно подумать, но нет уверенности, что придумается решение.
когда спрайты сдираешь, заводишь внутренний флаг, маска это или спрайт. потом как-то комбинируешь (типа, 1я маска к 1му спрайту, 2я ко 2му). процедура вывода своя, формат спрайта свой.
Alex Rider
01.08.2012, 10:12
Придумался вариант, когда добавляется пункт меню (типа Get sprite with mask), при этом с экрана спрайт и маска сдираются одновременно (маска прижата справа к спрайту и имеет тот же размер, атрибуты сдираются только со спрайта). Такой маскоспрайт помечается в наборе определенным образом (например, установленным старшим битом в размере по y), а в выгружаемый модуль добавляется процедура вывода просто спрайта и маскоспрайта (да, и расчета размера маскоспрайта тоже). Про этом, правда, модуль распухает и AER становится недовольным.
Не выглядит ли это концептуально криво?
Alex Rider, а есть возможность выводить спрайты по ксор? насколько помню такое наложение не затерало фона. Ну оно конечно кривовато выглядит, но может для некоторых случаев пригодиться. А так вчера на бэйсике сделал тестов, чтоб мик по экрану бегал, вроде скорость норм (это пока логики туда не понапихал ))))
Alex Rider
01.08.2012, 11:05
Alex Rider, а есть возможность выводить спрайты по ксор?
Там любые изменения примерно одинаковы по геморрою - часов на 5, не меньше. Никак не могу их найти. Связано это с тем, что у меня сейчас весь проект в "разобранном" состоянии, в частности, убиты все сборочные файлы (которые я не включаю в исходиники, которые выкладываю сюда). Так что все не быстро - добавить-то способ печати я могу хоть в блокноте, а вот собрать это потом пока не получается.
Руслан, а вы не пробовали бейсик-программы переводить на ассемблер построчно? это довольно легко, зато скорость возрастает и ассемблер сам собой изучается.
goblinish
01.08.2012, 12:54
Руслан, а вы не пробовали бейсик-программы переводить на ассемблер построчно? это довольно легко, зато скорость возрастает и ассемблер сам собой изучается.
гммм... если странная конструкция POKE привела к крэшу, какой тут ассемблер?
гммм... если странная конструкция POKE привела к крэшу, какой тут ассемблер?
)), тама не поке а эмулятор - на реале все гуд - бегает мышь как шальная). Я просто не знаю сколько по времени буду игру делать поскольку она будет со смыслом дизика (забыл как жанр называется). На бейсике я это прекрастно понимаю как делать, а вот на асме - даже не представляю)
AER, если сделаю маску, с тебя демка с движением маскированного объекта. А то что ж я, зря писать буду что ли?
а ты и грабер не зря сделал, я его просил и ты сделал как хочу. а маска... ну это хорошо, но разрастается это в огромную ненужную каку. хотя если выбирать какой нужен тебе save module то прекрасно. а вопрос как-то я давал тебе о выводе спрайта, расширим настройки, ld h, 0 - обычная, 1 - xor, 2 - or. но это все утяжеляет работу вывода.
---------- Post added at 11:56 ---------- Previous post was at 11:55 ----------
итого - мне достаточно, что есть. хотя... help.. че зря делал...
Alex Rider
04.08.2012, 18:53
хотя... help.. че зря делал...
Сейчас никак не могу под него время выделить... Плохо делать не приучен, а хорошо и быстро не получается. Да и работа теперь ни разу не волк по сравнению с зимой. :(
Да не говори. Времени ни когда не хватает.
Alex Rider
02.09.2012, 15:48
Промежуточный релиз по просьбам трудящихся:
-- добавлено сохранение/вывод спрайтов с маской;
-- выводилка спрайтов больше не обращается в ПЗУ (но по-прежнему на ~100 тактов запрещает прерывания).
Для использования маски сделано минимум изменений. В меню появился новый пункт "Create Masked Sprite" - он работает как "Create Sprite", но считает правую половину выделенной на экране области маской (при нечетной ширине показывает ошибку). Сделать масочный спрайт шириной более 16 знакомест не получится, да оно и мало кому надо. Спрайты, снятые с маской, всегда печатаются с маской, спрайты, снятые без маски, всегда печатаются без нее. Процедура вывода в выгруженном модуле одна, выросла из-за маски она не сильно.
Пользуйтесь!
Upd: пришел фидбек, пофиксил баг, обновил вложение.
что будет с цветом спрайта маскированного при печати?
Alex Rider
08.09.2012, 19:43
Сорри, забыл написать. Цвет будет как у самого спрайта, но не у маски - сохраняются атрибуты левой половины выделенной области.
(но по-прежнему на ~100 тактов запрещает прерывания).
а я говорил, что мой антивирус выловил обращение к ПЗУ. а оно плохо. получается нужно твой граббер+ПЗУ скачивать
маска же берется (справа) без атрибутов?
Alex Rider
09.09.2012, 14:42
а я говорил, что мой антивирус выловил обращение к ПЗУ. а оно плохо. получается нужно твой граббер+ПЗУ скачивать
Сейчас не должно звать.
маска же берется (справа) без атрибутов?
Да, только пикселы
Эх, я уж было обрадовался... но как оказалось функционала оказалось недостаточно.
Для облегчения трудов по работе с графикой к игре нужны следующие функции.
0) Поддержка Kempston Mouse. (кликаем, тянем — область выделяется)
1) Выделение области по вертикали с кратностью 1 пиксель.
2) Ротация (циклическая/обычная) внутри выделенной области верх-низ, лево-право, диагональ. (по hash: X0, 0X яркостным сеткам) — это нужно чтобы спрайт можно было выставить правильно, не загружая экран снова и снова в ARTStudio чтобы подвинуть на пиксель.
3) Генерация автомаски для выделенной области.
4) Формат спрайта: +0x00h - длина в знакоместах (#00-#1F; bit 7 - признак наличия атрибутов, bit 6 - принзнак наличия маски, bit 5 - пакованный спрайт [например hrust'ом]), +0x01h - высота в пикселах, +0x02h - тело спрайта, атрибуты (опционально).
5) Сохранение сграбленных спрайтов в линейном формате. Спрайты с маской: байт маски/спрайта; спрайт-маска, маска-спрайт.
6) Сохранение массива сграбленных спрайтов: формат: массив указателей на спрайты (word) + сами спрайты в формате п.4.
upd. пересмотрел все известные мне редакторы спрайтов, ни один (!) не работает попиксельно... Все повторяют один и тот же велосипед :)
Авторы делали упор на интерфейс, на кредитсы... но никак не на юзабилити своего детища.
upd2. в общем-то можно для этих целей приспособить Art Studio. Там есть возможность работать с набором спрайтов в блонкоте. Конвертер не проблема :)
Alex Rider
23.12.2012, 19:42
Работа над сабжем начата с глубочайшего рефакторинга, ибо внутри слишком много скотча. Надеюсь выпустить релиз с хотелками после новогодних каникул. Будет более лучший GUI (текущий страдает пережитками Капульцевича, посему переписывается чуть более, чем полностью). Будет несколько форматов хранения и опциональное включение разного кода в выгружаемый модуль.
Вопрос: а как отнесется общественность к 128-фикации грабера? (это не относится к выгружаемым модулям).
Работа над сабжем начата с глубочайшего рефакторинга, ибо внутри слишком много скотча. Надеюсь выпустить релиз с хотелками после новогодних каникул. Будет более лучший GUI (текущий страдает пережитками Капульцевича, посему переписывается чуть более, чем полностью). Будет несколько форматов хранения и опциональное включение разного кода в выгружаемый модуль.
Вопрос: а как отнесется общественность к 128-фикации грабера? (это не относится к выгружаемым модулям).
48K это глубокий андерграунд, поэтому 128К — норма для утилит (особенно спрайтовых).
И спасибо за труды, это позволяет полностью погрузиться в написание игры и не отвлекаться (пока) на утилиты.
зы. пока не смотрел, но есть ли возможность переделать dehrust чтобы на лету на экран спрайт распаковывал?
Уж больно не хочется буфер выделять под распаковку спрайта.
Alex Rider
23.12.2012, 21:08
зы. пока не смотрел, но есть ли возможность переделать dehrust чтобы на лету на экран спрайт распаковывал?
Не уверен что это сделать просто и получится быстро. Говорят, он использует историю уже распакованного в процессе работы и надеется, что распакованный блок непрерывен в памяти. Да и вообще говоря, идея упаковки спрайтов по отдельности мне не нравится. Вижу такие минусы:
упаковка отдельных маленьких спрайтов будет менее эффективна, чем упаковка спрайт-файла;
распаковка спрайта на экран добавит тормозов (особенно при многократном выводе одного и того же запакованного спрайта), что не надо совсем;
спрайты обычно хорошо группируются по области программы - общие спрайты, уровень 1, уровень 2, ..., меню, funal cut. Эффективнее паковать их группами и распаковывать при необходимости.
Да смысл в том, чтобы распаковать сразу на экран без распаковки в буфер. Всегда чем-то жертвовать приходится.
Я сейчас как раз работаю над пакетом процедур для вывода спрайтов.
Alex Rider
23.12.2012, 23:14
Да смысл в том, чтобы распаковать сразу на экран без распаковки в буфер.
А спрайт что, надо только один раз вывести?Как правило, если это так, то быстродействие его вывода некритично, его можно распаковать и вывести потом. А вот сожмется он один неважно, набор спрайтов сжимается лучше.
В соседнем топике уже решили, что лучше всего использовать для компресии.
http://zx.pk.ru/showpost.php?p=561732&postcount=10
Вот, можешь интегрировать в свой граббер этот способ сжатия.
Alex Rider
26.12.2012, 19:20
Вот, можешь интегрировать в свой граббер этот способ сжатия.
Читал. Пока не буду. Пока надо собрать базоывй функционал на новом UI. ПОтом в планах последовательно:
выделение с точностью до пикселя;
вращенияя/отражения/скролл выделенной области;
яркостная сетка;
help;
менеджер памяти;
автомаска;
разные форматы хранения и кастомизированный набор процедур для вывода в выгружаемом модуле;
улучшенная работа с диском (каталог, смена дисковода, сохранение опций грабера, например)
Alex Rider
16.03.2014, 19:59
Пользуясь случайным интересом к сабжу, выложу последнюю версию с фиксом одной проблемы, найденной AER (спасибо ему!)
upd: версия в первом посту
выложу последнюю версию с фиксом одной проблемы
случайно не порча цветных спрайтов ?
Alex Rider
16.03.2014, 21:54
Да, при захвате атрибутов нижней трети они брались из верхней. Опечатка в исходнике :( Если кто-нить (еще кроме меня) проверит работоспособность, я буду весьма рад и спокоен.
Alex Rider
17.03.2014, 23:27
В первый пост добавлена инструкция
Alex Rider
18.03.2014, 13:35
так она же в тхт..
Ога. В виду низкого интереса к софтине решил забить на кодовый help. Да и вообще на софтину. :(
по софтине;
то что я просил в ней от тебя сделано, и это далеко не последняя версия, а одна из первых которая обезбажена (непомню какая) и рабочая. после насколько я читал, ты внедрял всякие маски и прочие сложности которые мне не нужны в силу своего суперкодерства, я не стал обновлятся.
зато программа заняла свое место как софт для моего коддинга, как единственная спрайто - выводилка, резалка. и когда я использую спрайты я использую сие творение.
Alex Rider
18.03.2014, 18:44
и когда я использую спрайты я использую сие творение.
К сожалению, ты - один. И Help тебе не нужен. Как и остальные придуманные мной рюшечки-помпушечки.
Alex Rider,
ну "проба пера" как-бы,
и оно получилось.
А как же ему стать популярным среди:
-Cutter v2.1 by Skill Master'11
-Microstudio by #FF & A.Soft
-Real Sprites Transformer v1.02 by Famous Faces Factory'99
-Spectrum Guide Sprite Generator v1.0 by Integer'98
-Sprite Maker v1.65 by Free Group
-Sprite Master v5.11 by Andrey Rachkin
-Sprite Tools v2.0 by Afendikov, Winogradow
-SpriteLand v1.25 by Flying/DR
-Spriter v1.666 + Compiler v1.03 by Studio Stall
-Sprites Generator v5.3 by Real Software
-SPwRITE Maker v6 by Mayhem
-Universal Sprite Studio v1.0 (beta) by Accept
и прочих, незнаю.
дело не в проге, а кодить то некому.
новичкам твой SPRGRB бы в самый раз с его "compile", и в басиц вставить и в код.
а те кто кодит, давно уже имеют свое, наработанное.
так что, не вини не себя не других, время видимо такое нынче на кодинг скудное.
Alex Rider
18.03.2014, 21:43
не вини не себя не других, время видимо такое нынче на кодинг скудное.
А я и не виню. Времена Капульцевича прошли. Это вообще была попытка вспомнить асм спустя 12 лет. Ну и сделать себе библиотеку процедур "на все случаи жизни".
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot