PDA

Просмотр полной версии : Sprite resize (типа как в Звездных Войнах..)



newart
05.07.2005, 12:42
Подскажите как оптимальнее сабж сделать?
Нужно за фрейм, нужен реайл тайм (тоесть
используется не один спрайт).
Размер output 12х3
В принципе можно обойтись только уменьшением (хотя на алгоритм
это вроде не сильно влияет).
Перспектива по вертикали никаких проблем у меня не вызывает, но вот с горизонталью проблемы.
Пока на ум приходит что-то типа:
ld hl,#4000
ld de,sprite
ld c,(hl)
xor a

bit 7,c
jr nz,$+4
or %100000000
bit 6,c
jr nz,$+4
or %010000000
bit 5,c
jr nz,$+4
or %001000000

и т.д.
Я бы и остановился на этом ватрианте, но больно запарно
для него декрюнчер писать.

p.s. Минимальный ресайз 50%
Каждая строка спрайта должна быть по центру.
Резайс только на четное колво пикселей.

newart
05.07.2005, 22:09
Неужели совсем никто не хочет помочь материализоваться на предстоящем CC, новому игровому шедевру от n-discovery? :(

Shiru
05.07.2005, 22:19
'Как в Звёздных Войнах' - это типа текст, наклонно уплывающий вдаль? Это уже не просто ресайз получается.

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

newart
05.07.2005, 23:10
'Как в Звёздных Войнах' - это типа текст, наклонно уплывающий вдаль? Это уже не просто ресайз получается.

Если спрайтов мало, а памяти много - м.б., хранить их сразу во всех нужных горизонтальных размерах?
Да, текст наклонно (перспектива) и сужаясь к центру.
Это обычный ресайз, центровка не сильно осложняет задачу.
Повторяю мне интересн ресайз именно одной линии, по вертикали
ресайз уже сделан.
Памяти много, но спрайты то надо как-то отрендерить так или иначе.

Shiru
05.07.2005, 23:52
Это обычный ресайз, центровка не сильно осложняет задачу.
Ресайз, но по одиночным линиям. Частный случай - вывод стен в Wolf'оподобных играх (только набок повёрнуто).

Памяти много, но спрайты то надо как-то отрендерить так или иначе.
Для пререндера с уменьшением я-бы, наверное, пошёл по такому пути: сначала одну линию спрайта перевёл-бы в буфер, где один байт представлял одну точку; потом выбирал-бы байты с нужным шагом (типа как при вертикальном ресайзе), и набивал выходную линию по битам. Не очень быстро, зато просто и коротко.

Кстати, если сделать быструю набивку выходной линии - может, и для реалтайма такой метод подойдёт (спрайты придётся хранить в виде точка-на-байт, но это займёт меньше места, чем если хранить все размеры).

Raider
06.07.2005, 04:25
Основную проблему у тебя представляет zoom по x и скорость разумеется.
здесь еще нужно бы знать запросы по памяти. Потому что если с памятью нет проблем, то практчески все можно симулировать через память, держа или перекодировочные таблицы, или precalcaulated.
Попробуем пойти по дороге precalculated.
Возьмем 26 букв (или меньше, можно например взять только реально те буквы которые использованы в твоем тексте, так что напиши текст для скролла заранее, хехехехе..)
нарисуем буквы 5x5 так, чтобы в них было как можно больше similarity по байт-фрагментам. Это для того, чтобы нам хранить (зумленые и сдвинутые) только под-фрагменты букв, а не буквы целиком. Реально, как я понимаю, останется несколько видов горизонтальных белых полосок.
Создадим несколько постепенно увеличивающихся копий фрагментов.
Также создадим сдвинутые фрагменты (по x 8шт копий).
При этом можно шаг увеличения/сдвига выбрать не пиксель, а два, хотя может быть вполне возможно что и попиксельно и пямяти хватит итд.
Далее (только если потребуется по скорости) нам нужно сесть, и внимательно проанализировать что за данные получились в памяти после сдвига и зуминга фрагментов букв. Возможно что там будут специфичные байтовые последовательности 00, FF итд.
Далее оптимизируем вывод часто используемых подфрагментов путем написания custom-кода вместо сборки данных из памяти.
Заметим также, что когда мы выводим зумленую и сдвинутую полоску буквы, то нужно по or/xor накладывать только края, а середину состоящую из FF или чего-то подобного можно просто блиттить на экран.

ну вот примерно вот так.
если что-то получится, будет интересно посмотреть что получилось :)

newart
06.07.2005, 11:45
если что-то получится, будет интересно посмотреть что получилось
Thx!
Бум пробывать, CC не за горами!