Autor Wątek: Podążanie za spritem 2d  (Przeczytany 1238 razy)

Offline xardas97260

  • Użytkownik

# Marzec 16, 2011, 18:14:49
Witam. Robię grę na podst. tego tutoriala: http://www.xnadevelopment.com/tutorials/theroadnottaken/theroadnottaken.shtml

I chcę dodać małą zmianę. Mianowicie, żeby "kamera" podążała za autem którym jedziemy, czyli mCar. Poprostu, mam zamiar dodać proste AI, menu, i większą mapę, większą od okna, i dlatego potrzebuje żeby kamera podążała za mCar. No taka kamera jak np. w GTA2, albo pierwszej lepszej grze wyścigowej z widokiem z góry. Dziękuję z góry.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline rzuf

  • Użytkownik

# Marzec 16, 2011, 18:32:20
Zatem, sir, potrzebujesz czegoś, co w strywializowanej wersji wyglądać by mogło o tak:

Vector2 ZwrocLadnieProszePozycjeKamery(){
Vector2 Pozycja(0, 0);
Pozycja.x = PozycjaAutomobilu.x - (SzerokoscEkranu * 0.5f);
Pozycja.y = PozycjaAutomobilu.y - (WysokoscEkranu * 0.5f);
return Pozycja;
}

Łaskawie zwrócone wartości odejmujesz od pozycji każdej grafiki podczas rysowania i masz miłego operatora kamery. Ten w przeciwieństwie do normalnych operatorów na planach nie będzie wypijał Twojej kawy!
« Ostatnia zmiana: Marzec 16, 2011, 18:34:03 wysłana przez rzuf »

Offline xardas97260

  • Użytkownik

# Marzec 16, 2011, 22:06:38
A słyszałem o takim sposobie że było coś camera.position = mCar.postion, czy isteniej coś takiego, czy to camera to była funkcja własna?

Offline rzuf

  • Użytkownik

# Marzec 16, 2011, 22:27:33
Istota rzeczy tkwi w tym, iż, filozoficznie ujmując, żadnej kamery tak naprawdę nie ma.
To, co musisz zrobić, to przemieszczać calutką grafikę tak, jak przesuwasz google-mapę żeby zobaczyć ten jej kawałek, który Cię interesuje. Kamera to tylko nazwa na interfejs, który za Ciebie myśli o ile ma ten cały graficzny bałagan przemieścić.
Tyle na ile kojarzę XNA (a kojarzę niewiele) nie ma żadnej gotowej funkcjonalności kameropodobnej, zatem kombinuj jw. :)

Offline Xirdus

  • Redaktor

# Marzec 16, 2011, 22:32:48
A słyszałem o takim sposobie że było coś camera.position = mCar.postion, czy isteniej coś takiego, czy to camera to była funkcja własna?
Jeśli twoja klasa wektora ma przeciążony operator= (a trudno żeby nie miała) to tak.

Offline Charibo

  • Redaktor

# Marzec 16, 2011, 23:15:25
A słyszałem o takim sposobie że było coś camera.position = mCar.postion, czy isteniej coś takiego, czy to camera to była funkcja własna?
Jeśli twoja klasa wektora ma przeciążony operator= (a trudno żeby nie miała) to tak.
W XNA jest ich klasa wektora, która ma przeciążone wszystko jak leci. :)

Offline Xirdus

  • Redaktor

# Marzec 16, 2011, 23:32:18
W XNA jest ich klasa wektora, która ma przeciążone wszystko jak leci. :)
O tym właśnie mówię.

Offline Amplifa

  • Użytkownik

# Marzec 17, 2011, 19:34:19
Nie wiem czy o to CI chodzi ale,
w XNA jest kamera,wystarczy zrobić trochę matrix.translate i to wrzucasz w spriteBatch.Begin jako 7 argument, wtedy cala gra jest przesuwana , pojawia się wtedy problem ze np GUI tez się rusza, ale wystarczy elementy które maja się nie ruszać rysować w innym spriteBatch

Przykladowy kod ktory zwraca matrixa ktory ustawia srodek kamery na jakiejs pozycji

            return Matrix.CreateTranslation(new Vector3(ViewPort.Width * 0.5f - position.X, ViewPort.Height * 0.5f - position.Y, 0));-Viewport to wielkość ekranu czyli XNA'owy ViewPort
- position to pozycja sprite

Offline xardas97260

  • Użytkownik

# Marzec 18, 2011, 21:32:57
Dokładnie. Dzięki za ten kod, Amplifa. Innym też dziękuję. Jak bedę miał pytania jakieś jeszcze, to napisze, to proszę o nie zamykanie wątku.