fizyka wzory prawa zadania teoria, chemia teoria zadania wzory, modelarstwo szkutnicze
omega

Pobierz kod OIL_E

ODCZYT DANYCH Z KILKU PLIKÓW *.OIL


Tym razem będzie to najłatwiejszy i najkrótszy materiał dotyczący OMEGI i prawdopodobnie dość cenny. Co prawda doceni to ta osoba co głowiła się nad sposobem łączenia kilku plików zasobów graficznych w jeden podczas ładowania gry.

 
Czym są zasoby grafiki zapisane w pliku *.oil?
 
To zbiór plików graficznych tworzących kafle świata, postacie czy też gadżety. Oprócz samej grafiki niosą w sobie informację o:
-nazwie pojedynczego pliku OmegaImageList1.ImageList.Items[i ].Name
-rozmiarze klatki OmegaImageList1.ImageList.Items[i ].TileWidth (TileHeight)
-przezroczystości OmegaImageList1.ImageList.Items[i ].Transparent
-kolorze przezroczystym OmegaImageList1.ImageList.Items[i ].TransparentColor


Ogólnie można w nich zapisać wszystkie właściwości, które da się ustawić po znaku kropki OmegaImageList1.ImageList.Items[i ]. .Oczywiście musimy sobie odpowiedni edytor zasobów graficznych stworzyć. Standardowo do komponentu OMEGI dołączony jest prosty edytor takich zasobów graficznych. Znajduje się on w ...\Utilities\OmegaImageList_Editor

Co nam daje odczyt danych z kilku plików *.oil?

Wyobraźmy sobie taka sytuację mamy w naszym świecie gry różne poziomy, w których znajdują się różne gadżety , stwory, panuje inna pora roku itp. to może dojść do takiej sytuacji, że mając jeden plik *.oil nie cała grafika będzie wykorzystana. A to oznacza że nie potrzebnie zawalam sobie pamięć. Można oczywiście tak opracować zasoby, z na dany poziom gry będziemy mieć inne pliki *.oil. Ale to może spowodować, że pewne części obrazów graficznych czy też całe pliki graficzne będą się powtarzać w tych zasobach.
Jak sobie z tym poradzić? Nasuwa się prosty pomysł otwierać zasoby *.oil i z nich wybierać co nas w danym poziomie gry interesuje

Jak załadować kilka plików *.oil do jednego TomegaImageList?- sedno artykułu

Rozwiązanie jest bardzo proste ale trudno jest na nie wpaść (tak jak napisałem na wstępie doceni to ten, kto nad tym się głowił, pozostali pewnie potraktują to rozwiązanie jak kolejny skrypt - określenie do którego nie jestem przyzwyczajony )

Podaję kod rozwiązania:



procedure TForm1.ToolButton1Click(Sender: TObject);
var
tempOmegaImageList:TOmegaImageList;
picture:TPicture;
i:integer;
begin
OpenDialog1.InitialDir:=ExtractFilePath(ParamStr(0));
if OpenDialog1.Execute then begin
tempOmegaImageList:=TOmegaImageList.Create(nil);
tempOmegaImageList.ImageList.LoadFromFile(OpenDialog1.FileName);
ProgressBAr1.Visible:=true;
ProgressBar1.Position:=0;
picture:=tpicture.Create;
for i:=0 to tempOmegaImageList.ImageList.Count-1 do begin
picture.Assign(tempOmegaImageList.ImageList.Items[i].Picture);

OmegaImageList1.ImageList.Add;
OmegaImageList1.ImageList.Items[OmegaImageList1.ImageList.Count-1].SetPicture(picture);
OmegaImageList1.ImageList.Items[OmegaImageList1.ImageList.Count-1].Name:=
tempOmegaImageList.ImageList.Items[i].Name;
OmegaImageList1.ImageList.items[OmegaImageList1.Imagelist.count-1].DisplayName :=
tempOmegaImageList.ImageList.Items[i].DisplayNAme;
OmegaImageList1.ImageList.Items[OmegaImageList1.ImageList.Count-1].Picture.Assign(picture);
OmegaImageList1.ImageList.Items[OmegaImageList1.ImageList.Count-1].TileWidth:=
tempOmegaImageList.ImageList.Items[i].TileWidth;
OmegaImageList1.ImageList.Items[OmegaImageList1.ImageList.Count-1].TileHeight:=
tempOmegaImageList.ImageList.Items[i].TileHeight;
OmegaImageList1.ImageList.Items[OmegaImageList1.ImageList.Count-1].Transparent:=
tempOmegaImageList.ImageList.Items[i].Transparent;
OmegaImageList1.ImageList.Items[OmegaImageList1.ImageList.Count-1].TransparentColor:=
tempOmegaImageList.ImageList.Items[i].TransparentColor;
//TA LINIA JEST BARDZO WAŻNA GDY CHCEMY WYŚWIETLIĆ DANY ZASÓB W RZECZYWISTEJ GRZE
//TU JEJ NIE UŻYWAM BO NIE MA UŻYTEGO OMEGATIMER
//OmegaImageList1.ImageList.Items[OmegaImageList1.ImageList.Count-1].Init;
//
ComboBox1.Items.Add(tempOmegaImageList.ImageList.Items[i].Name);
ProgressBar1.StepIt;
end;//koniec for
ProgressBar1.Visible:=false;
picture.free;
tempOmegaImageList.Free;
StatusBar1.Panels[3].Text :='Ilość plików: '+inttostr(ComboBox1.Items.Count);
end;
end;
code>




Jak widać do tymczasowego

tempOmegaImageList:TOmegaImageList;

ładujemy pliki odczytane z dysku a potem do tego właściwego TOmegaImageList w pętli "przelewamy" wszystkie właściwości. Oczywiście w takiej pętli można wybiórczo ładować grafikę na przykład rozróżniając ją po nazwie. I to cała tajemnic. Proste ale sporo czasu mi to zajęło zanim mnie oświeciło:)
Uwaga:
Linia kodu

OmegaImageList1.ImageList.Items[OmegaImageList1.ImageList.Count-1].Init;

musi być użyta w rzeczywistej grze (patrz komentarz w kodzie programu). Tu na potrzeby artykułu została pominięta. Wręcz w tej konstrukcji programu poglądowego powoduje błąd.

W załączniku do artykułu oprócz kodu znajdują się dwa pliki zasobów: TILES.OIL i stwory001.oil, które można złączyć w jeden i zapisać pod dowolna nazwą. Tak powstaną nam trzy pliki i znów możemy dodać je do siebie...
I to by było na tyle w tym temacie

KONIEC

Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz