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
72 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 68, userów: 4, ukrytych: 0
owyn, Jasonamawn, Grela, ediepl

0 użytkownik(ów) na gmczacie i 0 bot(ów)
Shoutbox
asdfMaciej (15:28, 30.04.17):
wow, to forum jeszcze żyje
PatrykPlayingPOLSKA (12:29, 30.04.17):
Tylko jedna osoba może zrobić tą captche,tylko że ta osoba bardzo rzadko wchodzi.
Wojo (11:54, 30.04.17):
każdy ma to w dupie jak widać
MaxGaming (10:56, 30.04.17):
A nikt nie pomyślał że sęk w tym że ich w ogóle nie powinno być? Xd może niech ktoś captcha ogarnie albo jakieś inne zabezpieczenie
Wojo (10:40, 30.04.17):
no bo to mega chujowo wygląda kiedy wchodzisz na jeszcze jakoś żyjące forum a wygląda jak opuszczone a boty są w stanie sobie siedzieć nawwet kilka godzin
Chell (9:42, 30.04.17):
no i do teraz nie wiem w którym miejscu te kilka botów które się uchowają może komukolwiek przeszkadzać
Chell (9:40, 30.04.17):
generalnie co ty masz w głowie xD
Ignatus (8:41, 30.04.17):
Flashek jak tam Twój projekt ukradziony w 2004r?
I am vader (23:54, 29.04.17):
Flashek, widzisz kilka botow dziennie i narzekasz ze nikt ich nie banuje, a tak naprawde jest ich tutaj kilkanascie dziennie.
Wojo (23:36, 29.04.17):
Serio ja tu wbijam dość często chociażby z nudów na te kilka sekund i jak podczas dwóch albo trzech godzin na forum robi się taki syf to znak że moderatorów potrzeba
Flashek (23:33, 29.04.17):
Pracuję po 12 godzin na zmianie i nie ma najmniejszego problemu żeby zerknąć dwa razy na 12 h. Administracja tutaj to jakas masakra. Potrzebni są modzi do banowania
Ignatus (22:51, 29.04.17):
moda mu!
Ignatus (22:51, 29.04.17):
300 albo jeden Wojo
I am vader (21:57, 29.04.17):
Trzeba by z 300 zeby zawsze ktos byl online, ludzie maja swoje zycia.
Wojo (21:13, 29.04.17):
nie byłbym zły gdyby był tylko jeden moderator
I am vader (19:54, 29.04.17):
Nie nasza wina ze bot zrobil 15 tematow w 2 godziny.
Jaklub (19:05, 29.04.17):
demo roku
Wojo (18:56, 29.04.17):
hura możemy oglądać walke Wladimira Klitschko dzięki botom, których moderatorzy nawet nie kasują.
Dester (15:37, 29.04.17):
Ktoś ma pomysł jak napisać takie przewidywanie kolizji jak laser w Steamworld Heist i na tego podstawie sprawdzać trafienie?
Flashek (12:25, 29.04.17):
Tytaj adminów brakuje no ale pies ogrodnika samemu nie zje drugiemu nie odd
en_6280 (12:04, 29.04.17):
nie ma jak uczyć się vulkana gdy karta graficzna nie obsługuje
PatrykPlayingPOLSKA (11:51, 29.04.17):
keek te reklamy
Wojo (11:37, 29.04.17):
No a moderatorzy wstają o czternastej po ciężkim dniu nic nierobienia
Dester (11:25, 29.04.17):
BOTY WYSYŁAJĄ MI PRYWATNE WIADOMOŚCI HELP
Fervi  (23:59, 28.04.17):
Trzeba było brać jak było za free
Flashek (22:25, 28.04.17):
Witam, ma ktoś może niepotrzebne chivlary medieval warfare na steamie ?
Grela (18:18, 28.04.17):
niewazne wlasnie stoje na stoisku frozen district XD
Grela (18:17, 28.04.17):
czy jakis gmclan ma stoisko na indykach na pyrkonie?
Danieo (15:44, 28.04.17):
A tego to nie wiem, nigdy nie używałem
Danielus (15:06, 28.04.17):
Boo nie jest już oficjalnie wspierany chyba
Danieo (11:58, 28.04.17):
W unity kod piszesz w c#, JavaScript albo Boo
Danieo (11:57, 28.04.17):
Nie ma ani własnego ani nie programuje się w C++
nowy_user (10:53, 28.04.17):
Rozuumiem , a tak btw, czy Unity ma swoj własny język czy programuje się tam w c++?
Wojo (10:34, 28.04.17):
Unreal engine się fajnie prezentuje ale faktycznie jak trochę poczytałem to sprawia trochę problemów jeśli chcielibyśmy coś wrzucić na rynek
Wojo (10:32, 28.04.17):
No i brak większego supportu 3D w gmie też bardzo boli ale i tak się trochę sytuacja w nim poprawila
Wojo (10:30, 28.04.17):
I z tego co czytałem to gm pomimo supportu dla html5 ma nadal z nim mnóstwo problemów co równa się tylko z konwersja teoretyczną nie mająca pokrycia w rzeczywistości
Wojo (10:29, 28.04.17):
Masz tutaj trochę racji ale i tak unity jest znacznie popularniejsze od gma.
nowy_user (10:05, 28.04.17):
Czy ja wiem Wojo, Spójrzmy jak wielu ludzi tworzy dziś komercyjne gry w GM, otwierają się przecieżfirmy, które tworzą gry tylko w GMie. 10 lat temu to było nie do pomyślenia, jak ktoś zarobił 10$ na grze zrobionej w GM to już był happy.
Danielus (9:56, 28.04.17):
Najprościej założyć discorda. Staje się to coraz bardziej popularne jeśli idzie o chat
Wojo (9:36, 28.04.17):
Właśnie strona jest git ale game maker stracił mocno na znaczeniu w ciągu ostatnich lat.
Chell (9:00, 28.04.17):
uważam że tutaj każdy ma dość wartościowej wiedzy oraz jedną sprawą portalu jest brak nowej strony również brak naliczania postów w valhalli
Wojo (8:56, 28.04.17):
Gmclan rozwija się samodzielnie
nowy_user (8:40, 28.04.17):
Szkoda że GM czat nie działa. Przydałoby się takie miejsce gdzie moglibyśmy wymienić się wartościową wiedzą oraz porozmawiać o sprawach portalu i w końcu zdecydować w którym kierunku GMclan będzie się rozwijał.
Wojo (8:21, 28.04.17):
Tinychat zawsze zdycha
Chell (7:13, 28.04.17):
hmm, a może by tak tinychat??
Chell (7:13, 28.04.17):
ale zamkneli*
Chell (7:12, 28.04.17):
Simian - kiedyś był gmczat się zamknęli bo doszli do tych samych wniosków co ty ;p
Decretus (2:02, 28.04.17):
Witam serdecznie, zachęcam do wzięcia udziału w konkursie!
Adriann (1:17, 28.04.17):
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.01698 sekund ] [ Liczba zapytań MySQL: 16 ]

thecrims Otserv List Otserv LyricsTown Harry Potter Serwery Gier
dev nodev