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