Ini adalah pertanyaan lanjutan untuk pertanyaan ini .
Saya ingin tahu apakah ada pola umum / tipikal / terbaik untuk skala representasi saya di dunia (saat ini 160Kmx160Km) agar sesuai dengan area gambar (saat ini 800x600 piksel).
Saya dapat memikirkan setidaknya empat pendekatan yang berbeda:
Naif satu (cara saya melakukannya sejauh ini). Saya mengimplementasikan fungsi global sc(vector)
yang hanya akan mengembalikan salinan vektor yang diperkecil. Ini tentu saja berfungsi, tetapi mengharuskan saya untuk menulis kode seperti:
drawCircle(sc(radius), sc(position))
Fungsi pembungkus . Saya dapat mendefinisikan beberapa fungsi, masing-masing membungkus satu middleware asli. Sebagai contoh saya bisa mendefinisikan myDrawCircle
bahwa pertama-tama akan skala argumen yang perlu scaling, dan kemudian memanggil drawCircle
dengan yang terakhir. Ini akan membuat kode saya mungkin lebih mudah dibaca dan lebih mudah dirawat, tetapi saya harus menulis banyak fungsi pembungkus, yang kedengarannya konyol.
Penghias fungsi . Saya hanya bisa menghiasi fungsi middleware yang ada, menyediakan penskalaan otomatis untuk semua parameter yang merupakan instance dari kelas Vector3D
, tetapi masalahnya adalah fungsi tersebut juga berfungsi dengan parameter yang sama list
atau Vector2D
terlalu, dan dekorator tidak memiliki cara untuk mengetahui daftar mana yang perlu diskalakan (jari-jari misalnya) dan yang tidak (nilai RGB).
Inisialisasi permukaan . Ketika mendefinisikan permukaan yang akan saya gambar, saya bisa mendefinisikan faktor penskalaan (sehingga saya akan menggunakan meter dan bukan piksel sebagai parameter). Ini akan bekerja secara transparan untuk saya dan akan menjadi solusi pilihan saya, tetapi tentu saja itu harus diterapkan di middleware, jadi itu bukan pilihan nyata.
... bagaimanapun juga: karena ini adalah masalah yang sangat umum, saya bertanya-tanya apakah ada pola yang mapan yang dengan elegan menyelesaikan masalah ini yang gagal saya temukan.
PS: Untuk proyek ini saya menggunakan python (dengan pygame ), tetapi - meskipun jawaban khusus python / pygame sangat dihargai, saya lebih tertarik pada deskripsi umum / tingkat tinggi dari pola daripada implementasi konkretnya.
Terima kasih sebelumnya atas waktu dan keahlian Anda.
sumber
Biasanya orang tidak mencoba melakukan penskalaan run-time dalam game 2D. Saya tidak setuju bahwa itu masalah umum. Jika orang menginginkan peta mini atau beberapa penyalinan tetap lainnya, seringkali ada satu set grafis baru yang dilakukan untuk tujuan ini. Jarang bahwa Anda membutuhkan rutinitas tunggal untuk dijalankan pada 2 level zoom berbeda dalam game 2D.
Jika Anda menggunakan API 3D, Anda bisa mendapatkan fungsionalitas ini secara gratis - cukup ubah parameter kamera / viewport.
PyGame adalah API yang sangat lama dan sayangnya hanya cocok untuk 2D. Bahkan jika Anda dapat mengerjakan sistem penskalaan yang memadai untuk tingkat zoom yang berbeda, kinerjanya tidak akan cukup baik dan penampilannya mungkin sangat buruk.
Saya akan menyarankan bahwa jika Anda ingin memperbesar dan memperkecil, Anda pindah ke API 3D modern sesegera mungkin. Saya akan merekomendasikan pyglet tetapi ada juga yang lain.
sumber
pyglets
untuk simulasi 3D. Tentunya lebih mampu daripadapygame
, tetapi dukungan untuk 2D adalah tingkat yang cukup rendah daripada yang ada dipygame
. Dokumentasi / contoh yang tersedia juga kurang terperinci, yang sangat mengecewakan bagi saya karena saya pemula dalam pengembangan game, dan saya benar-benar perlu memahami dasar dari operasi yang paling umum dilakukan. :) Adapun "usia" pygame: Anda benar. Namun modernisasi sedang berlangsung! :)pygame.sprite.LayeredUpdates
misalnya). Adapun rasio yang tidak berubah: Saya mengerti maksud Anda. Perilaku yang Anda gambarkan bukan yang ingin saya tiru, tetapi saya mengerti apa yang Anda maksudkan, terima kasih atas klarifikasi! :)