User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 30

Тема: Обрезание спрайта на краю экрана.

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    17.01.2005
    Адрес
    Tallinn
    Сообщений
    2,517
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    86
    Поблагодарили
    39 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    Lightbulb Обрезание спрайта на краю экрана.

    Я достаточно мало знаю теории по этому вопросу, может быть кто-то подскажет какие-то хитрые решения по следующему вопросу:

    Имеется процедура вывода спрайтов на экран со следующими параметрами:
    координаты вывода - попиксельные,
    X-размеры спрайта кратны 8 пикселям, Y-размеры кратны 2 пикселям.

    вывод на экран ведется т.н. "змейкой", т.е нечетные выводятся слева направо, четные для скорости справа налево.

    вывод ведется напрямую в видеообласть памяти.

    вопрос: как в теории проще/быстрее/хитрее/оптимальнее обрезать спрайт, заступающий за край экрана?

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

  3. #2

    Регистрация
    29.01.2005
    Адрес
    Belarus, Grodno
    Сообщений
    1,279
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    размеры спрайта какие? все спрайты разных размеров или одинаковых?
    если не очень большие и одинаковые, то можно (читать нужно) раздекрянчить смещая по X и создать несколько процедур вывода (кстати выводя "змейкой" особо не ускоришь).

    допустим есть max размер по X в знакоместах будет 4, то создаёшь следующие процедуры для вывода

    X <= (-4*8) : нафуй
    X > (-4*8) && X < (-3*8) : proc_m1
    .....
    X>=0 && X<255 : proc_normal
    ...
    X>255 && X<(255+8) : proc_p1

    вот.
    оч. быстро
    но не оптимально по памяти.

    ------

    или так: есть 3 процедуры, спрайты покрянчены

    1) спрайт залазит влево
    2) спрайт полностью на экране
    3) спрайт залазит вправо

    если спрайт на экране, то всё очевидно.

    допустим, спрайт залазит вправо.

    если вывод 2х строк такой:

    Код:
    line_1:
    ld a,(bc)
    inc с
    ld d,a
    dup max_width-1
      ld a,(de)
      and (hl)
      inc hl
      or (hl)
      inc hl
      ld (de),a
      inc e
    edup
      ld a,(de)
      and (hl)
      inc hl
      or (hl)
      inc hl
      ld (de),a
      ret
    
    line_2:
    ld a,(bc)
    inc с
    ld d,a
    ld a,<mod_this_value>
    add a,l
    ld l,a
    dup max_width-1
      ld a,(de)
      and (hl)
      inc hl
      or (hl)
      inc hl
      ld (de),a
      dec e
    edup
      ld a,(de)
      and (hl)
      inc hl
      or (hl)
      inc hl
      ld (de),a
      ret
    то можно просчитать где поставить нужный ret (чтоб лишнего не выводить), замодифицировать line_1 и line_2 для этих целей, так же пропишем <mod_this_value>

    обрежем по Y и далее

    Код:
    ; b - кол-во 2x линий для вывода
    ; hl' - указывает на нужное место спрайта
    ; e' - колонка в экране
    ; c' - номер линии в экране
    ; b' - адрес таблички адресов
      ld hl,retaddr
      push hl
      ld hl,line_2
      ld de,line_1
    lp0:
      push hl
      push de
      djnz lp0
      ret
    
    retaddr:
      ....
    ! код работать не будет !
    тут есть проёб с тем что выводится "змейкой"- тогда не получится так просто доставать адреса из таблички.
    лучше без змейки. и из таблички надо доставать не только старшую часть адреса (в данном случае D) но и младшую (E) и добавлять к ней смещение

    в общем идея думаю ясна.
    [target] [zemu] [js8x] [pouet] KAY-1024, 5''FDD, 3''FDD, HDD

  4. #3

    Регистрация
    17.01.2005
    Адрес
    Tallinn
    Сообщений
    2,517
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    86
    Поблагодарили
    39 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    спасибо за инфу.
    извиняюсь, мой прокол - не все требования выложил.

    итак, размер спрайта сильно произвольный, я уже думал над тем, чтобы написать под каждый размер свой вывод, но их ооочень много разных.

    раздекрянчить спрайты не могу - их очень много. для обретения приемлимой скорости используется таблица килобайт на 8, содержащая все варианты смещенных байтов.
    спрайты хранятся в таком виде:
    байт маски, байт спрайта, байт маски, байт спрайта..., естественно для змейки.

    кстати, на крайний случай от змейки отказаться несложно.

  5. #4

    Регистрация
    29.01.2005
    Адрес
    Belarus, Grodno
    Сообщений
    1,279
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    спрайт хранится правильно (маска - спр.)
    а вот что покрянчить не можешь это плохо...
    а зачем кил 8 на табличку?

    Код:
    RRtab:
      DB %00000000,%00000000    ; %00000000
      DB %00000000,%10000000    ; %00000001
      DB %00000001,%00000000    ; %00000010
      .... 256 раз
    .... .... и всё это 9 раз (для смещений 0-8)
    около 4 кил получается.

    кстати можешь прооптимизировать вывод спрайта если смещение==0, но думаю смысла не имеет.

    а "змейку" ты так выводишь?
    Код:
     .... вывод 1 линии ....
     CALL DOWN_DE
     .... вывод 2 линии ....
     CALL DOWN_DE
    если да, то замени DOWN_DE на выборку из таблички, но тогда со змейкой туго будет
    [target] [zemu] [js8x] [pouet] KAY-1024, 5''FDD, 3''FDD, HDD

  6. #5

    Регистрация
    29.01.2005
    Адрес
    Belarus, Grodno
    Сообщений
    1,279
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    и ещё. с твоими требованиями фреймово ты полюбому не сделаешь.
    так что особо заморачиваться по поводу скорости и выигрывать каждый такт нет смысла.

    лучше всё пофикси под таймер, чтоб с турбой всё стало круто, но не улетело.
    а без турбы будет подтормаживать, но не тормозя игровой процесс....

    (или ты не игру делаешь?)

    ... ну думаю меня поймут ...
    [target] [zemu] [js8x] [pouet] KAY-1024, 5''FDD, 3''FDD, HDD

  7. #6

    Регистрация
    15.01.2005
    Адрес
    USSR
    Сообщений
    2,038
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Общая идея такова: использовать для вывода спрайта таблицу (или две таблицы ) адресов видеопамяти и в каждой из них предусмотреть несколько байт или слов холостых адресов за пределами экрана, в зависимости от максимального размера спрайта. Ещё в 1989 году я это успешно использовал в "Приключении в метро" .

  8. #7

    Регистрация
    06.02.2009
    Адрес
    Москва
    Сообщений
    31
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    есть 3 процедуры, спрайты покрянчены

    1) спрайт залазит влево
    2) спрайт полностью на экране
    3) спрайт залазит вправо

    если спрайт на экране, то всё очевидно.
    ...
    покрянчены ??? Объясните пожалуйста новичку, что это за метод???

  9. #8

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,866
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    310
    Поблагодарили
    234 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от rjhaviy Посмотреть сообщение
    покрянчены ??? Объясните пожалуйста новичку, что это за метод???
    Покрянчены значит приготовлены к быстрому выводу
    к примеру у тебя есть спрайт размером 16 х 16 пикселей
    и тебе надо выводить его с точностью до 2х пикселей

    т.е изначально имеем
    2*16 - 32 байта под спрайт
    и некую процедуру печати спрайта с точностью до пикселя

    но все это работает крайне медленно (см ZX Ревю )

    а далее берем и на основе имеющегося спрайта 16*16 (2х16)
    создаем еще 3 спрайта размером 24*16 (3*16)
    для чего скролим спрайт вправо на 2 пикселя и прячем в памяти

    и теперь имеем и спрайт 2*16 - 32 байта и еще 3 спрайто 3*16
    все вместе весит уже 176 байт

    но теперь мы можем существенно облегчить процедуру печати спрайта
    как по весу так и по скорости

    и теперь при прорисовке смотрим на координату X
    и в соответсвии со смещениями берем нужный нам спрайт

    кстати если изначально задать при рисовании размер к примеру не 16*16
    а 18*16 то при скролле не потребуется менять размер спрайта
    а 2 пикселя для таких мелких спрйтов это ОГОГО сколько

    будут еще вопросы - пиши в аську
    С уважением,
    Jerri / Red Triangle.

  10. #9

    Регистрация
    06.02.2009
    Адрес
    Москва
    Сообщений
    31
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    jerri, спасибо! Я все понял, елси мне не изменяет памать, то именно так сделано во многих игрушках Hewson, таких как Exolon, Zynaps, Cybernoid 1 и 2,
    и др.?

  11. #10

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,866
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    310
    Поблагодарили
    234 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да именно так
    С уважением,
    Jerri / Red Triangle.

Страница 1 из 2 12 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Разрешение экрана.
    от CityAceE в разделе Форум
    Ответов: 19
    Последнее: 06.03.2005, 06:37

Ваши права

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