Skocz do zawartości

Nazwy backgroundow ze stringa


TO_mek
Przejdź do rozwiązania Rozwiązane przez TO_mek,

Rekomendowane odpowiedzi

Witam!

Szukam od godziny i nic mi nie wychodzi. Mam zdefiniowanych kilkanaście podkładów (poszatkowane części kilku dużych teł) o nazwach składających się z 4 cyfr:

0000

0001

0010

1000

1001

0010

itd.

Trzy ostatnie cyfry przechowywane są w tablicy (jako osobne cyfry). W poniższy kod zaczytuje (powinien) kawałki tła i skleja je w jedno duże tło. Gdy kawałki przechowywane były na dysku i wczytywane z plików png wszystko działa ok. W momencie gdy załadowałem te wycinki do exe mam problem z zamiana nazwy tych kawałków tak by to działało.

GML
ip=2;

ik=0;

for (i=ip; i>=ik; i-=1) {

TO DZIAłA BEZ PROBLEMU //tlo:=working_directory+"\room\"+string(i)+string(global.swiatlocien[i,0])+string(global.swiatlocien[i,1])+string(global.swiatlocien[i,2])+".png";

NIE DZIALA //tlo:=string(i)+string(global.swiatlocien[i,0])+string(global.swiatlocien[i,1])+string(global.swiatlocien[i,2]);

NIE DZIALA tlo_tmp:=string(i)+string(global.swiatlocien[i,0])+string(global.swiatlocien[i,1])+string(global.swiatlocien[i,2]);

tlo:=variable_global_get(tlo_tmp);

NIE DZIALA execute_string(' tlo = '+tlo_tmp);

POKAZUJE ZAWSZE NAZWE PIERWSZEGO BG //show_message(background_get_name(tlo_tmp));

NIE DZIALA //execute_string("tlo="+string(i)+string(global.swiatlocien[i,0])+string(global.swiatlocien[i,1])+string(global.swiatlocien[i,2]));

PKOAZUJE PRAWIDLOWE NAZWY TLA show_message(tlo);

background_replace(tlogm, tlo, 0, 1);

draw_background(tlogm,0-korekta,(j*213)+(j*17));

j+=1;

}

DZIALA OK //tlo:=working_directory+"\room\B000.png"

DZIALA OK tlo:=B000;//working_directory+"\room\B000.png"

background_replace(tlogm, tlo, 0, 1);

draw_background(tlogm,0-korekta,(j*213)+(j*17));

 

Próbowałem też variable_global_get i variable_local_get ale też nie zadziałało.

 

Czyli podsumowując: w jaki sposób przekształcić stringa który powstał z kawałków w nazwę zdefiniowanego tła tak by GM to zrozumiał?

Odnośnik do komentarza
Udostępnij na innych stronach

Zakładasz to w tematach dla początkujących, a wielu zaawansowanych userów nie jest w stanie rozwiązać Twoich problemów :)

Przede wszystkim: po co Ci są te backgroundy? Po co Ci ich nazwy? Może znajdzie się inne rozwiązanie tego problemu.

GML
execute_string("tlo="+string(i)+string(global.swiatlocien[i,0])+string(global.swiatlocien[i,1])+string(global.swiatlocien[i,2]))

execute_string powoduje wykonanie kodu zawartego w pierwszym parametrze jako string, następne parametry są argumentami tego kodu. Niedziwne więc, że Ci to nie działa.

Odnośnik do komentarza
Udostępnij na innych stronach

Zakładasz to w tematach dla początkujących, a wielu zaawansowanych userów nie jest w stanie rozwiązać Twoich problemów :)

Przede wszystkim: po co Ci są te backgroundy? Po co Ci ich nazwy? Może znajdzie się inne rozwiązanie tego problemu.

GML
execute_string("tlo="+string(i)+string(global.swiatlocien[i,0])+string(global.swiatlocien[i,1])+string(global.swiatlocien[i,2]))

execute_string powoduje wykonanie kodu zawartego w pierwszym parametrze jako string, następne parametry są argumentami tego kodu. Niedziwne więc, że Ci to nie działa.

 

To nie jest przyczyną (zauważ, że tam nigdzie nie ma przecinka). Ale w końcu mnie olśniło. Przyczyną jest ta linijka:

GML
background_replace(tlogm, tlo, 0, 1);

 

Wcześniej miałem ładowanie tła z plików i przy przepisywaniu na ładowanie tła z pamięci z rozpędu podmieniłem tylko parametr "tlo" ze ścieżki na nazwę zdefiniowanego bacgrounda który definiuje w resources.

Ale to nie ma prawa działać bo parametr tło to nic innego jak "fname" czyli ścieżka do pliku na dysku.

Więc wystarczy w moim kodzie usunąć tą linijkę oraz zapisać tlogm=tlo; lub od razu przypisywać pod tlogm wartości z tablicy global.swiatlocien.

 

Kocham "czeskie" błędy. Znowu kilka godzin na marne :(

Odnośnik do komentarza
Udostępnij na innych stronach

Bo robisz Bóg wie jakie kody dla jakichś prostych czynności. Sklejanie backgrounda z paru części? Do tego wystarczyło tylko posegregować pliki w folderach ( 1 folder dla 1 backgrounda a nazwy plików to porostu pojedynczy numer np. 1.png, 2.png, 3.png ) i pętlą wczytać cały folder do tablicy czy tam ds_struktury jakieś. A żeby wyświetlić wystarczyło by te tła pobrać z tablicy ( czy tam ds_* ) i odpowiednio poprzesuwać by pasowały do siebie jak układanka.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Rozwiązanie
Bo robisz bóg wie jakie kody dla jakichś prostych czynności. Sklejanie backgrounda z paru części? Do tego wystarczyło tylko posegregować pliki w folderach ( 1 folder dla 1 backgrounda a nazwy plików to porostu pojedynczy numer np. 1.png, 2.png, 3.png ) i pętlą wczytać cały folder do tablicy czy tam ds_struktury jakieś. A żeby wyświetlić wystarczyło by te tła pobrać z tablicy ( czy tam ds_* ) i odpowiednio poprzesuwać by pasowały do siebie jak układanka.

 

No nie do końca :)

 

Tło składa się z 11 poziomych pasków które mają 3 punkty przyjmujące różne stany on/off czyli w zapisie binarnym jeden pasek tła może przyjmować 8 różnych stanów (000, 001, 010, 011, 100, 101, 110, 111) czyli inaczej 2^3. Czyli dla 11 pasków to 88 kombinacji. W grze na ekranie w tym samym czasie widać zawsze 4 pasy czyli maksymalnie 2^12 kombinacji on/of (4096). Łącznie dla wszystkich 11 poziomych pasków jest 2^88 kombinacji czyli ogromnie dużo. Aby nie rysować do emerytury tych 2^88 backgroundów poszatkowałem tła na paski. Stany on/off wszystkich poziomych pasków i poszczególnych 3 punktów na pasku przechowuje tablica "swiatlocien". Z niej układam nazwę danego paska (pierwsza liczba to nr paska 0-10, kolejne 3 liczby to stany on/of punktów na danym pasku).

Proste i czytelne.

 

Początkowo zrobiłem to na ładowaniu plików z zewnątrz a obecnie "tłumaczyłem" skrypt na wczytywanie tych poszczególnych pasków z zasobów umieszczanych bezpośrednio w pliku exe bo chcę porównać działanie na słabych komputerach (prawdopodobnie gra mająca wszystko w exe wcale nie odpali na słabych maszynach więc wrócę do opcji wczytywania zasobów z plików).

 

EDIT:

Jeszcze jedna istotna uwaga. Musiałem zmienić nazwy backgroundow z cyfrowych na znakowe, teraz zamiast 0000 mam _0000 bo to powodowało, że źle mi szukało np. dla tła o nazwie 0000 szukało mi tła o nr zero a nie tła które się tak nazywało. Więc musiałem dodać prefiks do nazwy cyfrowej i wszystko działa ok.

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