Skocz do zawartości

Strip i sprite_replace()


Kartofelek

Rekomendowane odpowiedzi

W jednym z poprzednich tematów (https://forum.gmclan.org/index.php?showtopic=15394) miałem problem ze zbyt dużym obciążeniem pamięci i zbyt długim wczytywaniem gry.

Zrobiłem więc tak, jak polecał gostek na jednej ze stron (http://glog.yoyogames.com/?p=385) - pozamienialem "duze" sprity na puste-male i w zdarzeniu room create zamieniam je na wczytane z zewnatrz. Wszystko bardzo ladnie dziala. Wczytuje sie szybko itp.

Pojawil sie jednak inny problem. Wczytac pojedynczy obrazek to nie sztuka, ale jak wczytac animacje zapisana klatka po klatce? Czyli jak stripowac wczytany plik?

W helpie napisali, że takie cuda to tylko z JPG itp - dla gifow nie dziala. I faktycznie sprawdzilem - zrobilem obrazek JPG, w ktorym klatki sa ustawione kolejno obok siebie. Tylko ze takie wczytywanie jest "na czuja" (czyzby width/liczba klatek?) i dla GIFOW nie dziala.

Pytanie wiec jak stripowac wczytany GIF, w ktorym klatki animacji nie koniecznie sa obok siebie - bo mam grafiki w ktorym klatki sa ulozone po 4-5 w rzedzie, a takich rzedow jest kilka:

 

[(',')] [('.')] [(-,-)]

[(',')] [('.')] [(-,-)]

[(',')] [('.')] [(-,-)]

 

Mogę pójść na łatwiznę i po prostu przerobić wszystkie takie grafiki na animowane gify, ale wolałbym zastosować inne rozwiązanie, bo przy takich "szachownicowych" grafikach łatwiej mi się je edytuje gdy widze na raz wszystkie klatki. Zreszta niektore sprity maja w sobie kilka typow przedmiotow, wiec animowane gify z poszczegolnymi klatkami wygladaja hmm bardzo smiesznie ^^

Odnośnik do komentarza
Udostępnij na innych stronach

Sprity są poukładane pionowo, tak?

GML
/* sprite_create_from_script(

file - plik,

x - pozycja X pierwszej klatki,

y - pozycja Y pierwszej klatki,

width - szerokość sprita,

height - wysokość sprita,

count - ilość klatek,

precide - dokładne wykrywanie kolizji,

transparent - przezroczystość,

smooth - wygładzanie,

preload - preload,

xorig - x punktu odniesienia,

yorig - y punktu odniesienia

) */

 

var _x, _y, _width, _height, _count, _file, _precide, _transparent, _smooth, _preload, _xorig, _yorig, _sprite, _surface, _i;

 

_file = argument[0];

 

_x = argument[1];

_y = argument[2];

 

_width = argument[3];

_height = argument[4];

 

_count = argument[5];

 

_precide = argument[6];

_transparent = argument[7];

_smooth = argument[8];

_preload = argument[9];

_xorig = argument[10];

_yorig = argument[11];

 

_sprite = sprite_add( _file, 0, false, false, false, false, 0, 0 );

 

_surface = surface_create( _width, _height * _count );

 

surface_set_target( _surface );

 

draw_sprite( _sprite, 0, -_x, -_y );

 

surface_reset_target();

 

sprite_delete( _sprite );

 

_sprite = sprite_create_from_surface( _surface, 0, 0, _width, _height, _precide, _transparent, _smooth, _preload, _xorig, _yorig );

 

for( _i = 1; _i < _count; _i += 1 )

sprite_add_from_surface( _sprite, _surface, 0, _height * _i, _width, _height );

 

surface_free( _surface );

 

return _sprite;

Dodaj to jako script. Argumenty jakie przyjmuje masz wypisane w komentarzu powyżej. =)
Odnośnik do komentarza
Udostępnij na innych stronach

Ciekawy skrypt, chociaz cos mi sie wydaje ze on nie rozwiazuje problemu:

1) klatki byly obok siebie i takie rzeczy jeden pod drugim wiec chyba powinny byc 2 petle a nie jedna (for( _i = 1; _i < _count; _i += 1 ))

2) No i ta metoda sprite_create_from_surface - ona chyba tworzy nowego sprita a nie dodaje image do danego sprita? Moge sie mylic.

 

Poradziłem sobie w ten sposób:

Wczytywałem gifa jako sprita do GM. Potem wybierałem opcję - [save as Strip]. Po przekonwertowaniu wiekszosci na GIF stracilem 2Mb miejsca, co uznalem za nie najgorszy wynik. Jak dodam nowe rzeczy do gry i okaze sie ze bedzie jednak lipa, to najwyzej przerobie te bmp na jpg i powinno byc "po ptokach" ^^

Odnośnik do komentarza
Udostępnij na innych stronach

Wyważanie otwartych drzwi... ^_^

 

Robisz dla każdej klatki osobny obrazek (lub. ew. jak chcesz to to do zip'a zapakuj ;P), i dodajesz następne klatki za pomocą bodajże sprite_add_from_file().

 

Nie wiem, co jest złego w tym, że będzie więcej plików.

:)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli chce ci się później to przeklepywać do skryptu, kiedy klatek jest więcej niż 20, to gratuluję.
To se robię funkcję automatycznie ładującą animację - jedyny argument to nazwa pliku. Skrypcik leci pętlą sprawdzając, czy istnieją po kolei pliki: "nazwa_0.png", "nazwa_1.png", "nazwa_2.png"...

 

No nie...?

:)

Odnośnik do komentarza
Udostępnij na innych stronach

To se robię funkcję automatycznie ładującą animację - jedyny argument to nazwa pliku. Skrypcik leci pętlą sprawdzając, czy istnieją po kolei pliki: "nazwa_0.png", "nazwa_1.png", "nazwa_2.png"...

 

No nie...?

Można też ładować te sprity do tabeli "global.sprit[∞]", ale potem trudniej się tego używa (choć może dla niektórych łatwiej) i jest to mało przejrzyste.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...