Fastbar
Powrót do strony głównej
Trzymaj pliki na gmclan.org!
Game Maker w pytaniach i odpowiedziach!
Polska dokumentacja
Tabela wyników ligi 24
Pobierz GM
Akademia GMCLANu
Kategorie bazy artykułów
Artykuły -> Game Maker -> Kursy GML
Treść artykułu
Zaawansowana obsługa sprite'ów
autor: Ranma_man (11.09.04)
Pewnego dnia, rozmyślając nad kolejnym projektem, zacząłem zastanawiać się nad wczytywaniem grafiki z osobnych plików, cel: osiągnięcie jak najmniejszego rozmiaru exe (tak by mieścił w sobie tylko interpreter gm'a, skrypty oraz parę podstawowych grafik), tak by nie było potem kłopotu z ewentualnym patch'owaniem. Po drugie chodziło o to by mając przykładowo animacje chodzenia ludzika w prawo, nie kopiować jej z "mirrorem", lecz aby podczas wczytywania gry skrypt sam utworzył odpowiednią animację w lewo. Najlepszym sposobem do osiągnięcia tego jest trzymanie grafiki w formie "strip'a" i to jako GIF z optymalną paletą kolorów. Taki plik naprawdę mało zajmuje.

Plany trzeba było wprowadzić w życie i ... udało się :). Opiszę kolejno fazy tworzenia specjalnej funkcji - skryptu oraz grafiki.

Przykładowy dwuklatkowy strip w formacie gif:


Taką grafikę jest łatwo przygotować. Wystarczy animację zapisać w formie stripa jako bmp, a następnie go wczytać jako jedna klatka i teraz zapisać jako gif. Trzeba jeszcze w innym edytorze graficznym zoptymalizować paletę kolorów w celu zmniejszenia wielkości pliku.

Zapisujemy tak przygotowanego stripa do katalogu z grą, a najlepiej utwórzmy katalog data i tam wrzućmy plik. Teraz czas utrudnić odczyt pliku przed wścipskimi osobami. W tym celu zmieniamy rozszerzenie z gif na gfx. To nie wszystko... zmienimy parę pierwszych bajtów pliku, by nie był on czytelny po zmianie rozszerzenia. Dla niedoinformowanych, w GM 5.3 zarejestrowanej wersji dostępne są funkcje do binarnej obsługi plików. Aby zmienić te bajty będziemy musieli napisać specjalny konwerter w GM lub użyć jakiegoś hex edytora. Polecam drugą opcję, osobiście korzystam z bardzo dobrego programu XVI32 i to na jego przykładzie opiszę zmianę bajtów. Otwieramy plik graficzny w tymże programie.

Widzimy:


Hmmm... Zamieńmy GIF89a na ISTRIP:


Teraz czas na napisanie funkcji. Tworzymy nowy skrypt o nazwie sc_LoadSprite:
kod:
/*
Advanced sprite loader by Ranma_man
arg0 - nazwa pliku (string)
arg1 - transparent (0 - nie , 1 - tak)
arg2 - liczba klatek animacji (liczba)
arg3 - pozycja startowa (liczba pominietych klatek)
arg4 - szerokosc pojedynczej klatki animacji
arg5 - wysokosc pojedynczej klatki animacji
arg6 - Przesuniecie poziomie (liczba pikseli)
arg7 - Przesuniecie pionowe (liczba pikseli)
arg8 - Inne opcje (1 - mirror, 2 - flip, 3 - mirror i flip)
arg9 - Obrot w stopniach (obrot calej animacji)
*/

var on,nn,fh,sh,i,spr; //Stworz tymczasowe zmienne


/* Rozpoznaj plik */
on = 'data' + argument0 + '.gfx';

/* Mmien na chwile rozszerzenie by GM mogl odczytac grafike */
nn = filename_change_ext( on , '.gif' );

/* Kopiuj plik tymczasowo, by nie operowac na oryginale */
file_copy( on , nn );

/* Zmien na plik na czytelny GIF zmieniajac ISTRIP na GIF */
fh = file_bin_open(nn,1);
file_bin_write_byte(fh,71);
file_bin_seek(fh,1);
file_bin_write_byte(fh,73);
file_bin_seek(fh,2);
file_bin_write_byte(fh,70);
file_bin_seek(fh,3);
file_bin_write_byte(fh,56);
file_bin_seek(fh,4);
file_bin_write_byte(fh,57);
file_bin_seek(fh,5);
file_bin_write_byte(fh,97);
file_bin_close(fh);

/* Wczytaj zasob graficzny do sprite_temp'a */
sprite_replace(spr_temp,'data'+argument0+'.gif',0,1,argument1,1,0,0,0);

/* Wczytaj 1 klatke animacji do sprite_temp'a 2 */
/* Wykonaj przesuniecie ustal wielkosc klatki animacji */
sprite_assign(spr_temp2,spr_temp);
sprite_shift(spr_temp2,argument3*argument4*-1+argument6,argument7);
sprite_resize(spr_temp2,argument4,argument5,4);

/* Sprawdz dodatkowe efekty */
switch(argument8)
{
case 1: sprite_mirror(spr_temp2); break;
case 2: sprite_flip(spr_temp2); break;
case 3: sprite_mirror(spr_temp2); sprite_flip(spr_temp2); break;
}

if (argument9>0)
{
sprite_rotate(spr_temp2,argument9,1);
}

/* Tworz nowy wlasciwy sprite */
spr = sprite_duplicate(spr_temp2);

i = 1;

/* wykonaj to samo co wyzej dla reszty klatek animacji */
while ( i < argument2 )
{
sprite_assign(spr_temp2,spr_temp);
sprite_shift(spr_temp2,(i+argument3)*argument4*-1,argument7);
sprite_resize(spr_temp2,argument4,argument5,4);
switch(argument8)
{
case 1: sprite_mirror(spr_temp2); break;
case 2: sprite_flip(spr_temp2); break;
case 3: sprite_mirror(spr_temp2); sprite_flip(spr_temp2); break;
}
if (argument9>0)
{
sprite_rotate(spr_temp2,argument9,1);
}

/* doklej kolejna klatke animacji do wlasciwego sprite'a */
sprite_merge(spr,spr_temp2);
i+=1;
}

/* Usun tymczasowy plik */
file_delete(nn);

return spr;


Musimy jeszcze stworzyć dwa sprite'y o nazwach spr_temp i spr_temp2, jest to ważne, gdyż bez tego skrypt nie zadziała. Są to tymczasowe sprite'y do przygotowywania animacji klatka po klatce.

Dalej tworzymy jakiś obiekt testowy. W create dajemy mu:
kod:
xxx = sc_LoadSprite('shyguy',1,2,0,32,32,0,0,0,0);
sprite_index = xxx;

I gotowe. Mamy teraz nową funkcję mojego autorstwa do odczytu plików graficznych i dodawania nowych sprite'ów w czasie gry.

Taka wygoda okupiona jest czasochłonnością (trzeba utworzyć specjalne pliki, operować w edytorze na obiektach bez sprite'ów) i długością wczytywania grafiki, tak więc nie szarżujcie z ich liczbą. Najlepiej grafikę tworzyć tylko raz podczas startu gry lub planszy. No i na koniec powiem, że każdy lepszy szperacz zasobów i tak odczyta grafikę. :]

A tutaj link do przykładu, by pokazać, że to działa :)
Plik
głosów: 9 | ocena: 8.77 oceń zasób | dodał: Ranmus
Komentarze
stron: 1

1


av

SLy (21:18, 12.09.2004)

Łał tego mi było trzeba. Mam jedno pytanko: Podczas zmiany początkowych bajtów pliku zmieniasz je na 71 73 70 56 57 97. Czy są to numery bajtów odpowiedzialnych za literki??? W moim edytorze "GIF98a" wyglądało troche inaczej...

av

Ranmus (10:08, 13.09.2004)

Po pierwsze nie GIF98a lecz GIF89a. A te liczby to zapis tego wyrazu według tablicy ASCII, w formie dziesiętnej. Może miałeś zapis np. w hexach, wtedy u siebie widzisz tak:
47 49 46 38 39 61

~PrzemO (9:35, 30.04.2005)

Ja nie mam zarejstrowanej wersji artkuł fajny ale nie urzyteczny

av

Marmot (14:01, 30.04.2005)

Nie użyteczny? Napewno dla tych co nie mają zarejestrowanej wersji

av

Tymon (13:51, 3.05.2005)

Hej, a podobno gdy wszystkie sprity, dźwięki itd. ładuje sie z osobnych plików do gry to gra chodzi szybciej. Prawda ?

av

Marmot (15:16, 3.05.2005)

Raczej tak, bo wtedy plik EXE jest mniejszy.

av

Ranmus (11:05, 4.05.2005)

Gra nie chodzi szybciej tylko szybciej ładuje się na początku.

av

Simon (20:33, 3.01.2006)

a jak zrobić tak samo z muzyką

av

Cekol (13:39, 22.05.2006)

A czy jest podobny skrypt ale pod gm 6.1??

av

Marmot (17:36, 22.05.2006)

To powinno działać pod 6.1

av

Cekol (8:26, 23.05.2006)

mi niedziała mówi : Unknown funtion or script: sprite_shift

av

Ranmus (15:44, 24.05.2006)

Bo w GM6 nie ma takiej funkcji. Ten poradnik jest niestety tylko do GM5. Jak uda mi się nagiąć jeszcze trochę czasu to może uaktualnię do GM6.

av

G@C3K (21:02, 13.08.2006)

CO TRZEBA NAPISAĆ W SKRYPCIE

av

pilar36 (11:32, 26.11.2006)

mam nadzieje ze szybko nagniesz ten czas, bo mi jest zajebiscie potrzebny

av

Ranmus (14:11, 26.11.2006)

To mam złe wieści. Najpierw poczekam do GM7, a potem sprawdzę funkcje, które są tu użyte. Niestety w GM6 jest inny silnik graficzny niż w GM5 i dużo funkcji zostało niestety wywalonych, w tym te, które użyłem w tym przykładzie.

stron: 1

1



Dodaj komentarz:
Treść:
Menu
Panel użytkownika
Jesteś niezalogowany!

Nie masz konta? Zarejestruj się
Użytkownicy on-line
5 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 5, userów: 0, ukrytych: 0
Użytkownicy na czacie discord
Ignatus (23:06, 20.05.18):
To bedzie w zasadach opcjonalnych- no i tylko jezeli przejdzie solidne testy, bo teraz dziala to wszystko idealnie wiec nie ma co kombinowac
I am Lord (22:58, 20.05.18):
Nie przekombinuj, chyba że chcesz zostawić to jako opcję dla zaawansowanych
Ignatus (22:49, 20.05.18):
wiec wrzucilem jako cel przyszly
Ignatus (22:49, 20.05.18):
ale to jeszcze nie przetestowane wiec do bazowej gry nie dodalem
Ignatus (22:49, 20.05.18):
to by dzialalo tak ze jezeli gracz ulozy karty o wartosci 1,2,3 (i w tej kolejnosci) dobiera 1 z 3 kart specjalnych
Ignatus (22:48, 20.05.18):
Jeszcze planuje przy przekroczeniu celu kampanii 10k dorzucic kilka kart i umiejetnosci
Ignatus (22:48, 20.05.18):
Pewnie że tak
I am Lord (22:42, 20.05.18):
żeby było więcej kart
I am Lord (22:41, 20.05.18):
kupując np 2 zestawy gry
I am Lord (22:41, 20.05.18):
zmodyfikować zasady*
I am Lord (22:40, 20.05.18):
zawsze można będzie zmodyfikować sobie jak się chce mieć losową rękę
Ignatus (22:33, 20.05.18):
Niektórzy na Pyrkonie dosłownie po 5 minut myśleli nad ruchem
Ignatus (22:32, 20.05.18):
Zerowa losowośc- gracze mają do dyspozycji symetryczne talie 7 kart od początku do dyspozycji.Jest takie ciężkie kombinowanie że aż sam jestem w szoku
I am Lord (22:28, 20.05.18):
Teraz przeczytałem opis gry Humor taki jak u Pratchetta
I am Lord (22:13, 20.05.18):
A powiedz mi jak dużą rolę gra szczęście? Kółko i krzyżyk był grą o zerowym szczęsciu, nie da się go wygrać gdy staną przeciwko sobie przeciwnicy na tym samym poziomie. U ciebie elementem losowym jest talia kart tak? Czy rozdanie mocno wpływa na przebieg gry?
I am Lord (22:11, 20.05.18):
Przez ciebie mam chęć zrobienia takiej gierki samemu
Uzjel (22:00, 20.05.18):
Od razu z góry mogę zaproponować port na iOS'a, bo właśnie się uzbroiłem w CAŁY sprzęt Powodzenia!
Ignatus (21:54, 20.05.18):
A jezeli sie powiedzie to oczywiscie bede to przekuwał w multi na andka w przyszłości
Ignatus (21:53, 20.05.18):
Ujzel:wydawcą jest póki co wspieram.to ;p Ale juz rozmawiam z jednym sklepem większym który mnie wychaczyl na Pyrkonie
Ignatus (21:51, 20.05.18):
Jak się skonczy kampania to beda chodzic w sklepie po 30-35 wiec na pewno jakis zysk bedzie
Ignatus (21:50, 20.05.18):
Bardzo dziękuje!!!!!!!!
Uzjel (21:50, 20.05.18):
O! Albo sprzedam z zyskiem!
Uzjel (21:50, 20.05.18):
Na początku czerwca mam ostatnie zajęcia, więc pewnie się nie uda Rozdam planszówkowym kolegom.
I am Lord (21:49, 20.05.18):
Może ich też to natchnie
I am Lord (21:49, 20.05.18):
To rozdaj maluchom ze szkoły
I am Lord (21:41, 20.05.18):
a nie bo przesyłka będzie kłopotliwa :d
I am Lord (21:41, 20.05.18):
Na gmclan do konkursu
Uzjel (21:34, 20.05.18):
Też dorzucę, ale nie wiem co zrobię z dodatkowymi sztukami :p
I am Lord (21:30, 20.05.18):
Wow ignatus zasady wyglądają na faktycznie grywalne, nie mam i tak z kim w to zagrać chyba że zrobisz kiedyś giereczkę na PC czy androida ale dorzucę grosza
Uzjel (21:25, 20.05.18):
Fajnie Ignatus, kto będzie wydawcą?
Ignatus (19:46, 20.05.18):
Panowie zachęcam do wspierania mojej kampanii gry karcianej.Po prawie 100 partiach na Pyrkonie nieskromnie stwierdzam ze jest zajebsicie grywalna. wspieram.to/czarowieze
Wojzax (19:27, 20.05.18):
No mi najwięcej oryginalnych pomysłów wpada gdzieś w plenerze. Nie że związanych z tym plenerem po prostu tak wyjście mi czasem działa na mózg.
Wojo (19:15, 20.05.18):
za pieniądze z genialnego pomysłu możesz spłacić kredyt za który się wyprowadziłeś
Wojo (19:14, 20.05.18):
wniosek jest taki, że trzeba wyprowadzić się do ciepłych krajów
Sutikku (14:52, 20.05.18):
zawsze jak jest ciepło to tyle pomysłów do tworzenia, a jak jest zima siedzi się w domu, tyle czasu i nic
I am vader (10:33, 19.05.18):
Bry :v
CTRL (10:31, 19.05.18):
Hejka
Chell (19:50, 16.05.18):
knives to noże*
Chell (19:50, 16.05.18):
knives to noe, knifes to nożuje
MaxGaming (16:26, 16.05.18):
Jezeli chodzi o nazwę produktu to powinienem użyć Knifes czy Knives? Np. powiedzmy że marka nazywała by się Blue Knifes czy Blue knives?
PsichiX (2:13, 16.05.18):
do oxygena dodalem juz tez. bede oddelegowywal do wasma ciezkie fragmenty kodu, zeby odciazyc silnik, bo ciezki jest. tak jakby glsl ale dla procka robie, to pomoze mi powoli ECSa przeniesc
PsichiX (21:32, 15.05.18):
przegladarka laduje bytecode z pliku i w JSie mozesz uzywac wyeksportowanych z wasmowego modulu funkcji. jest to bezpieczne, poniewaz tak jak JS, uruchamiane jest to w sandboxowanym srodowisku. nie jest to assembler per se, zas podczas ladowania, przegladarka waliduje bytecode i jesli jest bezpieczny, to kompiluje go do kodu maszynowego i wyeksportowane funkcje wykonuja odpowiadajacy im kod maszynowy z pamieci. wasmowy modul ma dostep wylacznie do tych funkcji, ktore mu przekazemy z JSa
MaxGaming (17:22, 15.05.18):
Inaczej byłoby to bardzo niebezpieczne
MaxGaming (17:22, 15.05.18):
I jak to działa? Przecież przeglądarka chyba musi to i tak interpretować
PsichiX (15:45, 15.05.18):
wasm to przegladarkowy assembler
MaxGaming (13:47, 15.05.18):
A co to jest w ogóle?
PsichiX (23:42, 13.05.18):
bawie sie wasmem github.com/Psic...test/test2.wast
Wojo (21:16, 13.05.18):
Ja też nie mam nic do picia alkoholu i skuterów, tylko do niektórych ludzi którzy to robią
I am Lord (17:27, 13.05.18):
Ale nic nie mam do motorów jakby co, tylko do niektórych ludzi którzy nimi jeżdżą
I am Lord (17:26, 13.05.18):
podczas ruszania
Ankieta
» Jakie kursy najchętniej widziałbyś na stronie ?
GM Studio
GM Studio 2
Godot
Construct

GMCLAN to serwis o programie Game Maker i nie tylko.
Copyright © 2002-2018. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!
© 2002-2017 Ranmus (ranmus.pl), © 2017-2018 {=|=} fable_inside();

[ Czas generowania strony: 0.02621 sekund ] [ Liczba zapytań MySQL: 13 ]