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: 80, userów: 1, ukrytych: 0
PatrykPlayingPOLSKA

0 użytkownik(ów) na gmczacie i 0 bot(ów)
Shoutbox
I am vader (4:12, 25.02.17):
W życiu nie korzystałem, zrezygnowałem kompletnie z klocków jakieś 8-9 lat temu.
XBlacKX (0:09, 25.02.17):
wiesz gdzie mógłbym dostać jakieś? zwiedziłem cały internet i tak jak kiedys było tego od cholery teraz tylko jednego liba znalazlem i to na gmclanie
I am vader (23:58, 24.02.17):
rozszerzenia Drag and drop, ale nie wiem ktore mogles miec zainstalowane
XBlacKX (23:17, 24.02.17):
kiedyś miałem taką paczkę i miałem tam gdzie "move, main1 main2 draw" itd dodatkowe zakładki z różnymi funkcjami
XBlacKX (23:16, 24.02.17):
jak się nazywały te paczki z dodatkowymi "ikonkami" co można przeciągać?
I am vader (22:01, 24.02.17):
Zrobilbym ale tak bardzo nie mam sily nic robic..
I am Lord (21:17, 24.02.17):
zobacz newsa
I am Lord (21:17, 24.02.17):
nie miała być 24
Threef (20:04, 24.02.17):
I temat nie założony na forum!
Threef (20:03, 24.02.17):
Eee... a nie miała być 24h?
Threef (19:58, 24.02.17):
Mam nadzieję że fajny temat!
Jakim (18:10, 24.02.17):
Chcę koncert.
Threef (17:01, 24.02.17):
Gdyby ktoś mi to puścił na imprezie to uznałbym to za jakieś "garage experimental rap"
Threef (17:00, 24.02.17):
No prawie "dobrze".
Nikas (16:32, 24.02.17):
O kurwa. xDDDD Brzmi jak gruba choroba psychiczna i dobre dragi.
I am vader (14:56, 24.02.17):
Janusz normalnie
Wojo (14:53, 24.02.17):
www.youtube.com...h?v=7hCDXHDRnEY co jak co ale to jest całkiem dobre
Wojo (14:51, 24.02.17):
aha to dobrze
Wojo (14:51, 24.02.17):
rozumiem*
Wojo (14:50, 24.02.17):
rozumiesz, że to pytanie retoryczne
I am vader (14:50, 24.02.17):
Łukasz Grodzki to nei był czasem Paqoo?
Wojo (14:50, 24.02.17):
ta muzyka jest doskonała, a przerywniki z tekstem dopełniają ją całkowicie
Wojo (14:47, 24.02.17):
www.youtube.com...h?v=TftPHS6lkoc wyobraź sobie, że jesteś zbombiony i tego słuchasz
Rakson (8:35, 24.02.17):
Ok, doczytalem ze mozna powiedzcie mi tylko czy da sie jeszcze jakos zapisac, oraz czy pygame jest uznawany jako zakazany silnik do uzywania
Rakson (8:30, 24.02.17):
A gry na lige24 musza byc pisane w gamemakerze?
Uzjel (17:59, 23.02.17):
*Pierwsza od dawna
Threef (17:12, 23.02.17):
Ej ale to nie jest pierwsza liga z nagrodami.
I am Lord (16:28, 23.02.17):
zwycięzca pierwszy
I am Lord (16:25, 23.02.17):
Aha bo uzjel nie napisał, wybieracie z listy co chcecie w kolejności
Sutikku (13:22, 23.02.17):
myślałem, że ta liga to już dzisiaj, no tak
Wojo (11:52, 23.02.17):
Spoko akcja Lord
Exigo (10:23, 22.02.17):
PIONA.
I am Lord (22:58, 21.02.17):
oooo w dooma grywasz, przybij pionę
Exigo (22:10, 21.02.17):
O, nie wiedziałem że jest grupa GMC na Steamie. Dołączyłem.
I am Lord (21:48, 21.02.17):
będzie jedna osoba to też wygra
Sutikku (20:52, 21.02.17):
nagrody dla najlepszych trzech miejsc. Czyli jednak obstawiamy, że będzie więcej niż trzy prace xd
Uzjel (20:34, 21.02.17):
Dzięki Zachęcam do dołączenia steamcommunity....groups/GMPolska
I am Lord (20:27, 21.02.17):
ale nei zdąrzyłem kliknąć, szybko się schowało
I am Lord (20:26, 21.02.17):
właśnie też mi wyskoczyło jak grałem
Chell (20:24, 21.02.17):
swietny pomysl z powiadomieniem na steamie
Uzjel (20:22, 21.02.17):
W piątek liga z nagrodami
ΨΧΞ (17:44, 21.02.17):
plus: ja mam 8, nie 10
ΨΧΞ (17:44, 21.02.17):
żeby przypadkowo nie łapał inputu - jak chcę searcha zrobić, to klikam klawisz Windy i wpisuje czego chce - bang ;>
Danielus (14:35, 21.02.17):
@yxe jak można mieć wyłączonego searchbara? Najlepszy feature jaki win 10 ma do zaoferowania :f
I am vader (10:26, 21.02.17):
Zapewne oba. ale DS'y są zajebiste
Wojo (10:24, 21.02.17):
albo coś bierzecie albo to przejaw głębokiej deprseji
gnysek (10:21, 21.02.17):
<rap>Używam ds_listy, jestem zajebisty, aha aha... bum tsss tss, bum tss tss </rap>
Wojo (10:02, 21.02.17):
aha to spoks
ΨΧΞ (10:00, 21.02.17):
to nie samo menu, tam pod spodem działa podstawa komunikacji z serwerem (obsługa sklepu części, kont użytkowników, sesje) - nim zrobię kolejną część flow klienta, musze dopisać ficzur też po stronie backendu, dlatego więcej póki co dzieje się po tej niewidocznej stronie zwanej serwerem
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.01678 sekund ] [ Liczba zapytań MySQL: 16 ]

thecrims Otserv List Otserv LyricsTown Harry Potter Serwery Gier
dev nodev