Kompresja i dekompresja plików gry

Serdecznie witam wszystkich czytających ten artykuł w którym chcę opisać metodę pakowania i rozpakowywania plików gry. Metoda będzie bardzo prosta, oparta na nieskomplikowanej klasie, którą Ty czytelniku możesz sobie rozbudować… Oczywiście rozwiązanie będzie opisane w Object Pascalu i z użyciem Omegi.

Ukryte właściwości OMEGI

Przeglądając pakiet Omegi można natrafić na taki unit: LZRW1.PAS. Zawiera on bardzo ciekawe metody związane z kompresją i dekompresją danych. Zainteresowanych odsyłam do przeglądnięcia wspomnianego unit-u.

Pisząc własny edytor światów oraz oprogramowując pliki zapisu stanu gry musimy się zdecydować na sposób przechowywania danych. Najłatwiej jest to zapisać w zwykłym pliku tekstowym. Ale powstaje banalny problem: do takiego pliku każdy będzie mieć dostęp pomimo zmianie jego rozszerzenie. Aby zabezpieczyć przed manipulacjami w sercach poziomów gry pasuj zastosować kodowanie…Omega daje inne rozwiązanie. Można takie pliki spakować, a to w zupełności wystarczy. Ba dodatkowo mamy upakowanie danych.

Tyle słowa wstępnego

Prosta klasa pakera

Najważniejsze procedury tej klasy to

a) procedure Kompresja
b) procedure Dekompresja

Procedura Kompresja

Opiera się na odwołaniu do wbudowanej metody kompresji danych klasy bazowej TLzrw1 odczytany plik pakowany jest do wskazanego pliku FSciezkapo wykonaniu kilku linii kodu:

Tu uwaga kod przykładowego programu otwiera pliki z rozszerzeniem *.txt i pakuje je do pliku o takiej samej nazwie ale zmienionym rozszerzeniu na *.OmegaPak

Procedura Dekompresja

Ta procedura rozpakowuje pobrane dane do zmiennej typu TStringList W kodzie programu jest to zmienna o nazwie ListaDanych Jest to wygodny sposób przechowywania rozpakowanego pliku. Ponieważ mamy dostęp do pojedynczej linii pliku ListaDanych.Strings Wystarczy teraz zastosować funkcję opracowaną przez Tostera (jest gdzieś w zasobach www.unit1.pl) odczytu danych oddzielonych ustalonym separatorem i możemy tak sobie zorganizować zapis danych naszego świata, że w jednej linii będziemy mieć szereg informacji (oddzielonych np. spacją) o pojedynczej kości mapy świata gry…

Poniżej kod procedury rozpakowującej dane

I to wszystko. Resztę czytelniku znajdziesz w załączonym kodzie. Jeszcze jedno do projekty należy dołączyć w sekcji uses

Pozdrawiam oksal Zbylitowska Góra 18. 02. 2007

PS

Jak tu nie kochać Delphi:)

Załączniki