Форум: "Игры";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
ВнизЗвуки в DXWaveList !!! Найти похожие ветки
← →
Sword-Fish (2003-04-21 09:32) [0]Здравствуйте ...
У меня к ВАМ вопрос, такого плана !!!
Я создал упаковщик игровых ресурсов и пакую туда (без архивации) звуки...
Так вот я их пакую, так:
TGameResourceHeader = packed record
Copyright : String[30];
ResCount : Integer;
end;
TGameResourceTable = packed record
Offset : Integer;
end;
Function TMainForm.CompileResource(const SourceFileList : TListBox; const OutFileName: string; const CompileMode : integer) : boolean;
var
// Поток для записи окончательного файла
OutStream : TStream;
// Поток для хранения таблицы смещений
TableStream : TMemoryStream;
// Поток для хранения данных
ResourceStream : TMemoryStream;
// Счетчик и кол-во ресурсов
i,resCount : Integer;
// Смещение от начала файла текущий ресурс
Offset : Integer;
// Размер заголовка и размер всей таблицы смещений
HeaderSize : Integer;
AllTableSize : Integer;
// Экземпляры
GameResourceHeader : TGameResourceHeader;
GameResourceTable : TGameResourceTable;
// Ресурсы разных форматов
MyWave : TWave;
begin
try
OutStream:=TFileStream.Create(OutFileName, fmCreate);
TableStream:=TMemoryStream.Create;
ResourceStream:=TMemoryStream.Create;
HeaderSize:=SizeOf(TGameResourceHeader);
AllTableSize:=SizeOf(TGameResourceTable)*SourceFileList.Count;
Offset:=HeaderSize+AllTableSize;
ResCount:=0;
// Для различных режимов компиляции - различные методы !!!
if CompileMode=2 then begin
MyWave:=TWave.Create;
for I:=0 to SourceFileList.Count-1 do
begin
MyWave.LoadFromFile(SourceFileList.Items[i]);
MyWave.SaveToStream(ResourceStream);
GameResourceTable.Offset:=Offset;
TableStream.WriteBuffer(GameResourceTable, SizeOf(TGameResourceTable));
Offset:=HeaderSize+AllTableSize+ResourceStream.Position;
Inc(resCount);
end;
MyWave.Free;
end;
// Перемещаемся на начало данных
ResourceStream.Seek(0, soFromBeginning);
TableStream.Seek(0, soFromBeginning);
// Записываем авторские права и кол-во ресурсов
GameResourceHeader.Copyright:="Copyright © 2003 Sword-FISH";
GameResourceHeader.ResCount:=ResCount;
// Запись выходного файла
OutStream.WriteBuffer(GameResourceHeader, SizeOf(GameResourceHeader));
OutStream.CopyFrom(TableStream, TableStream.Size);
OutStream.CopyFrom(ResourceStream, ResourceStream.Size);
// Блок финализации
ResourceStream.Free;
TableStream.Free;
OutStream.Free;
Result:=true;
except
Result:=false;
// Блок финализации
ResourceStream.Free;
TableStream.Free;
OutStream.Free;
end;
end;
(( Кстати такой пример был на DelphiGFX !!! )) ...
После этого я не могу их загрузить в DXWaveList !!!
Пишет мне Stream Error ...
Гружу так :
DXWaveList.Items.Add;
DXWaveList.Items[0].Wave.LoadFormStream(LoadSnd(1));
, где LoadSND(n) - функция вызываемая из моей DLL !!!
(перед этим я открываю DLL (само собой :) )
Function LoadSnd(const resCount : integer) : TStream; stdcall;
begin
// Перемещение на начало таблицы смещений ресурса
FileStream.Seek((resCount-1)*SizeOf(GameResourceTable), soFromCurrent);
// Чтение таблицы ресурса
FileStream.ReadBuffer(GameResourceTable, SizeOf(GameResourceTable));
// Перемещение к началу данных затребованного ресурса
FileStream.Seek(GameResourceTable.Offset, soFromBeginning);
// Грузим !!!
MyWave.LoadFromStream(FileStream);
MyWave.SaveToStream(Result);
// Перемещение к началу данных
FileStream.Seek(SizeOf(GameResourceHeader), soFromBeginning);
end;
Как мне быть please !!!!
← →
jel (2003-04-21 10:44) [1]Использовть временный stream, в который писать нужный ресурс. Методам типа XXX.LoadFromStream глубоко до фени манипуляции по изначальному позиционированию указателя в потоке. Он используют весь поток. Оттуда и ошибка.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.011 c