Skocz do zawartości

Skrypt - "zaawansowany lighting"


Rekomendowane odpowiedzi

Więc znalazłem na necie bardzo fajny, płynne działający "silnik" dla "latarki".

 

https://drive.google.com/file/d/0B5tuOPULqE...&authuser=1

http://www.masterxy.bplaced.net/download.php (wersja nowsza, ma mniej skryptów)

 

I wszystko byłoby super gdyby nie fakt że skrypt nie działa gdy go przeniosłem do mojej gry.

 

GML
################################################################################

############

FATAL ERROR in

action number 1

of Step Event0

for object obj_control:

 

Variable obj_control.sur(100002, -2147483648) not set before reading it.

at gml_Object_obj_control_StepNormalEvent_1 (line 2) - surface_set_target(sur);

################################################################################

############

 

Ludzie w komentarzach przy tym filmiku -

również piszą, że dostają ten błąd w różnych sytuacjach.

 

Poczytałem to co znalazłem dzięki Google i jedyna sensowna odpowiedz na podobny przypadek z podobnym skryptem była taka, że surface może w każdej chwili zostać usunięty z pamięci i trzeba sprawdzić czy się tak nie stało, jeżeli tak to znowu stworzyć surface. Nie wiem czy to ma sens - tłumaczone z ang.

Dla mnie cały ten skrypt to póki co "trochę" zbyt zaawansowana sprawa, gdyby jednak działał to bardzo chętnie bym go wykorzystał w swojej grze.

 

Może znajdzie się tutaj jakiś magik, który by pomógł znaleźć przyczynę występowania błędu i sposobu jego rozwiązania?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Surface lub zmienna nie istnieje. Zawsze trzeba sprawdzać czy surface istnieje zanim go użyjesz i w razie potrzeby utworzyć ponownie. Karta graficzna może surface wywalać w razie potrzeb kiedy chce, to taka nieco "tymczasowa" grafika zwalniana gdy coś innego potrzebuje tej pamięci w danym momencie (i zawsze zwalniana gdy przechodzisz do fullscreena/wylogowujesz sie/włącza się screensaver/komputer gasi monitor).

Odnośnik do komentarza
Udostępnij na innych stronach

Surface lub zmienna nie istnieje. Zawsze trzeba sprawdzać czy surface istnieje zanim go użyjesz i w razie potrzeby utworzyć ponownie. Karta graficzna może surface wywalać w razie potrzeb kiedy chce, to taka nieco "tymczasowa" grafika zwalniana gdy coś innego potrzebuje tej pamięci w danym momencie (i zawsze zwalniana gdy przechodzisz do fullscreena/wylogowujesz sie/włącza się screensaver/komputer gasi monitor).

 

I próbowałem właśnie "tworzyć ponownie" surface. Próbowałem to osiągnąć w ten sposób, ale nie działa...

 

GML
sur = surface_create(room_width, room_height);

 

if !surface_exists(sur) {

sur = surface_create(room_width, room_height);

}

 

Więc właśnie miałem nadzieje że ktoś podpowie jak zrobić to prawidłowo?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Polecam zrobić taką funkcję/skrypt:

 

surface_check_and_set(surfaceid, width, height)

 

GML
var s;

if (!surface_exists(argument0) {

s = surface_create(argument1, argument2);

} else {

s = argument0;

}

 

surface_set_target(s);

 

I używanie tego zamiast surface_set_target(). Oczywiście mozna to ulepszyć i w globalnych zapisać wysokośc i szerokośc, żeby potem łatwo było zmienić, ale to już zostawiam własnym chęciom i wygodzie, bo jak surface uzywamy w jednym miejscu, to moze się nie opłacać pisać ekstra kodu bo szkoda czasu.

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