Skocz do zawartości

draw_sprite nie wyswietla wszystkich sprite'ow


egame

Rekomendowane odpowiedzi

Zacznę od tego, że się przywitam bo jestem tu nowy i nadmienię, że bawię się tym [ aż boję się użyć tego słowa :) ] programowaniem od kilku dni w Game Maker 8 bo chcę aby docelowa aplikacja działała na starych sprzętach z DirectX8, ale przejdźmy do rzeczy.

 

Mam problem z draw_sprite. Mam 64 pola wypełnione sprite'ami i na to "nalozone" znowu 64 pola ze sprite'ami aby zakryly te pierwsze. Na tych niewidocznych na 16 z nich jest cyfra "2" a na reszcie cyfra "1" chcę aby po kliknięciu w jakiekolwiek pole na którym jest cyferka "2" odkryły się wszystkie pola z tą cyferką czyli aby pokazały się wszystkie takie sprite'y.

 

Używam składni:

 

for(kb=0;kb<ds_list_size(global.lista_x);kb+=1)

{ draw_sprite(sprite_index,2,ds_list_find_value(global.lista_x,kb),ds_list_find_va

lue(global.lista_y,kb)); }

 

Oczywiście wcześniej korzystam z list w których przechowywane są wartości pól oraz współrzędne x i y tych 16 pól, które mają wartość "2" - wszystko macie ładnie na zrzutach ekranu po lewej w formie tekstowej z debuga.

 

Nie wiem dlaczego ale po kliknięciu myszką w jakieś pole odkrywa tylko te pola które w powyższej pętli mają współrzędne x i y mniejsze lub równe aktualnemu położeniu myszki podczas kliknięcia.

 

Wiem, że ciężko to sobie wszystko wyobrazić więc daje linki do zdjęć z dwóch zrzutów ekranu - na których dużymi żółtymi kropkami zaznaczyłem pola, które nie zostały odkryte a powinny. I dodaję jeszcze spakowany cały kod mojej pseudo aplikacji :)

 

Pliki: obrazek nr 1 - obrazek nr 2 - kod i zdjecia

 

 

Pozdrawiam i z góry dziękuję za odpowiedź.

Odnośnik do komentarza
Udostępnij na innych stronach

Popełniasz duży błąd w sposobie jaki to zaprogramowałeś.

Mianowicie rysowanie wszystkich odkrytych numerów masz w obj_glowny których jest w grze tyle ile kwadratow( dobrze myślę tak? )

Teraz każesz każdemu obiektowi rysować wszystkie odkryte "2" jeśli się na niego kliknie.

Teraz musisz wiedzieć że jeśli masz wiele takich samych obiektów to ich akcje wykonywane sa w kolejności w jakiej te obiekty zostały utworzone.

Tak więc załóżmy że mamy tylko dwa kwdraty( oba z wartością 2 ). Klikamy na pierwszego z nich i nakazujemy mu wyswietlenie wszystkich dwojek, co on poprawnie wykonuje, ale ułamek sekundy później drugi z kwadratow wykonuje swój kod, a że on nie został kliknięty to znów ustawia swoją grafikę na zakrytą. Wcześniejsze kwadraty nie są zakrywane bo one swoje kody już wykonały zanim zamalował je ten kliknięty. Dlatego wygląda to tak jakby odsłaniały sie do pozycji myszki.

 

Najlepiej by było aby za rysowanie odpowiadał jeden obiekt, a nie każdy z osobna, jednak jest to dla osoby początkującej dosyć trudne, dlatego trzeba powiadomic resztę obiektów o tym że nastapilo klikniecie na dwójke.

 

Aby to zrobić wystarczy zamienic zmienną "pokaz" na "global.pokaz" wtedy zmienna ta bedzie wspolna dla wszystkich obiektow

Odnośnik do komentarza
Udostępnij na innych stronach

Strasznie biedny sposób na zrobienie czegoś tak prostego. W tym co pokazałeś chodzi o problemy z depthem obiektów.

 

FIX:

GML
draw_sprite(sprite_index,image_index,x,y)

if pokaz = true

then

{

sprite_index = spr_przod; image_index = wartosc;

if wartosc=2 then

{depth = -10;

// Odkryj wszystkie pola (sprite) z wartoscia "2"

// ilosc takich pol to ilosc wpsolrzednych x z listy global.lista_x

// aktualnie ustawione na sztywno - jest 16 takich pol.

for(kb=0;kb<ds_list_size(global.lista_x);kb+=1)

{ draw_sprite(sprite_index,2,ds_list_find_value(global.lista_x,kb),ds_list_find_value(global.lista_y,kb)); }

}

}

else

{depth = 0;

sprite_index = spr_tyl; image_index=global.kolor_tla

}

 

Ale ja bym napisał to od nowa bo to co zrobiłeś jest strasznie nieoptymalnym dziadostwem.

 

Edit: O Danielus dobrze prawi :P

Odnośnik do komentarza
Udostępnij na innych stronach

Wiem, wiem, dziadostwo, jest to mój pierwszy raz i wiem, że będę musiał to napisać od nowa(to co ukazałem to była tylko 1/5 kodu bo nie chciałem Was zaśmiecać całością, ale mam jeszcze kilka rzeczy do opracowania i jak wszystko będzie działać i zapoznam się z poradnikami na "gmclan" to skleje to wszystko od nowa do kupy.

 

Wielkie dzięki za rozwiązanie - pomogło skorzystanie z depth. Tak tylko dodam że chodziło mi aby się wszystkie ukazaly a potem są one wszystkie usuwane, ale usuwanie działało mi dobrze. " {

position_destroy(ds_list_find_value(global.lista2,kb),ds_list_find_value(global.

lista3,kb));}

 

Pozdrawiam i jeszcze raz dzięki za błyskawiczną pomoc

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