Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Статья по динамической загрузке спрайтов

Оформил: XVeL
Автор: Spose
WEB-сайт: http://daddy.mirgames.ru

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

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

При этом файлы должны лежать в папке Pictures\Bmp (если они Bitmapы) или Pictures\Jpg (если они в Jpeg).
Ещё файлы со списком должны лежать в Pictures\Data

А вот и сама процедура загрузки:
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('Pictures\data',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('Pictures\Jpg\',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;
Вот и всё!
Проект Delphi World © Выпуск 2002 - 2024
Автор проекта: USU Software
Вы можете выкупить этот проект.