Важная информация

User Tag List

Страница 1 из 10 12345 ... ПоследняяПоследняя
Показано с 1 по 10 из 97

Тема: Sprite graber - проба пера

  1. #1
    Super Moderator Аватар для Alex Rider
    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,908
    Спасибо Благодарностей отдано 
    29
    Спасибо Благодарностей получено 
    89
    Поблагодарили
    31 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    Lightbulb Sprite graber - проба пера

    Ударила меня ностальгия по Спектруму в новогодние праздники, решил вспомнить старый опыт. Почитал любимый самоучитель - "Как написать игру на ассемблере", увидел там бейсиковскую программу (с ассемблерными рутинами) для захвата спрайтов из экранного файла в формат, который автор пропагандировал. Для разминки переписал его на ассемблере (творил в SjAsm Plus + Unreal), кое-что дописал от себя. Можно смотреть как устроено (ибо не сложно), можно даже использовать, коли кому сгодится. Если случится вдруг чудо и кому-то это станет надо по жизни, готов даже поддерживать.

    upd: SpriteGraber.zip - последняя актуальная версия. Также приложена инструкция.
    Вложения Вложения
    Последний раз редактировалось Alex Rider; 17.03.2014 в 23:54.

  2. Этот пользователь поблагодарил Alex Rider за это полезное сообщение:

    Enigmatic (07.12.2023)

  3. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  4. #2
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,439
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Alex Rider Посмотреть сообщение
    увидел там бейсиковскую программу (с ассемблерными рутинами) для захвата спрайтов из экранного файла в формат, который автор пропагандировал.
    В наше время спрайты рисовать и грабить сподручнее на пц...
    Я правильно понимаю, что сама процедура печати спрайтов осталась без изменения?
    (она ведь наверняка подлежит оптимизации)

  5. #3
    Super Moderator Аватар для Alex Rider
    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,908
    Спасибо Благодарностей отдано 
    29
    Спасибо Благодарностей получено 
    89
    Поблагодарили
    31 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Процедуры захвата и печати спрайта полностью самописные, от оригинала остался только формат. Из процедуры печати спрайтов убран контроль выхода за границы экрана (ибо нужна она только для показа спрайта в левом верхнем углу). Во внутренних циклах печати спрайта для хранения промежуточных данных не используется стек в пользу альтернативных регистров. Думаю, там еще куча простора для оптимизации. Я старался писать не транжиря память и такты, но не думаю, что получился верх совершенства. Алгоритмы сдирания спрайта с экрана и печати его обратно живут в модуле SpriteTools.a80.

  6. #4
    Veteran Аватар для AER
    Регистрация
    18.11.2009
    Адрес
    пгт.Малиновка
    Сообщений
    1,355
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Alex Rider Посмотреть сообщение
    Если случится вдруг чудо и кому-то это станет надо по жизни, готов даже поддерживать.
    вот сделай, чтоб программа выгружала вырезанные спрайты и кодовый блок, чтоб я потом мог их использовать подкидывая координаты в знакоместах!

  7. #5
    Super Moderator Аватар для Alex Rider
    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,908
    Спасибо Благодарностей отдано 
    29
    Спасибо Благодарностей получено 
    89
    Поблагодарили
    31 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AER Посмотреть сообщение
    вот сделай, чтоб программа выгружала вырезанные спрайты и кодовый блок, чтоб я потом мог их использовать подкидывая координаты в знакоместах!
    Совсем это на техзадание не похоже... Ты вот хотя бы на такие вопросы дай ответы:
    1) Как должны передаваться координаты и номер спрайта?
    2) Должен ли блок быть релоцируем?
    3) Надо ли проверять выход всего спрайта или его части за пределы экрана? Что делать, если часть спрайта выходит за пределы экрана?
    4) Надо ли делать печать по LD/OR/XOR/AND?
    5) Надо ли уметь печатать в теневой экран? Если да, как должен задаваться его адрес?

    ---------- Post added at 23:12 ---------- Previous post was at 23:07 ----------

    Кстати, еще в догонку: формат спрайта подразумевает, что, если он не прямоугольный, информация о пустых знакоместах может не храниться. Однако, моя тулза выдирает всегда прямоугольник, поскольку не может угадать пустое ли знакоместо она выдирает. Надо ли здесь сделать какую-то оптимизацию?
    P.S. "Пустое" знакоместо - это знакоместо без пикселов (это легко узнать) и без фона. А вот как сказать, что у знакоместа "пустой" ("прозрачный") фон - я не знаю, альфа-канала нет.

  8. #6
    Veteran Аватар для AER
    Регистрация
    18.11.2009
    Адрес
    пгт.Малиновка
    Сообщений
    1,355
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(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 ----------

    в догонку: простые прямоугольные спрайты. разного размера.
    Последний раз редактировалось AER; 22.01.2012 в 23:51.

  9. #7
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,439
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Alex Rider Посмотреть сообщение
    альфа-канала нет
    Есть - папер = инк

    ---------- Post added at 23:52 ---------- Previous post was at 23:51 ----------

    Либо - flash

  10. #8
    Super Moderator Аватар для Alex Rider
    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,908
    Спасибо Благодарностей отдано 
    29
    Спасибо Благодарностей получено 
    89
    Поблагодарили
    31 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AER Посмотреть сообщение
    каждый спрайт вызывается по 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 ----------

    Цитата Сообщение от newart Посмотреть сообщение
    Есть - папер = инк
    Либо - flash
    Обо всем этом надо договариваться при оформлении экрана, с которого сдирается спрайт. Папер=инк может быть внутри спрайта если в нем пустое знакоместо, которое должно быть обязательно перекрашено при выводе. Для Flash тоже актуально. Как вариант - (paper == ink) && (flash == 1), но опять же требует предварительной обработки картинки перед сдиранием. Неудобно если внезапно захочется выкушать спрайт с экрана свежеиспеченного @-файла, к примеру.

  11. #9
    Veteran Аватар для AER
    Регистрация
    18.11.2009
    Адрес
    пгт.Малиновка
    Сообщений
    1,355
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Alex Rider Посмотреть сообщение
    за ввод базового адреса блока при сохранении
    да, пусть так. или ввод адреса блока перед началом работы.

    вот пример, посмотри как тут сделано.
    в данном случае адресс спрайта 54214,
    54214+13, - меняется координата Y,
    65330 - кодовый блок.
    Вложения Вложения
    • Тип файла: zip 1.zip (2.9 Кб, Просмотров: 145)

  12. #10
    Super Moderator Аватар для Alex Rider
    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,908
    Спасибо Благодарностей отдано 
    29
    Спасибо Благодарностей получено 
    89
    Поблагодарили
    31 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    Lightbulb Sprite Grabber AER edition

    Сделал как просил 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.
    Вложения Вложения

Страница 1 из 10 12345 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Проба пера...
    от Crash Nicker в разделе Графика
    Ответов: 38
    Последнее: 02.06.2011, 01:51
  2. Map & Sprite Editor v1.0
    от VELESOFT в разделе Графика
    Ответов: 13
    Последнее: 25.10.2008, 00:36
  3. ZX-Poly sprite corrector
    от Raydac в разделе Утилиты
    Ответов: 0
    Последнее: 21.02.2008, 18:56
  4. Sprite resize (типа как в Звездных Войнах..)
    от newart в разделе Программирование
    Ответов: 6
    Последнее: 06.07.2005, 12:45

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •