Skocz do zawartości
  • Ogłoszenia

  • Gdzie świętować urodziny GMCLANu   26 użytkowników zagłosowało

    1. 1. Gdzie świętować urodziny GMCLANu


      • Warszawa (bo w centrum)
      • Szczecin (bo tam mieszka Ranma i narodził się GMCLAN)

    Żeby zagłosować w tej ankiecie, prosimy się zalogować lub zarejestrować. Zobacz temat
  • 0
ProExCurator

Skrypt - "zaawansowany lighting"

Pytanie

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?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

7 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
gnysek    30

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
ediepl    4

Tylko że sprawdzanie czy surface istnieje powinno być przed jego rysowaniem/rysowanie na nim

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Tylko że sprawdzanie czy surface istnieje powinno być przed jego rysowaniem/rysowanie na nim

 

To nie bardzo rozumiem, jak w takim razie powinien wyglądać kod?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
I am vader    24

za każdym razem kiedy chcesz użyć surface, zanim go użyjesz:

 

if !surface_exists(sur) sur = surface_create(szerokosc, wysokosc);

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
gnysek    30

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×