Skocz do zawartości

Sprawdzanie odleglosci i pobieranie instancji


Rekomendowane odpowiedzi

Witam. Zaimplementowalem w swojej grze dynamiczna mgle. Polega to na tym, ze tworze w grze obiekty, ktore sprawdzaja odleglosc komandosa od siebie i w zaleznosci ustawiaja swoje image_alpha. Dla wiekszej realnosci dodalem collision_line, chociaz zauwazylem, ze to dosc wolna funkcja.

 

var dist;
if (instance_exists(obj_commando)) {
    dist = distance_to_object(obj_commando)
    if (dist<100) {
        image_alpha = (100-(100-dist))/100
    }
    if (collision_line(x,y,obj_commando.x,obj_commando.y,obj_podlogaSolid,false,false)) {
        image_alpha = 1
    }
} else {
    image_alpha = image_alpha + 1;
    if (image_alpha>1) image_alpha = 1;
}
alarm[0] = global.jakCzestoAktualizowacMgle;

 

 

Moje pytanie jest takie: Taki kod ma zaimplementowana kazda instancja mgly, wiec dosc sporo obliczen to zabiera (bo takich instancji jest tyle ile kratek 16x16). Jest mozliwosc by to nie instancje a sam komandos pobieral odpowiednie kawalki mgly? Funkcja typu - "pobierz TYLKO elementy znajdujace sie w polu widzenia (kolko np o r=100)"

Probowalem z collision_circle, czy distance_to_object, ale nie za bardzo mi to wychodzilo. Robilem to tak, ze wczesniej wykonywalem petle po instancjach mgly (instance_count) i pobieralem kazdy taki obiekt. Potem podstawialem go do tego collision_circle, ale to dzialanie nie jest takie jak w powyzszym zdaniu (brakuje tego TYLKO) ^^

 

 

mgla.gif

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm, kiedys uzylem tej metody na mgle w swojej pierwszej gierce i... musze przyznac ze to byl niewypal - najlepiej zrobic taka mgle na surfaces, i jesli chcesz zachowac podobna metode to wykonywac te obliczenia i rysowac petla poszczegolne kwadraciki mgly w tej petli, tylko w obszarze viewa. To znacznie zwiekszy predkosc gry.

Odnośnik do komentarza
Udostępnij na innych stronach

Albo zrób tak, jak masz teraz, ale walnij to do osobnego wątku... :P (oczywiście, jeśli bohater się nie rusza to mgła nie oblicza się po raz kolejny).

 

Co do tematu:

GML
with(obj_mgla)

{

if(point_distance(obj_hero.x, obj_hero.y, x, y) <= 100)

{

//kod

}

}

Choć dodam tylko, że to niewiele da... nie w GM'ie... :P

Odnośnik do komentarza
Udostępnij na innych stronach

Próbowałem wczoraj z tym surface ale mi w ogole nie wychodzilo. Pewnie zapytam pana Google. Do tej pory rysowało mi śmiecie...

 

Pierwsze co mi świta:

- Podzielenie romu na siatkę (pewnie cos z room_width DIV cos tam)

- pobranie pierwszej "komorki grida" ktorego fragment jest w gornym rogu view (tutaj pewnie bede musial pobrac kawalek za, bo sa emitery i swiatlo moze byc emitowane poza viewem)

- pobranie reszty komorek

- a reszta podobna jak w tamtym, czyli sprawdzanie kolizji tego grida z komandosem itp.

- po obliczeniach i narysowaniu na surface wrzuta na ekran ^^

 

O ile to bedzie szybsze tego nie wiem, bo w tamtym deaktywowalem obiekty mlgy poza viewem...

 

Swoja droga - znacie inne sposoby tworzenia oswietlenia? Chociaz szczerze mowiac ten mi calkiem odpowiada bo daje taki klimat starych gierek ^^

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