Apa cara paling praktis untuk mengimplementasikan kamera / viewport ke game 2D?
Saya pernah membaca, bahwa saya harus menyimpan posisi dunia objek alih-alih posisi relatif ke layar?
Situasi saat ini:
Saya telah mengimplementasikan gim 2D sederhana tempat saya memuat objek dan level dari file XML. Saat ini tingkat file XML terlihat seperti ini:
<map>
<tile obj="ground" x="0" y="555" />
<tile obj="ground" x="16" y="555" />
<tile obj="ground" x="32" y="555" />
...
</map>
Semua objek memiliki "posisi" vektor 2d yang menyimpan lokasi mereka saat ini di layar.
Apa yang saya inginkan:
Dalam gambar:
- Kamera adalah 800x600 atau 640x480
- Blok dan sprite berukuran 16x16 piksel.
- Ukuran dunia dapat bervariasi
- Koordinat mungkin harus dinormalisasi relatif terhadap dunia, bukan ke layar?
- Posisi viewport relatif terhadap x, y dan bergerak pemain saat mencapai zona mati kamera (mirip dengan video ini ).
Saya meminta contoh / artikel semu, tetapi jika Anda perlu tahu apa yang saya gunakan untuk pengembangan: SDL & C / C ++.
c++
2d
architecture
camera
bluekirai
sumber
sumber
Jawaban:
Anda harus menempatkan setiap objek relatif terhadap dunia alih-alih layar. Kamera Anda juga harus memiliki koordinat dunianya sendiri sehingga dapat ditarik pada posisi relatif di dunia. Mungkin juga nyaman jika kamera Anda mengikuti suatu objek, jadi di mana pun objek itu berada, kamera hanya menggunakan koordinatnya. Biasanya koordinat kamera akan memposisikannya dari sudut kiri atas. Ini berarti kamera akan memiliki posisi dunia sekitar (0,24) dalam gambar .
Sedangkan untuk benar-benar menggambar objek yang dapat "dilihat" oleh kamera, Anda harus menggambar semua objek relatif terhadap koordinat dunia kamera. Untuk menghitung posisi layar objek relatif terhadap kamera, cukup lakukan:
Jelas beberapa objek tidak benar-benar terlihat oleh kamera, jadi Anda mungkin ingin menerapkan sistem pemusnahan tampilan.
sumber
Yang terbaik untuk melakukan semua ini dalam GPU menggunakan matriks World and View, bukan dengan memodifikasi di mana Anda menggambar objek pada CPU.
Dengan begitu, Anda dapat mengubah kamera secara sewenang-wenang (bahkan memperbesar dan memperkecilnya!) Dan ini hanya akan berfungsi secara ajaib. Anda masih dapat melakukan pemusnahan tampilan untuk menghemat waktu menggambar. Dan tidak ada kode Anda untuk menggambar dunia yang harus berubah setelah Anda mengatur tampilan dan matriks dunia dengan benar.
Di SDL, Anda mungkin bisa hanya sebaris panggilan OpenGL seperti
glOrtho
danglTranslate
.Lihat utas ini .
sumber