Delphirus - прграммирование на delphi
   Все о delphi Delphirus - прграммирование на delphi
blocks.gif
Навигация
 

Главная
Статьи
Базы данных
Графика
Защита
Интернет
Система
Тексты
Мультимедиа
Файлы
Формы и окна
Другое
Советы
Базы данных
Графика
Интернет
Мультимедиа
Система
Тексты
Файлы
Файлы
Исходники
Компоненты
Инфо
Поиск по сайту
Обратная связь
Самое популярное
Аккаунт
Карта сайта

 
 
 

Советы по delphi \ Графика и Игры \ Создание игр \ Статья по динамической загрузке спрайтов

Статья по динамической загрузке спрайтов

Если делать игру с большим количеством графических изображений, то неразумно будет загружать их все сразу, например зачем в основном меню игры графика босса с последнего уровня? А вот памяти его "фото" будет жрать! Чтобы этого непроисходило необходимо разделить всю игру на сцены, и просто при загрузке конкретной сцены удалять из памяти ненужные картинки и загружать туда только те которые в этой сцене используются. Делаем это так:
При загрузке сцены пишем:

loadpicdata(DxImagelist1 {Вместо DxImagelist1 имя вашего TdxImageLista},'Menu' {Тут название файла со списком используемых картинок данной сцены});

Формат файла со списком такой:
[название] (название одинаково с именем файла, только без расширения)
PictureHeight=800 (Высота картинки)
PictureWidth=600 (Ширина картинки)
PatternHeight=0 (Высота кадра (если в картинке несколько кадров))
PatternWidth=0 (Ширина кадра)
SkipHeight=0 (Пропуск высоты, пусть останеться 0)
SkipWidth=0 (Пропуск ширины, пусть останеться 0)
SystemMemory=0 (Пока не надо, пусть останеться 0)
Transparent=0 (Прозрачен или нет)
TransparentColor=clBlack (Цвет прозрачности)

Например кусочек файла "game.dat":

[enemy]
PictureHeight=96
PictureWidth=192
PatternHeight=0
PatternWidth=48
SkipHeight=0
SkipWidth=0
SystemMemory=0
Transparent=1
TransparentColor=$00FF8040

При этом файлы должны лежать в папке PicturesBmp (если они Bitmapы) или PicturesJpg (если они в Jpeg).
Ещё файлы со списком должны лежать в PicturesData

А вот и сама процедура загрузки:
PS. В USES надо дописать DIB, Jpeg, iniFiles

Procedure TForm1.LoadPicData( var DXImageList : TDXImageList; FileName : string);
Var
   i : integer;
   Item : TPictureCollectionItem;
   SectionName : string;
   Ident : string;
   NewGraphic : TDIB;
   BitMap : TBitMap;
   PicFileName : string;
   SectionList : TStringList;
   JpgImg : TJPEGImage;
   Ext : String;

Function GetName(InDir,InFileName : string): string ;
Var
   OutFileName : string;
begin
   Result:='';
   OutFileName:=ExtractFilePath(Application.ExeName)+InDir+''+InFileName ;
   Result:=OutFileName;
   Exit;
   OutFileName:='c:'+InDir+''+InFileName;
   if FileExists(OutFileName) then
   begin
      Result:=OutFileName;
      Exit;
   end;
end;

begin
   DXImageList.Items.Clear; //Очищаем память от картинок
   FileName:=ChangeFileExt(FileName,'.dat');
   NewGraphic:=TDIB.Create;
   BitMap:=TBitMap.Create;
   SectionList:=TStringList.Create;
   try //Читаем файл со списком изображений
      With TIniFile.Create(GetName('Picturesdata',FileName)) do
      try
         ReadSections(SectionList);
         For i:=0 to SectionList.Count-1 do
         begin
            SectionName:=SectionList[i];
            //Пытаемся определить формат картинки
            Ext:='bmp';
            PicFileName:=GetName('Pictures',Ext+''+SectionName+'.'+Ext);
            if FileExists(PicFileName) then
               NewGraphic.LoadFromFile(PicFileName);
            else
            if not (FileExists(PicFileName)) then
            begin
               Ext:='jpg';
               PicFileName:=GetName('PicturesJpg',SectionName+'.'+Ext);
               JpgImg:=TJPEGImage.Create;
               try
                  JpgImg.LoadFromFile(PicFileName);
                  NewGraphic.Assign(JpgImg);
               finally
                  JpgImg.Free;
               end;
            end;
            //Добавляем картинку в память
            Item := TPictureCollectionItem.Create(DXImageList.Items);
            Item.Picture.Graphic := NewGraphic;
            Item.Name:=SectionName;
            Ident:='PatternHeight';
            Item.PatternHeight:=ReadInteger(SectionName,Ident,0);
            Ident:='PatternWidth';
            Item.PatternWidth:=ReadInteger(SectionName,Ident,0);
            Ident:='SkipHeight';
            Item.SkipHeight:=ReadInteger(SectionName,Ident,0);
            Ident:='SkipWidth';
            Item.SkipWidth:=ReadInteger(SectionName,Ident,0);
            Ident:='SystemMemory';
            Item.SystemMemory:=ReadBool(SectionName,Ident,false);
            Ident:='Transparent';
            Item.Transparent:=ReadBool(SectionName,Ident,false);
            Ident:='TransparentColor';
            Item.TransparentColor:=StringToColor(ReadString(SectionName,Ident,'clBlack'));
            Item.Restore;
         end;
      Finally
         Free;
      end;
   Finally
      NewGraphic.Free;
      BitMap.Free;
      SectionList.Free;
   end;
end;

Вот и всё!

Название: Статья по динамической загрузке спрайтов
Дата публикации: 2004-08-31 (2798 Прочтено)

 
 

 

Page generation 0.043 seconds