Skocz do zawartości

Surface na pozycji kamery a rysowanie "podłogi" (krew i inne śmieci)


H2S04

Rekomendowane odpowiedzi

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();
	}
}

 

surfproblem.png

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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

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ę :D

 

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 :D jeden problem mniej jednak dalej przy with przy zniszczeniu obiektu draw na surface się niszczy :P

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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

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