Skocz do zawartości

zatrzymanie śledzenia kamery 3d przy końcu rooma


kordian

Rekomendowane odpowiedzi

Hej

 

To pytanie zadawałem wcześniej w dziale dla początkujących ale nie znalazłem rozwiązania...

 

Jestem początkującym użytkownikiem Game Makera i robię moją pierwszą platformówkę z widokiem z boku Nie jestem programistą, całkowicie zmieniam przede wszystkim grafikę i dźwięk, korzystam z gotowego silnika "mario" Martina Piecyka i modyfikuję go tu i tam :)

 

 

Ostatnio zapragnąłem aby platformy w grze posiadały głębię 3d. Znalałzem tutorial na you tube w którym jest pokazane jak to zrobić :

 

 

 

stworzyłem więc obiektY "obj_cam" i "obj_block" poczym wrzuciłem je do rooma gdzie znajduje się mój "oPlayer1" , czyli postać którą steruję w grze.

 

 

w Drawie obiektu kamery wpisałem kod:

 

 

d3d_set_projection(oPlayer1.x+0,oPlayer1.y+1,640,oPlayer1.x,oPlayer1.y,0,0,0,1);

 

Wsyztko chodzi sprawnie z wyjątkiem dwóch rzeczy:

 

1. kamera zawsze centruje bohatera, tak że gdy dociera do krawędzi rooma ukazany jest nie istniejący obszar background. Jak poinformować kamerę żeby zatrzymała się przy krawędzi ekranu , a potem gdy Player znajdzie się w odpowiedniej odległości znowu weszła w tryb śledzenia.

 

2. Gdy bohater umiera chcę aby kamera stanęła w miejscu. Śmierć bohatera to w mojej grze oddzielny obiekt. Gdy podpinam pod niego kamerę zachodzi porblem nr 1. Gdy ją wyłączam cały obraz odwraca się do góry nogami. Jest jakiś sposób aby odwrócić współżędne wyświetlania Viewa w trybie 2 d ?

Będę ogromnie widzięczny za porady, Jesli uda mi się wystrugać mój projekcik, oczywiście dam znać i zamieszczę stosowne podziękowania w credits :)

 

pozdrawiam

 

 

 

 

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

otóż tak:

 

GML (create)
mam_sledzic = true;

 

GML (step)
if mam_sledzic

{

x = oPlayer1.x;

y = oPlayer1.y;

}

d3d_set_projection(x,y+1,640,x,y,0,0,0,1);

 

wywołanie kodu objCamera.mam_sledzic = false zatrzymuje kamerę. Zresztą pisałem Ci to już w poprzednim temacie.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Nadal jest źle, bo nie ma obiektu player, tylko jest oPlayer1, poza tym, kamera nie działa wcale, gdy go nie ma. Pamiętaj, ja siedzę w GM od ponad 6 lat, więc nie wygrasz ze mną.

Odnośnik do komentarza
Udostępnij na innych stronach

otóż tak:

 

GML (create)mam_sledzic = true;

 

GML (step)if mam_sledzic

{

x = oPlayer1.x;

y = oPlayer1.y;

}

d3d_set_projection(x,y+1,640,x,y,0,0,0,1);

 

wywołanie kodu objCamera.mam_sledzic = false zatrzymuje kamerę. Zresztą pisałem Ci to już w poprzednim temacie.

 

Dzięki wielkie, teraz wpisałem to jak trzeba... Niestety dalej mam problemy. Kod działa, bo przy false nie wywala mi kamerki do 2d i nie odwraca obrazu ( tak było jak stosowałem wariant z instance_number(oPlayer1) ==0).

 

natomiast pojawia się error funkcji draw ( którego nie było przy wariancie Instant_number). Ustawiałem mam_sledzić= false dla eventu Destroy obiektu oPlayer1, ale bez skutecznie bo kamerka wciąż domaga się współżędnej x.

 

Ponadto nie mogę się doczytać jak sprawić aby współrzędne położenia oPlayer1 w roomie inicjowały kod

mam_sledzic = false (tzn. jak to sformuować w GML).

 

Głupol ze mnie ale naprawdę mi zależy na tej kamerce...

 

Jeśli powiesz mi jak to zrobić to będzie super bo już padam z braku snu na twarz :)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

dać w create przeciwnie do tego co w destroy (czyli zamiast false to true).

 

Co do błędu w draw - podaj treść błędu, ale powód jest inny, bo pozycja x istnieje dla każdego obiektu.

Odnośnik do komentarza
Udostępnij na innych stronach

dać w create przeciwnie do tego co w destroy (czyli zamiast false to true).

 

Co do błędu w draw - podaj treść błędu, ale powód jest inny, bo pozycja x istnieje dla każdego obiektu.

 

 

Działa! Popełniłem głupi błąd ( nie zaadresowałem akcji w evencie destroy oPlayer1 do kamery :jezor: ). Dzięki Wieelkie! :thumbsup:

 

Wciąż tylko nie wiem jak ustawić wartości śledzenia na false w zależności od położenia obiektu. robiłem różne przymiarki, ale bez skutku.

 

Chciał bym mu napisać że gdy Player 1 będzie w odleglości około połowy pola widocznosci kamery od scian rooma ( wszystkich czterech) to kamera ma się zatrzymać.

 

czyli np jeśli room ma rodzielczość 800x 600 a pole widoczności 640x480 to jak oPlayer1 znajdzie się na pozycji rooma x= 320 px kamera ma przestać podążać w lewo za bohaterem (odpowiednio x= 480px, kamera nie podąża w prawo, y=240px do góry,y=360px, w dół itp. )

 

Chyba że jest na to inny, leprzy sposób...

Odnośnik do komentarza
Udostępnij na innych stronach

coś w ten deseń:GMLif objPlayer.x < 320 and objPlayer.x > 480 and .... //tak samo dla y

{

objCamera.mam_sledzic = true;

}

else objCamera.mam_sledzic = false;

 

 

Wpisałem to i nawet działa (tylko ptaszki musiałem odwrócić) ale kamera zrywa animacje gdy przechodzi w tryb śledzenia. To wina skokowego środkowania obiektu który zdąża się w tym czasie przesunąć w polu widzenia. Co więcej gdy jest spełniony tylko jeden warunek to kamera przestaje zupełnie śledzić Playera1 ( czyli np skacząc przy ścianie x kamera nie łapie go w kadrze w osi y). Może można by tą projekcję 3d opisać oddzielnie dla każdej z osi?

 

coś w tym stylu:

 

 

if mam_sledzic_x

{

x = oCharacter.x;

 

}

d3d_set_projection(x,640,x,0,0,0,1); //tutaj nie wiem jak to zapisać, o ile się da dla tej funkcji

 

if mam_sledzic_y

{

 

y = oCharacter.y;

}

d3d_set_projection(y+1,640,y,0,0,0,1);//tak samo

 

 

ale to chyba i tak nie rozwiąze problemu skokowej animacji... <_<

Odnośnik do komentarza
Udostępnij na innych stronach

if oCharacter.x > 300 and oCharacter.x < 800

and oCharacter.y > 250 and oCharacter.y < 800

 

//tak samo dla y

{

obj_cam.mam_sledzic = true;

}

else obj_cam.mam_sledzic = false;

 

 

Wspomnę jeszcze tylko że wrzuciłem kod od Ciebie to do drawa Playera1, Adresowałem do kamerki...

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