Pertanyaan
Ketika Anda memiliki gim 2D yang menggunakan gambar sangat besar (lebih besar dari yang dapat didukung oleh perangkat keras Anda), apa yang Anda lakukan? Mungkin ada beberapa solusi menarik untuk masalah ini yang tidak pernah terjadi pada saya sebelumnya.
Saya pada dasarnya mengerjakan sejenis pembuat game petualangan grafis. Target audiens saya adalah orang-orang dengan sedikit pengalaman pengembangan game (dan pemrograman). Jika Anda bekerja dengan aplikasi seperti itu, tidakkah Anda lebih suka untuk itu menangani masalah secara internal daripada meminta Anda untuk "pergi membagi gambar Anda"?
Konteks
Sudah diketahui bahwa kartu grafis memaksakan serangkaian batasan pada ukuran tekstur yang dapat mereka gunakan. Misalnya, ketika bekerja dengan XNA, Anda dibatasi untuk ukuran tekstur maksimum 2048 atau 4096 piksel tergantung pada profil yang Anda pilih.
Biasanya ini tidak menimbulkan banyak masalah dalam game 2D karena kebanyakan dari mereka memiliki level yang dapat dibangun dari potongan individual yang lebih kecil (mis. Ubin atau sprite yang diubah).
Tapi pikirkan beberapa game petualangan grafis point'n'click klasik (mis. Monkey Island). Kamar-kamar dalam permainan petualangan grafis biasanya dirancang secara keseluruhan, dengan sedikit atau tanpa bagian yang dapat diulang, sama seperti pelukis yang bekerja pada lanskap. Atau mungkin gim seperti Final Fantasy 7 yang menggunakan latar belakang besar yang telah dirender.
Beberapa kamar ini bisa menjadi cukup besar, sering mencakup tiga atau lebih layar lebar. Sekarang jika kita mempertimbangkan latar belakang ini dalam konteks game definisi tinggi modern, mereka akan dengan mudah melebihi ukuran tekstur maksimum yang didukung.
Sekarang, solusi yang jelas untuk ini adalah untuk membagi latar belakang menjadi bagian-bagian yang lebih kecil yang sesuai dengan persyaratan dan menarik mereka berdampingan. Tetapi apakah Anda (atau artis Anda) harus menjadi orang yang membelah semua tekstur Anda?
Jika Anda bekerja dengan API tingkat tinggi, bukankah sebaiknya dipersiapkan untuk menghadapi situasi ini dan melakukan pemisahan dan pemasangan tekstur secara internal (baik sebagai pra-proses seperti Pipa Konten XNA atau saat runtime)?
Edit
Inilah yang saya pikirkan, dari sudut pandang implementasi XNA.
Mesin 2D saya hanya membutuhkan sebagian kecil fungsi Texture2D. Saya benar-benar dapat mengurangi ke antarmuka ini:
public interface ITexture
{
int Height { get; }
int Width { get; }
void Draw(SpriteBatch spriteBatch, Vector2 position, Rectangle? source, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth);
}
Satu-satunya metode eksternal yang saya gunakan yang bergantung pada Texture2D adalah SpriteBatch.Draw () sehingga saya bisa membuat jembatan di antara mereka dengan menambahkan metode ekstensi:
public static void Draw(this SpriteBatch spriteBatch, ITexture texture, Vector2 position, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth)
{
texture.Draw(spriteBatch, position, sourceRectangle, color, rotation, origin, scale, effects, layerDepth);
}
Ini akan memungkinkan saya untuk menggunakan ITexture secara bergantian setiap kali saya menggunakan Texture2D sebelumnya.
Lalu saya bisa membuat dua implementasi berbeda dari ITexture misalnya RegularTexture dan LargeTexture, di mana RegularTexture hanya akan membungkus Texture2D biasa.
Di sisi lain, LargeTexture akan menyimpan daftar masing-masing Texture2D yang sesuai dengan salah satu potongan gambar penuh. Bagian yang paling penting adalah memanggil Draw () pada LargeTexture harus dapat menerapkan semua transformasi dan menggambar semua bagian seolah-olah mereka hanya satu gambar yang berdekatan.
Akhirnya, untuk membuat seluruh proses transparan, saya akan membuat kelas pemuat tekstur terpadu yang akan bertindak sebagai Metode Pabrik. Itu akan mengambil jalur tekstur sebagai parameter dan mengembalikan ITexture yang akan menjadi RegularTexture atau LargeTexture tergantung pada ukuran gambar yang melebihi batas atau tidak. Tetapi pengguna tidak perlu tahu yang mana itu.
Sedikit berlebihan atau apakah itu terdengar oke?