Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трудности с реализацией расшифровки спрайта, использую Kol+MCK 
V
    Опции темы
SGTeam
Дата 3.9.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 17.7.2006

Репутация: нет
Всего: нет



Здравствуйте уважаемые,надеюсь вы мне поможите с моими затруднениями возникшими в процессе разработки.Я использую Kol+MCK, но это не суть важно.И так:
Файл грубо говоря выглядит следующим образом
Код

В начале заголовок:

GRPHeader: record
  Sprites: LongInt;             //Количество спрайтов
  FullWidth: LongInt;           //Полная ширина изображения
  FullHeight: LongInt;          //Полная высота изображения
End;

По адресу $06  располагается SAT (Sprite Allocation Table) - таблица расположе-
ния спрайтов. Каждая запись имеет следующую структуру:

SATRecord: record
    OffsetLeft: Byte;           //Смещение спрайта от левого края изображения
    OffsetTop: Byte;            //Смещение спрайта от верхнего края изображения
    SpriteWidth: Byte;          //Ширина спрайта
    SpriteHeight: Byte;         //Высота спрайта
  Offset: LongInt;              //Смещение до данных спрайта
End;

Считываю данные следующим образом:
Код

var
GprStream,NewStream: PStream;//Потоки для открытия и конвертирования спрайтов
  Sprites: LongInt;             //Количество спрайтов
  FullWidth: LongInt;           //Полная ширина изображения
  FullHeight: LongInt;          //Полная высота изображения
  OffsetLeft: Byte;           //Смещение спрайта от левого края изображения
    OffsetTop: Byte;            //Смещение спрайта от верхнего края изображения
    SpriteWidth: Byte;          //Ширина спрайта
    SpriteHeight: Byte;         //Высота спрайта
  Offset: LongInt;              //Смещение до данных спрайта
  BMPHeader: RECORD             //Заголовок *.bmp формата(необходим для конвертирования)
               FullSize: LongInt;
               _H1: LongInt;
               _C1: LongInt;
               _C2: LongInt;
               X: LongInt;
               Y: LongInt;
               _C3: Word;
               _C4: Word;
               _H2: LongInt;
               _H3: LongInt;
               DataSize1: LongInt;     //DataSize=X*Y+2*Y
               DataSize2: LongInt;     //DataSize=X*Y+2*Y
               _C5: ARRAY[1..8]OF Byte;
             END;
inplemenation

Procedure OpenGpr(FileName: string;ProgressBar:PControl);
var
Binfo: longInt;
begin
GprStream:=NewReadFileStream(FileName);
ProgressBar.Position:=0;
ProgressBar.MaxProgress:=GprStream.Size;
ProgressBar.Position:=GprStream.Position;
GprStream.Seek(Binfo,spBegin);
While GprStream.Position < $06 do //Пока позиция не равна позиции SAT читаем Header
  begin
   GprStream.Read(Sprites,4);
   GprStream.Read(FullWidth,4);
   GprStream.Read(FullHeight,4);
  end;
 if GprStream.Position = $06 then
 repeat
  begin
  GprStream.Read(OffsetLeft,1);
  GprStream.Read(OffsetTop,1);
  GprStream.Read(SpriteWidth,1);
  GprStream.Read(SpriteHeight,1);
  GprStream.Read(Offset,4);
  {***расшифровка спрайта***}
 until
end;


Собственно трудности с реализацией расшифровки спрайта - алгоритм выглядит следующим образом:
В заголовке спрайта последовательно
размещены смещения на каждую из строк спрайта. Наша задача состоит в том, чтобы
последовательно перейти на  начало каждой  строки и  по определенной  схеме эту
строку расшифровать . Да, да , именно расшифровать, потому что этот формат ока-
зался не таким  уж простым. Во  всяком случае - на  первый взгляд . Итак, будем
считать, что мы перешли к некой строке. Строка состоит из нескольких сегментов.
Каждый сегмент состоит из байта-описателя и, собственно, байтов данных. Левые 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). Таким же образом разбираются и остальные строки.

Так вот.......Как это реализовать???Заранее благодарен.

PM MAIL   Вверх
Alexeis
Дата 4.9.2006, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



SGTeam, чет я не очень понял, что изображения спрайтов не хранятся в стандартном формате?
Это что самодельная реализация RLE? вообще я бы рекомендовал упростить формат и хранить спрайты в формате png, это и проще и места меньше занимает и автоматически поддержка прозрачности, тем более, что для КОЛ имеется свой компонент png.

Это сообщение отредактировал(а) alexeis1 - 4.9.2006, 01:01


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
SGTeam
Дата 4.9.2006, 05:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 17.7.2006

Репутация: нет
Всего: нет



В таком вормате их хранить StarCraft....Я и хочу их выдрать, и перевести в какой нибудь другой формат.
PM MAIL   Вверх
Alexeis
Дата 4.9.2006, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



SGTeam, так это уже сделали другие smile , есть готовый распаковщик
С Warcraft он работает плохо, а вот StarCraft нормально!

Добавлено @ 09:15 
http://www.extractor.ru/download_index.phtml


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0712 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.