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

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

Е

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

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

;

В

от и всё!

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com