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
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.

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.

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
81 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 75, userów: 6, ukrytych: 0
Shil, Nikas, ♔ Wojo ♔ , ANtY, ediepl, Sutikku

0 użytkownik(ów) na gmczacie i 0 bot(ów)
Shoutbox
Nikas (14:12, 24.01.17):
ani trochę
ANtY (13:42, 24.01.17):
nie
Wojo (13:32, 24.01.17):
dodam tyle, że wiem o zarobkach w indiach i one wcale nie powalają
Wojo (13:32, 24.01.17):
czy z bycia indie game developerem można się utrzymać ?
ANtY (13:30, 24.01.17):
szaławiła
Ranmus (13:20, 24.01.17):
Gnysek działał w konspirze, dał sobie admina na drugę grupę, a potem zrezygnował. Ancymon jeden.
Nikas (12:59, 24.01.17):
ha ha ha!!!!!!!
gnysek (9:50, 24.01.17):
No to już nic nie mogę wam zrobić
gnysek (9:50, 24.01.17):
O, Ranma mi uprawnienia admina wyjebał z forum
Chell (23:09, 22.01.17):
te gmclanowe przyplywy i odplywy
Saus (20:35, 22.01.17):
Nie, kopelat*
Saus (20:35, 22.01.17):
100 lat!
Nikas (15:16, 21.01.17):
ayyy ;///
exp (13:54, 21.01.17):
to nie byłem ja
Wojo (13:23, 21.01.17):
tylko przy referenie
Wojo (13:22, 21.01.17):
tatu - robot
Nikas (13:01, 21.01.17):
A ja nie wiem już, pamiętam tylko, że pytałeś się przy jakim traczku ją przelecieć. xDDD
exp (11:37, 21.01.17):
o jakiej lasce ja ci pisałem kiedyś?
Nikas (0:15, 21.01.17):
spk a u ciebie exp? stuknąłeś w końcu tą laskę co mi o niej pisałeś kiedyś? xD
Chell (0:02, 21.01.17):
przywolalem po nieobecnosci od wrzesnia, nie ma za co
exp (23:47, 20.01.17):
jak tam żyjecie
Nikas (23:39, 20.01.17):
XDDDD
MaxGaming (22:52, 20.01.17):
YXE bo jak mówiłeś trzeba być miłym dla niepełnosprawnych
Nikas (22:41, 20.01.17):
Jezu w ogóle olać kwestię bana czy ostrzeżenia. xD Przeciez jak ja teraz dostaję warna to nie wiem co o tym mysleć. xD
ΨΧΞ (22:34, 20.01.17):
to dlaczego nie mam?
MaxGaming (22:15, 20.01.17):
No ale jak już YXE sam wszedł w ten temat to gdyby Nikas obraził jego matkę(w dodatku sugerując że jest lekkich obyczajów) miałby bana na pewno...
Wojo (22:13, 20.01.17):
powinieneś dostać na odmułę ale układy, układziki
MaxGaming (22:11, 20.01.17):
Masz na myśli że ja teraz zasugerowałem że złamałeś regulamin? Nie, nie zasugerowałem
ΨΧΞ (22:09, 20.01.17):
iksde xD zastanawiam sie, skoro rzekomo złamałem regulamin, dlaczego nie mam jeszcze bana?
MaxGaming (21:08, 20.01.17):
Pod tytułem "Czy jeżeli 27 latek obraża matki innych userów ci zareagują inaczej niż na gimba?" XDD
ΨΧΞ (17:50, 20.01.17):
durnyś xD
Ranmus (17:43, 20.01.17):
O wy durni, ale się daliście wciągnąć. Przecież to kolejny test socjologiczny. Nie widzicie tego?
ANtY (7:27, 20.01.17):
>długa dyskusja przed snem, że po prześwietleniu historii postów patryka jego DZIEWCZYNA (ONA MA DZIEWCZYNE, NIE ZAPOMNIJCIE!!! była zawiedziona poziomem jego wypowiedzi, po czym nastąpiły długie przeprosiny i obietnica poprawy hmm
Wojzax (2:47, 20.01.17):
YXE co to za pedalski slang i gdzie jest obiecana gra w niszczenie wieżowców?
ΨΧΞ (22:48, 19.01.17):
nudzi mi się, odpisz coś
ΨΧΞ (22:25, 19.01.17):
pamiętasz, co pisałem o mojej obietnicy grzecznego i miłego odzywania się do niepełnosprawnych? nom, to pardon, ale albo załapiesz, albo ta dyskusja nie ma sensu :*
MaxGaming (21:41, 19.01.17):
Patrząc na ilość buziaczków i czułych zwrotów to chyba Twoja dziewczyna jest bardziej męska od Ciebie?
Adriann (20:28, 19.01.17):
Nie mit, nie chodzi tam o samą ilość a nie radzenie sobie organizmu z czymśtam..;d
Ignatus (20:11, 19.01.17):
Nie wiem czy z tym testosteronem i łysieniem to nie jakiś mit.W końcu najwyższy poziom testy jest w okresie dojrzewania-kiedy każdy ma burze loków, a po 30 zaczyna gwałtownie spadać,kiedy właśnie u większości zaczyna się łysienie...
ΨΧΞ (19:56, 19.01.17):
xD oj pysiu głuptaśny, a w mikołaja też wierzysz? nie przejmuj się, każdy ma prawo nie wiedzieć - pozwól, iż przedstawię Cię łysinie androgenowej. dokształcon? nie dziękuj :*
MaxGaming (19:00, 19.01.17):
No zazwyczaj stres o tym mówię, tylko że YXE twierdzi że nie ma uczuć i się niczym nie przejmuje absolutnie xd
Adriann (18:55, 19.01.17):
Eee nie ma co się przejmować, sam mam bardzo mało włosów i wiem że niebawem będę miał kolano na głowie ale to nie oznaka stresu a zbyt dużej ilości testosteronu, możesz nie mieć włosów a dalej być takim seksualnym tyranozaurem jak ja
MaxGaming (18:48, 19.01.17):
A czy łysienie w tym wieku to nie jest głównie oznaka stresu? Czy stres nie oznacza że jednak masz emocję i dosyć bardzo się przejmujesz? xd Zrozum że udając kogoś kim nie jesteś zawsze wcześniej czy później narazisz się na śmieszność. Masz ogromną wiedzę i ogółem swoimi dobrymi stronami powinieneś się legitymować a nie udawać coś w wieku 27 lat...
Wojo (17:10, 19.01.17):
nawet moja składnia
Wojo (17:10, 19.01.17):
nie wiesz wcale, że jego nic nie rusza ?
Wojo (17:10, 19.01.17):
ah ty pysiaczku głupaśny
ΨΧΞ (16:59, 19.01.17):
nie, no jasne iż nie mam. to mój najczulszy punkt, przezeń płaczę po nocach
Ranmus (16:41, 19.01.17):
Patryk spokojnie. Nie musisz tak szczegóło tłumaczyć, że masz dystans do siebie w kwestii łysienia... masz?
ANtY (16:09, 19.01.17):
zawsze kisne xD
Ankieta
» Czy jesteś szczery odpowiadając w ankietach w Internecie?
Tak
Nie

GMCLAN to serwis o programie Game Maker i nie tylko.
Copyright © 2002-2017. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!

[ Czas generowania strony: 0.0177 sekund ] [ Liczba zapytań MySQL: 16 ]

thecrims Otserv List Otserv LyricsTown Harry Potter Serwery Gier
dev nodev