| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Трудности с реализацией расшифровки спрайта |
| Автор: SGTeam 3.9.2006, 13:39 | ||||
| Здравствуйте уважаемые,надеюсь вы мне поможите с моими затруднениями возникшими в процессе разработки.Я использую Kol+MCK, но это не суть важно.И так: Файл грубо говоря выглядит следующим образом
Считываю данные следующим образом:
Собственно трудности с реализацией расшифровки спрайта - алгоритм выглядит следующим образом: В заголовке спрайта последовательно размещены смещения на каждую из строк спрайта. Наша задача состоит в том, чтобы последовательно перейти на начало каждой строки и по определенной схеме эту строку расшифровать . Да, да , именно расшифровать, потому что этот формат ока- зался не таким уж простым. Во всяком случае - на первый взгляд . Итак, будем считать, что мы перешли к некой строке. Строка состоит из нескольких сегментов. Каждый сегмент состоит из байта-описателя и, собственно, байтов данных. Левые 2 бита байта-описателя определяют тип сегмента (в дальнейшем - Type), остальные 6 бит - длина сегмента (в дальнейшем - Length). Вот возможные типы сегментов и их значения: *** Таблица типов сегментов *************************************************** b00 - Сегмент представляет собой последовательность пикселей. Группа пикселей длиной в Length считывается сразу за байтом - описателем. b01 - Сегмент представляет собой последовательность одинаковых пикселей длиной в Length. Образец пикселя считывается сразу за байтом-описателем. b10 - Сегмент представляет собой последовательность прозрачных пикселей длиной в Length. b11 - Сегмент представляет собой последовательность прозрачных пикселей длиной в Length+64. ******************************************************************************* Рассмотрим конкретный пример строки. *** Образец строки **************************** 86 09 47 8F 8F 44 46 8D 42 8E 49 44 94 01 49 9E *********************************************** 1. Позиция в строке - $00: байт-описатель первого сегмента - $86. Разбиваем его на левую (2 бита) часть и правую (6 бит). Левая равняется b10 - это тип сегмента. Правая - b000110, или d6 - это длина сегмента. Значит, тип равен b10. Следовательно сегмент этот определяет прозрачную строку длиной в 6 пик- селей. Раз пиксель прозрачный, значит его значение нам считывать не нужно - оно всегда равняется $00. Получаем первые 6 пикселей строки. 2. Позиция в строке - $01: байт-описатель второго сегмента - $09. Type=b00, Length=d9. Тип b00 подразумевает чтение группы байтов длиной в 9 и формиро- вания из них строки. 3. Позиция в строке - $0B: байт-описатель третьего сегмента - $44. Type=b01, Length=d4. Раз тип равен b01 , значит строка длиной в 4 пикселя состоит из одинавовых пикселей, образец которого помещается в следующем байте. 4. Позиция в строке - $0D: байт-описатель четвертого сегмента - $01.Type=b00 , Length=d1. Читаем следующий байт. Это и будет короткий сегмент. 4. Позиция в строке - $0F: байт-описатель пятого сегмента - $9E.Type=b10, Length=d30. Это - прозрачный сегмент длиной в 30 пикселов. Таким образом, в сумме все эти сегменты образуют полную строку длиной в 50 пик- селов (6+9+4+1+30). Таким же образом разбираются и остальные строки. Так вот.......Как это реализовать???Заранее благодарен. |
| Автор: Alexeis 4.9.2006, 01:00 |
| SGTeam, чет я не очень понял, что изображения спрайтов не хранятся в стандартном формате? Это что самодельная реализация RLE? вообще я бы рекомендовал упростить формат и хранить спрайты в формате png, это и проще и места меньше занимает и автоматически поддержка прозрачности, тем более, что для КОЛ имеется свой компонент png. |
| Автор: SGTeam 4.9.2006, 05:24 |
| В таком вормате их хранить StarCraft....Я и хочу их выдрать, и перевести в какой нибудь другой формат. |
| Автор: Alexeis 4.9.2006, 09:12 |
| SGTeam, так это уже сделали другие С Warcraft он работает плохо, а вот StarCraft нормально! Добавлено @ 09:15 http://www.extractor.ru/download_index.phtml |