Skocz do zawartości

Jak zatrzymać śledzenie bohatera przez kamerę 3d


Rekomendowane odpowiedzi

Pomocy!

Jestem początkującym użytkownikiem Game Makera i robię moją pierwszą platformówkę. Nie jestem programistą, bardziej profesjonalnie zajmuje się grafiką i oprawą dźwiękową, korzystam z gotowego silnika "mario" 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ć :

 

 

Oto co z niego zawarłem w grze:

 

stworzyłem 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 create obiektu "obj_cam" wpisałem kod:

 

 

d3d_start()

d3d_set_lighting(false);

d3d_set_culling(false);

d3d_set_perspective(true);

draw_set_color(c_white);

 

w Draw tego obiektu wpisałem kod:

 

 

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

 

(obiekt ma ustawiony depth na 100)

 

 

Rezultat jest prawie dobry :) Kamerka śledzi "oPlayer1" a perspektywa "obj_block" (ustawiony depth na 0) zmienia się jak trzeba. Jest jednak problem, bo kamera działa tak , że "oPlayer1" pojawiał się wyśrodkowany nawet gdy kończy się rozdzielczość mojego rooma i widok obejmuje obszar poza granicami ustalonymi dla planszy.

 

Czy jest jakiś kod, który pozwoli mi na zatrzymanie ruchu kamery gdy "oPlayer1" zbliży się do krawędzi rooma ( tak jak to ma miejsce przy stosowaniu klasycznych "views" z game makera)

 

Kolejny problem, który wiąże się z zastosowaniem "obj_cam" to jak narysować sprite'a (np. przedstawiającego życie bochatera) tak aby znajdował się on w stałym położeniu względem krawędzi widocznej sceny (nie rooma!)

 

Będę ogromnie wdzięczny za pomoc. Autora kodu oczywiście umieszczę w ceditach, o ile uda mi się tylko doprowadzić projekt do przyzwoitego stanu, natychmaist dam znać. :)

 

Pozdrawiam

 

 

 

 

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

GML
if chce_sledzic

{

x = oPlayer1.x;

y = oPlayer1.y;

}

 

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

 

ustawienie chce_sledzic na true powoduje, ze kamera podąża, na false, że stoi w miejscu.

Odnośnik do komentarza
Udostępnij na innych stronach

Hej. Dzięki za błyskawiczną odpowiedź :) Niestety nie całkiem to rozumiem , bo jak mówiłem z programowania ze mnie noga. Program odpowiada, że jest za mało argumentów aby skrypt zadziałał gdy go wpisuję (x,y,x,y,0,0,0,1). Zrobiłem to więc tak, że do obj_cam wpisałem kod:

 

w create Event

 

chce_sledzic=true;

 

w draw Event

 

 

if chce_sledzic=true

{

x = oPlayer1.x;

y = oPlayer1.y;

}

 

 

 

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

 

 

Rezultat jest dokładnie taki sam jak poprzednio. Gdy bohater dotyka krawędzi i umiera, wówczas wyskakuje mi komunikat:

 

 

ERROR in

action number 1

of Draw Event

for object obj_cam:

 

Error in code at line 9:

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

 

at position 30: Unknown variable x

 

Żeby tego uniknąć próbowałem zmieniać obiekt który śledzi kamera na inny, error znika ale to nie zmienia faktu że kamera albo obejmuje nieistotny obszar sceny albo wogóle nie działa.

 

 

Chciał bym zrobić coś takiego, żeby kamera wiedziała, że jak widok zbliża się do krawędzi rooma to trzeba się zatrzymać i ruszyć dopiero gdy oPlayer1 (bądź inny obiekt który będę chciał śledzić w grze) oddali się odpowiednio od krawędzi rooma. Kompletnie nie wiem dla jakiego obiektu, w którym evencie i co wpisać :(

 

Ps. Czy znasz może odpowiedź na moje drugie pytanie ( jak w takim wypadku narysować spritea poruszającego się w stałej odległości od krawędzi ekranu)?

Odnośnik do komentarza
Udostępnij na innych stronach

Bohater umiera.

Kamera pobiera x i y bohatera, tylko jak ma adresować jak nie ma bohatera?

 

Edit:Musisz zrobić objekt obj_hud w którego draw:

GMLd3d_set_projection_ortho(0,0,640,480,0)

 

Wielkie dzięki! hud działa jak należy :).

 

Co do tego umierania to rozumiem, ale wciąż nie wiem jak zrobić aby kamera inteligentnie się zatrzymała gdy widok dotrze do krawędzi rooma. Widok ma rozdzielczość 640x480. Całkowita rozdzielczość mojego pomieszczenia wynosi 800x 600 ale kamera nic sobie z tego nie robi i przekracza rzeczywistą krawędź planszy, pokazuje nieistniejący obszar wypełniając go kolorem background ( śledzi bohatera tak by zawsze był wyśrodkowany wzgledem krawędzi ekranu). Może znasz jakiś kod żeby kamera stanęła po dotarciu do krawędzi rooma?

 

pozdrawiam i dziękuję

Odnośnik do komentarza
Udostępnij na innych stronach

daj to w kamerze:

GMLif instance_number(player) = 1

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

 

 

Jest coraz lepiej. Teraz kamera przynajmniej się zatrzymuje ale niestety obraz odwraca się do góry nogami :)

 

nadal jest problem z granicami planszy. Gdy bohater dociera do granicy po prostu blokuje go niewidzialna bariera a kamerka i tak pokazuje nieistniejący obszar sceny wypełniony kolorem background ( kamera w ogóle nie uwzględnia rozdzialczości rooma tylko to ze bohater musi być w centrum widocznego obszaru.

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