H2S04 Opublikowano 27 Stycznia 2022 Udostępnij Opublikowano 27 Stycznia 2022 Mam pytanie dotyczące surface podążającego za kamerą. Otóż rysując surface na powierzchni stałej (tj. jakiś koordynatach typu room_width room_height) rysowanie polega na rysowaniu na koordach danego obiektu, przy kamerze muszę odjąć view width/height by narysowało mi surface tam gdzie chce, i tutaj jest problem bo ile wszystko się rysuje, (przy obiekcie jak istnieje tego problemu nie ma bo pozycja obiektu jest stała więc rysowanie w with będzie ładnie działać z kamerą), narysowany surface podąża za kamerą zamiast być w miejscu rysowania... Jak można to naprawić bo skończyły mi się pomysły i nic nie wydukałem patrząc na forum yoyo. Pozdrawiam. ///SURFACE RYSUJE SIĘ W POSTACI Create: global.FloorSurafce = -1; Draw: var VW = camera_get_view_width(view_camera[0]), VH = camera_get_view_height(view_camera[0]), VX = camera_get_view_x(view_camera[0]), VY = camera_get_view_y(view_camera[0]); if (surface_exists(global.FloorSurf)){ draw_surface(global.FloorSurf,VX,VY); } else { global.FloorSurf = surface_create(VW,VH); } /// OBIEKT KTÓREGO SZCZĄTKI CHCĘ RYSOWAĆ Draw: if speed == 0{ // obiekt się porusza i zmniejsza prędkość lub zatrzymuje się na ścianie if (surface_exists(global.FloorSurf)){ surface_set_target(global.FloorSurf); draw_sprite_ext(sprite_index,image_index,x-camera_get_view_x(view_camera[0]),y-camera_get_view_y(view_camera[0]),image_xscale,image_yscale,image_angle,TPColor,image_alpha); // TPColor to wybranie koloru surface_reset_target(); } } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 27 Stycznia 2022 Administratorzy Udostępnij Opublikowano 27 Stycznia 2022 Pobaw sie z camera_apply(), który automatycznie zmienia offset surface do obecnej kamery, więc nie trzeba odejmować pozycji view od x i y obiektów. Inaczej mówiąc - normlanie na surface wszystko rysuje się tak, że lewy górny róg to 0,0, po użyciu camera_apply, lewy górny róg surface to jest lewy górny róg obecnego view Jeszcze taka podpowiedź: jak rysujesz na surface, to rób to w jednym obiekcie, np. with(granaty) { draw_self(); } with(krew) { draw_self(); } // i jeszcze inne rzeczy Tak, żeby, optymalnie jedno surface tylko raz miało surface_set_target Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
H2S04 Opublikowano 27 Stycznia 2022 Autor Udostępnij Opublikowano 27 Stycznia 2022 41 minut temu, gnysek napisał: Pobaw sie z camera_apply(), który automatycznie zmienia offset surface do obecnej kamery, więc nie trzeba odejmować pozycji view od x i y obiektów. Inaczej mówiąc - normlanie na surface wszystko rysuje się tak, że lewy górny róg to 0,0, po użyciu camera_apply, lewy górny róg surface to jest lewy górny róg obecnego view Jeszcze taka podpowiedź: jak rysujesz na surface, to rób to w jednym obiekcie, np. with(granaty) { draw_self(); } with(krew) { draw_self(); } // i jeszcze inne rzeczy Tak, żeby, optymalnie jedno surface tylko raz miało surface_set_target Zaraz obczaję, problem jest taki, że przy with jak obiekt został zniszczony usuwało go z surface ale zaraz pokombinuję EDIT: Hmm wczesniej kombinowałem z camera_apply to nie chciało działać teraz dałem na początku drawu surface i działa ok jeden problem mniej jednak dalej przy with przy zniszczeniu obiektu draw na surface się niszczy Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 27 Stycznia 2022 Administratorzy Udostępnij Opublikowano 27 Stycznia 2022 Tak tego nie osiągniesz. Jeśli chcesz zostawiać na surface obiekty, które znikają, to jest kilka problemów: - nie możesz czyścić surface - jak przełączysz sie na inną aplikację, zablokujesz komputer, włączy sie wygaszacz lub go uśpisz - surface na 99% zostanie skasowane i stracisz wszystko - jak przesunie się ekran, to bez czyszczenia surface obiekty znikną Rozwiązania widzę takie: - nie kasować obiektów - stworzyć tablicę , która trzyma co masz rysować (elementami tablicy może być struktura z polami sprite, x, y). Wtedy można je rysować w pętli i w sumie nawet nie jest potrzebne suface Na GMCLANie jest kilka osób, które zaraz by przybiegły powiedzieć "panie, ale to jest w *pip* niewydajne" - no więc nie do końca. Sprawdzenie czy dane X/Y mieści się w ekranie (to są cztery porównania) i tak będzie szybsze niż przerysowywanie surface czy przetwarzanie wszystkich eventów obiektów. Poza tym, jeśli tego będzie więcej niż kilkaset można wysilić się w jakieś strefy i przetwarzać tylko tablicę danej strefy. Z kolei dla krwi, ja zawsze szedłem w stronę rozwiązania, że np. na raz może być max 100 plam, więc jak dochodzi 101, usuwam pierwszą i dodaję nową w jej miejsce (albo zmienna globalna która mówi gdzie wstawiamy następną, albo przesunięcie elementów tablicy o -1). Można nawet dla usuwanego elementu stworzyć obiekt, który powoduje zanikanie alphy, żeby dynamicznie zanikał (tak bym zrobił np. dla śladów stóp, czy opon). Jest sporo opcji Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
H2S04 Opublikowano 28 Stycznia 2022 Autor Udostępnij Opublikowano 28 Stycznia 2022 W takim razie po prostu zrobię znikającą alphę, w czasie klikunastu s obiekt zniknie i się zniszczy, będzie mniej kombinacji i tyle ? gnysek 1 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ę