Jaki jest najbardziej praktyczny sposób na wdrożenie kamery / rzutni w grze 2D?
Czytałem, że powinienem przechowywać pozycję świata obiektów zamiast pozycji względem ekranu?
Obecna sytuacja:
Zaimplementowałem prostą grę 2D, w której ładuję obiekty i poziomy z plików XML. Obecnie plik XML poziomu wygląda następująco:
<map>
<tile obj="ground" x="0" y="555" />
<tile obj="ground" x="16" y="555" />
<tile obj="ground" x="32" y="555" />
...
</map>
Wszystkie obiekty mają „pozycję” wektora 2d, przechowującą ich bieżące położenie na ekranie.
Co chcę, żeby to było:
Na obrazie:
- Aparat ma rozdzielczość 800 x 600 lub 640 x 480
- Bloki i duszki mają wymiary 16 x 16 pikseli.
- Świat rozmiar może się różnić
- Współrzędne prawdopodobnie powinny być znormalizowane względem świata, a nie ekranu?
- Pozycja rzutni względem x, y gracza i przesuwa się, gdy gracz osiągnie martwą strefę kamery (podobnie jak w tym filmie ).
Pytam pseudo przykłady / artykuły, ale jeśli chcesz wiedzieć, czego używam do programowania: SDL i C / C ++.
c++
2d
architecture
camera
bluekirai
źródło
źródło
Odpowiedzi:
Musisz ustawić każdy obiekt względem świata zamiast ekranu. Twój aparat powinien mieć także swoje światowe współrzędne, aby można go było narysować we względnej pozycji na świecie. Może być również wygodne, aby kamera podążała za obiektem, więc gdziekolwiek on jest, kamera po prostu używa jego współrzędnych. Zazwyczaj współrzędne kamery ustawiają ją od lewego górnego rogu. Oznacza to, że kamera miałaby światową pozycję około (0,24) na zdjęciu .
Jeśli chodzi o rysowanie obiektów, które kamera może „zobaczyć”, należy narysować wszystkie obiekty względem współrzędnych świata kamery. Aby obliczyć pozycję ekranu obiektu względem kamery, po prostu wykonaj:
Oczywiście niektóre obiekty nie są w rzeczywistości widoczne dla kamery, więc możesz zaimplementować system ograniczania widoku.
źródło
Wszystko to najlepiej zrobić w GPU przy użyciu macierzy World i View, a nie modyfikując miejsce rysowania obiektów na CPU.
W ten sposób możesz dowolnie zmieniać kamerę (nawet przybliżać i oddalać!), A ona po prostu magicznie zadziała. Nadal możesz wyświetlać wygładzanie, aby zaoszczędzić czas na losowaniu. I żaden kod do rysowania świata nie będzie musiał się zmieniać po prawidłowym skonfigurowaniu macierzy widoku i świata.
W SDL prawdopodobnie możesz po prostu wbudować wywołania OpenGL, takie jak
glOrtho
iglTranslate
.Zobacz ten wątek .
źródło