Cannon Fodder Opublikowano 22 Grudnia 2009 Udostępnij Opublikowano 22 Grudnia 2009 Chciałbym stworzyć grę z widokiem od góry, w której gracz porusza się po mapie. Mapa zbudowana jest oczywiści z plików graficznych. Stworzyłem małą próbkę, w której pliki ładowane są z zewnątrz. Oto ona: TEST . Jednakże ta forma mi nie odpowiada, ponieważ jak wiadomo, im więcej plików ładowanych, tym gra dłużej się wczytuje i bardziej zapycha pamięć. Próbka ta zawiera tylko 9 kawałków mapy, docelowo ma być ich dużo więcej. Pomóżcie przerobić to tak, aby plik mapy, do zasobnika był ładowany na bieżąco, wyświetlony, a gdy nieużywany to skasowany. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Marek.S Opublikowano 22 Grudnia 2009 Udostępnij Opublikowano 22 Grudnia 2009 pliki mapy będą rozmiaru jak w przykładzie? jeśli mówisz o dużych bckgroundach to musisz się liczyc z tym, że przy przejściu na inny kafel pojawi się opóźnienie związane z załadowaniem sprita do gm. Ale to tylko w przypadkach dużych spritów. :P moim zdaniem powinieneś zrezygnować z tego ładowania w obiekcie start. Dobrym rozwiązaniem tutaj było by oparcie się na tablicach dwuwymiarowych i przypisaniu im nazw ładowanych plików graficznych. np. mapa[ 0, 0 ] = '0_0.gif' mapa[ 0, 1 ] = '0_1.gif' mapa[ 0, 2 ] = '0_2.gif' mapa[ 1, 0 ] = '1_0.gif' ... + Musiał byś zrobić sobie jakiś sztuczny event, czyli funkcję, która zwróci true, jeżeli user wejdzie na inny kafel. Wtedy GML if ( zmienil_kafel() == true ) { sprite_delete( main_bck ); //usuwa stary sprite main_bck = sprite_add ( 'gif/' + mapa[ xx, yy ], ... ... ) // ładuje nowy spr do gm przypisując jego id do zmiennej // zmienne xx, yy (xx = x div 100 // yy = y div 100), które gdzieś tam sobie wyliczasz } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 23 Grudnia 2009 Udostępnij Opublikowano 23 Grudnia 2009 Masz moje renderowanie terenu: GML xx = view_xview[0]; yy = view_yview[0]; ww = view_wview[0]; hh = view_hview[0]; rendersize = point_distance(-part, -part, ww/2, hh/2); for(i=0; i<sw; i+=1) { for(ii=0; ii<sh; ii+=1) { vis = 0; //Czy ten part jest widoczny na ekranie (czy powinien byc juz w pamieci) if(point_distance(i*part+part/2, ii*part+part/2, xx+ww/2, yy+hh/2) <= rendersize) { vis=1; } if(vis) { if(s[i, ii] < 0) //Jesli nie istnieje, a powinien { s[i, ii] = surface_create(part, part); surface_set_target(s[i, ii]); { tr_render(); } surface_reset_target(); } } else { if(s[i, ii] >= 0) //Jesli istneije, a nie powinien { surface_free(s[i, ii]); s[i, ii] = -1; } } } } Z tym, że tutaj zamiast usuwania surfejsa usuwasz sprita, a zamiast renderowania (tr_render) wczytujesz go z pliku. A tutaj malowanie: GML for(i=0; i<sw; i+=1) { for(ii=0; ii<sh; ii+=1) { if(s[i, ii] >= 0) { draw_surface(s[i, ii], i*part, ii*part); } } } Ogólny zamysł jest taki, że w zmiennej s[x, y] przechowujesz sobie informację, czy dany kawałek spritu jest wczytany (1-wczytany, 0-nie), a w jakimś skrypcie wykonywanym w end stepie/drawie sprawdzasz, które fragment powinny być widoczne na ekranie - jeśli powinien być widoczny a go nie ma wczytujesz, jeśli jest za ekranem a jest wczytany kasujesz. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Cannon Fodder Opublikowano 23 Grudnia 2009 Autor Udostępnij Opublikowano 23 Grudnia 2009 pliki mapy będą rozmiaru jak w przykładzie? jeśli mówisz o dużych bckgroundach to musisz się liczyc z tym, że przy przejściu na inny kafel pojawi się opóźnienie związane z załadowaniem sprita do gm. Ale to tylko w przypadkach dużych spritów. :P myślałem dać 500x500, może ciąć :/ ale to nie problem, najwyżej zmniejszę format Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 23 Grudnia 2009 Administratorzy Udostępnij Opublikowano 23 Grudnia 2009 To rozwiazanie które podał Marek.S jest w sumie dobre, poza jednym faktem - jak dojdziesz do brzegu grafiki, nie widać następnej. Dla tego trzeba wczytywać ich 9 - osmiem dookoła obecnej i jedną w środku po ktorej chodzisz :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Cannon Fodder Opublikowano 23 Grudnia 2009 Autor Udostępnij Opublikowano 23 Grudnia 2009 jestem jeszcze trochę niedouczony, muszę doczytać o " surface ... " ale dziękuję za podpowiedź :) To rozwiazanie które podał Marek.S jest w sumie dobre, poza jednym faktem - jak dojdziesz do brzegu grafiki, nie widać następnej. Dla tego trzeba wczytywać ich 9 - osmiem dookoła obecnej i jedną w środku po ktorej chodzisz :)zgadza się Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Marek.S Opublikowano 23 Grudnia 2009 Udostępnij Opublikowano 23 Grudnia 2009 Dla tego trzeba wczytywać ich 9 - osmiem dookoła obecnej i jedną w środku po ktorej chodziszstarałem się dopasować do zamieszczonego przykładu, na którym także jest tylko aktywny klocek :P W sumie można i też tak: GML [CREATE] mapa[ 0, 0 ] = '0_0.gif' mapa[ 0, 1 ] = '0_1.gif' mapa[ 0, 2 ] = '0_2.gif' mapa[ 1, 0 ] = '1_0.gif' //tablica mapa jest tablica przechowującą nazwy ładowanych grafik. for ( xx = 0; xx < room_width div 100; xx += 1 ) for ( yy = 0; yy < room_height div 100; yy += 1 ) { //definiowanie indexów tablicy sprite[ xx, yy ] = 0 } // sprite - jest tablicą zawierającą id wczytanych grafik oraz ich stan. [STEP] _kafel_x = x div 100 _kafel_y = y div 100 //pętla przeleci po wszystkich indexach mapy for ( xx = 0; xx < room_width div 100; xx += 1 ) for ( yy = 0; yy < room_height div 100; yy += 1 ) { if ( abs( xx - _kafel_x ) <= 1 or abs( yy - _kafel_y ) <= 1 ) { //jeżeli sprit nie jest zaladowany, zaladuj go if ( not sprite_exists( sprite[ xx, yy ] )) sprite[ xx, yy ] = sprite_add( 'gif/' + mapa[ xx, yy] .. } else { //jezeli nie ma potrzebby uzywania go, usun go. if ( sprite_exists( sprite[ xx, yy ] )) sprite_delete( sprite[ xx, yy ] ) sprite[ xx, yy ] = 0 } } pisane z pamięci. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Cannon Fodder Opublikowano 23 Grudnia 2009 Autor Udostępnij Opublikowano 23 Grudnia 2009 No i nie wiem co dalej: TEST2 :( zapętliłem się i pamięć się zapycha Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Cannon Fodder Opublikowano 28 Grudnia 2009 Autor Udostępnij Opublikowano 28 Grudnia 2009 mój problem nadal nie rozwiązany :/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rudy Opublikowano 29 Grudnia 2009 Udostępnij Opublikowano 29 Grudnia 2009 Proszę bardzo Myślę, że komentarzy jest aż za dużo. Pozostaje jedynie problem przechodzenia pomiędzy kaflami (to co gnysek napisał. Jeśli kafle będą większe, niż view, wystarczą cztery. Jeśli będzie z tym większy problem, napisz. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Marek.S Opublikowano 29 Grudnia 2009 Udostępnij Opublikowano 29 Grudnia 2009 musisz mi dorobić jeszcze perę graficzek, abym mógł sprawdzić ten mój drugi sposób ;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę