Skocz do zawartości

wczytywanie obrazów


Rekomendowane odpowiedzi

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

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

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

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

  • Administratorzy

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

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

Dla tego trzeba wczytywać ich 9 - osmiem dookoła obecnej i jedną w środku po ktorej chodzisz
starał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

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