Menerapkan kamera / viewport ke game 2D


21

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:

Ilustrasi viewport / gameworld

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


1
Tambahkan tautan ketiga Anda di komentar di sini dan saya dapat menambahkannya ke pertanyaan Anda.
MichaelHouse

Inilah yang saya maksud dengan zona mati kamera: youtube.com/watch?v=89TRXUm8jMI
bluekirai


Halo @Arthur Wulf White, ingin menguraikan? Terima kasih.
bluekirai

Kamera yang Anda sebutkan adalah versi spesifik dari kamera 2d umum yang hanya digunakan untuk mengimbangi tampilan (tidak ada rotasi dan zoom). Perilaku pelacakan dapat diterapkan dengan memeriksa jarak antara karakter pemain dan kamera, menggerakkan kamera jika jaraknya terlalu jauh.
wolfdawn

Jawaban:


20

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:

int screenX, screenY; //screen position of the object being drawn

screenX = object.x-camera.x;
screenY = object.y-camera.y;

Jelas beberapa objek tidak benar-benar terlihat oleh kamera, jadi Anda mungkin ingin menerapkan sistem pemusnahan tampilan.


2

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 glOrthodan glTranslate.

Lihat utas ini .


Bisakah seseorang menjelaskan downvote? Ini masuk akal.
Hello World

1
Saya tidak memilih, tapi saya pikir itu karena ini bahkan tidak menjawab pertanyaan. Pertanyaannya adalah tentang bagaimana menghitung sesuatu, bukan apakah itu lebih efisien atau lebih mudah dilakukan pada GPU vs CPU. OP bahkan mengatakan dia sedang mencari contoh palsu. Tidak ada keraguan bahwa menggunakan kombinasi kamera / dunia / model matriks akan lebih efisien, sehingga mklingen memiliki poin paling sedikit.
Dan Watkins

Jawaban ini sama sekali tidak buruk! Ini lebih spesifik untuk pengembangan OpenGL / DX, tetapi pendekatan yang tepat karena Anda hanya dapat menghitung matriks terjemahan berdasarkan coors kamera dan memindahkan objek melalui matriks cam, tanpa mengubah posisi aktualnya.
nenchev
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.