Peta top-down 2d: normalisasi atau tidak?

11

Saya seorang pemula mutlak dengan pemrograman game, haruskah pertanyaan ini dirumuskan dengan buruk, sadarlah itu bukan kecerobohan di pihak saya, tetapi kurangnya pengalaman pemrograman game.

Gim yang saya rencanakan untuk dikodekan akan menggunakan peta 2D top-down sebagai "dunia". Dunia mungkin lebih besar dari jendela (jendela dapat memperbesar atau memperkecil) dan kendaraan dapat ditemukan di titik mana pun di dunia (= ini bukan peta ubin, ruangnya "kontinu").

Untuk mengklarifikasi dengan sebuah contoh: jika dunia adalah medan 1000x1000 meter, sebuah kendaraan bisa berada di lokasi (327,31, 720,4) meter.

Pertanyaan saya adalah: apa cara yang paling nyaman untuk mewakili dunia secara internal? Saya bisa memikirkan kemungkinan-kemungkinan ini:

  • tidak melakukan apa pun dan menggunakan meter seolah-olah saya bekerja dengan benda fisik,
  • normalisasi ke piksel mendefinisikan ukuran dunia sebagai jumlah piksel untuk mewakili 1000 meter pada zoom maksimum,
  • normalisasikan ke 1 mendefinisikan kata sebagai kuadrat ukuran 1

... tapi saya yakin mungkin ada beberapa yang lain / beberapa milik saya tidak masuk akal. Hanya saja menjadi game pertama saya, saya tidak memiliki gambaran yang jelas tentang masalah di depan saya, dan saya ingin beberapa panduan dalam membuat pilihan awal yang cukup benar.

Terima kasih atas waktu Anda.

Mac
sumber
Saya punya masalah ini. Saya tidak akan memposting sebagai jawaban - sudah ada hal-hal hebat di sana. Tetapi jika Anda bekerja di unit yang sewenang-wenang, Anda dapat mendukung resolusi apa pun hanya dengan mengubah satu nilai. Ini juga jauh lebih mudah untuk ditangani dalam hal gameplay. Akhirnya, dengan jumlah besar seperti pengukuran piksel, sim fisika dapat meledak.
Bebek Komunis

Jawaban:

10

Saya setuju dengan menggunakan nilai dunia nyata (meter, kaki, dll.) Sebagai dasar jarak Anda. Masalah dengan dua saran Anda yang lain adalah keduanya merupakan variabel. Bekerja dengan ukuran dunia 1akan menyebabkan semua aritmatika Anda menjadi floating-point antara -1 dan 1, yang dapat menyebabkan lebih banyak kesalahan floating-point. Juga, jika Anda pernah memutuskan untuk membuat ukuran dunia variabel (dunia "Besar" untuk game yang lebih lama, dll.) Anda akan memperkenalkan banyak masalah pada kode Anda. Demikian juga, jika Anda menggunakan piksel, bahkan pada level zoom maksimum / minimum, Anda akan mengalami kebingungan serta masalah jika Anda memutuskan untuk menambah atau mengurangi level zoom.

dlras2
sumber
Jawaban ini sangat bagus (+1). Saya terutama menyukai bagaimana Anda menjelaskan potensi masalah dengan menggunakan "1" untuk ukuran dunia.
Randolf Richardson
Jika Anda melakukan segala jenis simulasi fisik, bahkan jika benar-benar dibuat-buat, menggunakan integer titik tetap akan berakhir menyebabkan hasil yang tidak valid. Yang harus Anda lakukan adalah memodelkan satu kendaraan yang bergerak dengan kecepatan unit pada diagonal dan Anda akan menemukan bahwa Anda tidak memiliki cara yang tepat untuk merepresentasikan posisinya.
edA-qa mort-ora-y
3
RE yang disepakati: menggunakan meter. Ini juga akan membantu Anda memvisualisasikan mental dan memahami hal-hal juga. "Kendaraan itu panjangnya 5 meter", atau "Kedua benda ini berjarak 500 meter" dan tidak harus melakukan matematika mental setiap saat untuk merasakan apa yang Anda lakukan.
Tim Holt
-1 pernyataan bahwa aritmatika integer lebih cepat daripada floating point tidak benar secara umum, pada kenyataannya mereka jauh lebih cepat pada kebanyakan platform modern
Maik Semder
2
Masih menggunakan nilai titik tetap untuk posisi absolut bisa menjadi ide yang bagus. Ini mengarah pada ketepatan konstan dan fisika identik di seluruh dunia.
CodesInChaos
7

Dari tiga opsi yang Anda sarankan, menggunakan meteran mungkin akan menjadi yang terbaik. Saat Anda membuat data lain, berurusan dengan panjang dalam meter akan membuat hidup Anda jauh lebih mudah. Di antara alasan lain, Anda dapat memutuskan untuk mengubah ukuran dunia Anda, atau level yang berbeda mungkin membutuhkan peta dengan ukuran berbeda.

Anda juga dapat memutuskan untuk menggunakan kaki (atau mungkin inci). Bagian dari keputusan ini mungkin tergantung pada paket middleware apa yang Anda gunakan - beberapa mesin fisika lebih suka satu jenis unit atau yang lain (meskipun hampir selalu dapat dikonfigurasi). Untuk sebagian besar, Anda bisa memilih unit dan pergi dengannya.

Balik
sumber
5

Normalisasi ke '1' benar-benar bukan cara untuk pergi (bagaimana jika Anda memiliki dunia yang tidak persegi? Atau beberapa dunia dengan ukuran yang berbeda ...).

Menggunakan piksel sebagai ... TIDAK PERNAH Gabungkan gameplay dan ukuran grafik !! Jangan mengunci diri sehingga Anda tidak dapat mengubah gambar tanpa harus mengubah kode.

Jadi meter (kaki atau pengukuran apa pun yang paling Anda sukai) adalah cara untuk melakukannya. Anda akan merasa jauh lebih baik untuk mengkodekan peluncur rudal Anda untuk bergerak dengan kecepatan 50 km / jam daripada 0,00076 unit / detik ...

Valmond
sumber