Skocz do zawartości

Algorytm ładowania spritów o podobnej nazwie


Nirvan

Rekomendowane odpowiedzi

Kombinuje z algorytmem na ładowanie spritów w mojej grze izometrycznej gdzie nazwy spritów różnią się tylko o liczby .

 

Zrobiłem takie coś :

 

GML
for(r=0;r<=180;r+=45;)

{

real(r);

p=variable_global_get(argument0+argument1+r);

p=sprite_add("data/"+argument0+"/"+argument1+r+"_strip"+argument2+".png",argument2,argument3,argument4,argument5,argument6);

string(r);

}

 

//skrypt do użycia wyglądałby tak

sprl('we','obr',4,0,0,90,117);

 

//i chce z niego uzyskać to :

(zaladować 5 spritow)

 

global.weobr0=sprite_add("data/wek/obr0_strip4.png",4,0,0,90,117);

global.weobr45=sprite_add("data/wek/obr45_strip4.png",4,0,0,90,117);

global.weobr90=sprite_add("data/wek/obr90_strip4.png",4,0,0,90,117);

global.weobr135=sprite_add("data/wek/obr135_strip4.png",4,0,0,90,117);

global.weobr180=sprite_add("data/wek/obr180_strip4.png",4,0,0,90,117);

 

Ale wywala mi błąd:

 

GML
Error in code at line 10:

p=variable_global_get(argument0+argument1+r);

^

at position 44: Wrong type of arguments to +.

 

I nie wiem za bardzo jak to rozwiązać aby działało poprawnie, niby zrobiłem to real® ale nie dziala :| .

 

 

Dzięki z góry

Odnośnik do komentarza
Udostępnij na innych stronach

real(r);

-To nie daje żadnego rezultatu ta funkcja zwraca liczbę z tekstu a string odwrotnie

Wiem już, przed chwilą zauważyłem ;)

 

Wrong type of arguments zawsze oznacza, że próbujesz stringa konkatenować z realem, lub dodać do reala string. Czyli w sumie to samo.

 

Właśnie nie wiem jak zrobić żeby z tego r dodalo do reala jego liczbe jako real

Odnośnik do komentarza
Udostępnij na innych stronach

ok, tamtego błędu juz mi nie pokazuje ale:

 

GML
p=sprite_add("data/"+argument0+"/"+argument1+string(r)+"_strip"+argument2+".png",argument2,argument3,argument4,argument5,argument6);

^

at position 66: Wrong type of arguments to +.

 

znowu

Odnośnik do komentarza
Udostępnij na innych stronach

ale nie rozumiesz :P

 

te liczbe 45 dalem jako przykład wartości jaką przyjmie r za którymś razem.

Ja chce że gdy będzie wykonywana instrukcja, to żeby wartość r zmieniala się w stringa. jak r ma 45 to r ma sie zmienić w "45" itd

Odnośnik do komentarza
Udostępnij na innych stronach

Nie. Nie dam Ci gotowego kodu.

 

GML
for(r=0;r<=180;r+=45;)

{

real(r); //Co to ma być? real zwraca wartość z którą nic nie robisz. Otrzymuje tekst i zwraca liczbę. Wywal to.

p=variable_global_get(argument0+argument1+r); //argument1 lub argument2 najwyraźniej jest stringiem, a r liczbą. Nie możesz dodawać tekstu do liczby bo to nie ma sensu. string() zamieni Ci liczbę na tekst.

p=sprite_add("data/"+argument0+"/"+argument1+r+"_strip"+argument2+".png",argument2,argument3,argument4,argument5,argument6); //To samo co wyżej.

string(r); //Ponownie, Co to ma kurde być? String to funkcja. ZWRACA WARTOŚĆ.

}

Odnośnik do komentarza
Udostępnij na innych stronach

Nie. Nie dam Ci gotowego kodu.

 

GML
for(r=0;r<=180;r+=45;)

{

real(r); //Co to ma być? real zwraca wartość z którą nic nie robisz. Otrzymuje tekst i zwraca liczbę. Wywal to.

p=variable_global_get(argument0+argument1+r); //argument1 lub argument2 najwyraźniej jest stringiem, a r liczbą. Nie możesz dodawać tekstu do liczby bo to nie ma sensu. string() zamieni Ci liczbę na tekst.

p=sprite_add("data/"+argument0+"/"+argument1+r+"_strip"+argument2+".png",argument2,argument3,argument4,argument5,argument6); //To samo co wyżej.

string(r); //Ponownie, Co to ma kurde być? String to funkcja. ZWRACA WARTOŚĆ.

}

 

 

Już wtedy to pozmieniałem wszystko, teraz to wyglądało tak :

 

GML
for(r=0;r<=180;r+=45;) {

p=variable_global_get(argument0+argument1+string(r));

p=sprite_add("data/"+argument0+"/"+argument1+string(r)+"_strip"+argument2+".png",argument2,argument3,argument4,argument5,argument6);

}

 

I itak wywala ten sam błąd

wyżej podalem ze argument0 to 'we' a 1 to 'obr'

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
wyżej podalem ze argument0 to 'we' a 1 to 'obr'

Nie, on twierdzi, że arg0 i arg1 to stringi, ale nic nie mówi o arg2 na którym wywala błąd.

 

 

Edit:

 

Wrong type of arguments w przypadku "tekst"+zmienna zawsze oznacza, że zmienna to liczba, wiec trzeba ją za pomocą string() zwrócić jako string.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

https://gmclan.org/index.php?czytajart=68

 

Polecam fragment:

 

Należy jednak zauważyć, że a=5 to nie to samo co a='5', gdyż tekst nie jest liczbą i na odwrót i tych dwóch typów nie wolno bezpośrednio ze sobą porównywać.

 

Do zamiany liczby w tekst służy funkcja string()....

Odnośnik do komentarza
Udostępnij na innych stronach

ok, działa, nie wiedzialem że to wywala pod argument2 :/ sory

 

Ale itak nie tworzy tych zmiennych globalnych

 

powinny powstać:

 

global.weobr0=sprite_add("data/wek/obr0_strip4.png",4,0,0,90,117);

global.weobr45=sprite_add("data/wek/obr45_strip4.png",4,0,0,90,117);

global.weobr90=sprite_add("data/wek/obr90_strip4.png",4,0,0,90,117);

global.weobr135=sprite_add("data/wek/obr135_strip4.png",4,0,0,90,117);

global.weobr180=sprite_add("data/wek/obr180_strip4.png",4,0,0,90,117);

 

A nie ma ich, ale grafiki sie ładują

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
GML
p=sprite_add("data/"+argument0+"/"+argument1+string(r)+"_strip"+argument2+".png",argument2,argument3,argument4,argument5,argument6);

^

at position 66: Wrong type of arguments to +.

 

Przecież znak ^ jest dokładnie pod argument2.

 

A globalnych nie tworzy, bo variable_local_get nie zwraca referencji, a wartośc zmiennej. Zresztą gdyby to nawet była referencja, to znak = ją kasuje. Czyli twój kod w uproszeniu wygląda tak:

 

GML
p = <dowolna wartosc>;

p = sprite_add(....); // poprzednia wartosc zostaje skasowana</span>

 

no i w p masz identyfikator sprita ;)

 

Powinno być tak:

 

GML
p = sprite_add(....);

variable_global_set(string(argument0)+string(argument1)+string(r),p);

Odnośnik do komentarza
Udostępnij na innych stronach

Powinno być tak:

 

GML
p = sprite_add(....);

variable_global_set(string(argument0)+string(argument1)+string(r),p);

 

Ok dzięki wielkie :) działa jak powinno .

 

Edit:

 

Mam teraz :

Robiłem to na pustym projekcie i wszystko dzialalo dobrze aż nie dodalem zwyklego sprita guzikiem 'create a sprite' . Jeśli istnieje ten sprite pod bylejaką nazwą to wywala mi bład że 'unkown wariable p' :/

GML
for(r=0;r<=180;r+=45;) {

if not sprite_exists(variable_global_get(argument0+argument1+string(r)))

p=sprite_add("data/"+argument0+"/"+argument1+string(r)+"_strip"+string(argument2)+".png",argument2,argument3,argument4,argument5,argument6);

variable_global_set(argument0+argument1+string(r),p); }

 

Zrobiłem również skrypt na usuwanie spritów :

 

GML
for(r=0;r<=180;r+=45;)

{

p=variable_global_get(argument0+argument1+string(r));

if sprite_exists(p){sprite_delete(p);}

}

 

Ale coś jest nietak bo gdy załaduje grafiki tamtym skryptem, potem odładuje go tym to usówa z pamięci tylko połowę wszystkich grafik, gdy zaladuje grafiki ponownie i odladuje to wtedy dopiero rozładowywuje je wszystkie, ale do wielkości jaka zostala po pierwszym zaladowaniu .

 

Czyli gra bez niczego zaladowanego zżera mi 13,8 pamięci

po pierwszym zaladowaniu grafik zżera 19

po pierwszym odładowaniu zżera 16,7

po nastepnym zaladowaniu zżera 19,1

po odladowaniu zżera znowu 16,7

 

czyli za pierwszym razem zaladowalo grafiki dwa razy i nie da sie juz ich usunąć, ale dlaczego tak zaladowalo?

Odnośnik do komentarza
Udostępnij na innych stronach

Ok dzięki wielkie :) działa jak powinno .

 

Edit:

 

Mam teraz :

Robiłem to na pustym projekcie i wszystko dzialalo dobrze aż nie dodalem zwyklego sprita guzikiem 'create a sprite' . Jeśli istnieje ten sprite pod bylejaką nazwą to wywala mi bład że 'unkown wariable p' :/

GML
for(r=0;r<=180;r+=45;) {

if not sprite_exists(variable_global_get(argument0+argument1+string(r)))

p=sprite_add("data/"+argument0+"/"+argument1+string(r)+"_strip"+string(argument2)+".png",argument2,argument3,argument4,argument5,argument6);

variable_global_set(argument0+argument1+string(r),p); }

"unknown variable p" oznacza, że zmienna p nie istnieje, a próbujesz się gdzieś do niej odwołać. Widzimy, że w powyższym kodzie ją tworzysz. Ale... pod pewnym warunkiem! Jeśli nie istnieje jakiś sprite co się kryje pod:

GML
variable_global_get(argument0+argument1+string(r))

Wychodzi na to, że zmienna której wartość pobierasz ma wartość równo identyfikatorowi tego nowego sprite'a! I jego nazwa nie ma tu kompletnie nic do rzeczy. Bo każdy sprite ma przypisaną pewną liczbę-identyfikator, której zmienić nie można. I tak naprawdę za każdym razem gdy w kodzie piszesz nazwę sprite'a to tak jakbyś napisał tę liczbę. Bo nazwa to taka jakby stała przechowująca tę liczbę. Tak samo jest ze wszystkimi innymi zasobami: roomami, obiektami, dźwiękami, pathami...

 

Zrobiłem również skrypt na usuwanie spritów :

 

GML
for(r=0;r<=180;r+=45;)

{

p=variable_global_get(argument0+argument1+string(r));

if sprite_exists(p){sprite_delete(p);}

}

 

Ale coś jest nietak bo gdy załaduje grafiki tamtym skryptem, potem odładuje go tym to usówa z pamięci tylko połowę wszystkich grafik, gdy zaladuje grafiki ponownie i odladuje to wtedy dopiero rozładowywuje je wszystkie, ale do wielkości jaka zostala po pierwszym zaladowaniu .

 

Powód pewnie jest taki jak powyżej.

Spróbuję ogarnąć co ty masz w tych swoich argumentachX i ewentualnie editnę, bo pewnie masz tam jakieś brednie.

 

 

EDIT:

A weź spróbuj po prostu w tym pierwszym objąć te 2 instrukcje w nawiasy klamrowe {}. Bo ten if ci obejmuje tylko pierwszą linijkę, a drugiej już nie i stąd błąd.

Odnośnik do komentarza
Udostępnij na innych stronach

sprl('we','obr',4,-1,0,90,117);

 

4 to imagenumber, -1,0,90,117 to są zmienne od sprite_add czyli removeback,smooth,xorigin i yorigin

 

edit:

 

dalem te nawiasy klamrowe i jest ok, dzięki

(kurde zawsze jakieś glupie błędy zrobie ;|)

 

ale problem z pamięcią nie rozwiązany, calyczas laduje jakby podwójnie za pierwszym razem

A skrypt na odładowywanie dziala poprawnie ponieważ jak zamiast tego co w nim jest dam :

 

sprite_delete(global.weobr0);

sprite_delete(global.weobr45);

sprite_delete(global.weobr90);

sprite_delete(global.weobr135);

sprite_delete(global.weobr180);

 

to itak pamięć się zwalnia tylko do 16,7

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