Jumat, 17 Mei 2013

Algoritma Game 2 Dimensi

Generasi pertama dari video game adalah semua dua dimensi. Representasi internal dari permainan
dunia hanya memiliki dua sumbu paling (biasanya naik-turun atau kiri-kanan). Beberapa game, seperti Diablo, mencoba untuk memberikan ilusi kedalaman dengan menggunakan perspektif isometrik, tapi itu semua membuat-percaya.
Permainan dua dimensi sebagian besar pergi dari platform high-end seperti PC dan konsol. Namun,
ada banyak kegunaan lain dari teknologi dua dimensi, yang masih tersisa saat ini. Game dalam genggaman telepon, dan bahkan televisi interaktif hanya beberapa skenario di mana 2D masih jalan
untuk dikembangkan. Selain itu, pembatasan yang ketat yang dikenakan oleh aturan pemrograman 2D adalah latihan yang baik untuk setiap programmer permainan modern. Banyak optimasi dan teknik yang ditemukan dalam judul 2D masih digunakan dalam platform yang lebih canggih saat ini.


Pada perangkat lama

Dalam usia game 2D, komputer dibatasi oleh CPU lambat dan ukuran memori kecil. Sinclair ZX
Spectrum, misalnya, menggunakan Zilog Z80 prosesor 8-bit berjalan pada 4,77 MHz dan termasuk 48KB RAM. Dalam arena konsol, asli Nintendo Entertainment System (NES) berlari pada chip 6502. Jadi, permainan pemrograman benar-benar kasus menciptakan rinci, lingkungan yang kaya pada platform yang sangat ketat. sebagai Misalnya, gambar 640x480 khas diambil dari kamera digital, menurut standar pencitraan saat ini, cukup rendah resolusi. Tapi disimpan dalam 24-bit warna, gambar yang akan memakan waktu sekitar 900KB-sekitar 20 kali jumlah memori yang tersedia pada komputer 8-bit klasik. Bahkan, membalikkan persamaan ini, Anda akan menemukan bahwa 48KB tersedia pada mesin ini sedikit dapat hampir tidak memegang gambar 128x128 menggunakan 24 bit per pixel untuk warna. Dan itu dengan asumsi kita bisa menggunakan semua memori untuk bitmap, melupakan tentang sistem operasi (OS) dan kode program utama! Ukuran memori hanya salah satu masalah coding untuk mesin 8-bit. Anda mungkin menganggap bahwa mereka 48KB RAM akan diatur dengan cara yang intuitif, seperti array linier Anda bisa bebas mengalokasikan. Tapi tidak, pemetaan memori lama-sekolah itu lebih kompleks. Memori biasanya terfragmentasi ke bagian disediakan untuk tujuan tertentu. Bagian dari ruang pengalamatan diambil oleh OS, bagian itu didedikasikan untuk vektor interupsi (yang memegang kode mesin untuk rutinitas tingkat rendah seperti tombol yang ditekan dan hardware timer), dan bagian yang didedikasikan untuk perangkat seperti palet warna, dan sebagainya. Coding untuk satu
Platform tersebut terlibat mengetahui peta memori yang sangat baik, sehingga programmer mengerti diaman sesuatu bisa ditempatkan. Ini mungkin terdengar seperti sejarah bagi banyak programmer, tetapi itu lebih baru daripada yang Anda pikirkan. IBM PC adalah kode cara ini untuk usia sampai Windows 95 (dan karenanya DirectX) datang. Dalam daftar berikut, Anda dapat melihat peta memori tradisional dari mesin PC yang kompatibel,
dengan vektor interupsi (IV), mengganggu layanan rutinitas (ISRS), dan frame buffer di alamat A0000H.

1 Mb       = 0x10000:0000
1 Mb-1    = 0xFFFF:000F End System BIOS area
896 Kb       0xE000:0000 Start System BIOS area
896 Kb-1 = 0xDFFF:000F End Expansion card BIOS area
768 Kb       0xC000:0000 Start Expansion card BIOS area
768 Kb-1 = 0xBFFF:000F End Video RAM
640 Kb       0xA000:0000 Start Video RAM
640 Kb-1 = 0x9FFF:000F End DOS RAM
0 Kb           0x0000:0000 Start DOS RAM


Sebagai catatan akhir pada memori, penting untuk memahami bahwa banyak sistem tidak memiliki "sekunder penyimpanan, "seperti hard drive di mana Anda dapat menyimpan data dan swap dalam saat runtime. Dalam permainan modern, hanya data untuk tingkat saat ini biasanya diadakan di memori, setiap kali seorang pemain kemajuan satu tingkat, data lama adalah memerah keluar meninggalkan ruang untuk data baru. Banyak mesin lama tidak memiliki sistem berkas. Data dan kode yang disisipkan dalam suatu keseluruhan yang utuh, dan programmer harus berhati-hati bahwa kesalahan coding tidak mengakses zona data. Mesin ini datang dengan loader program yang pada dasarnya membuang data dari fisik media (kaset, cartridge, dan sebagainya) ke memori utama.
Pengecualian untuk aturan ini adalah konsol game, yang tidak perlu memuat memori karena cartridge adalah memori, dan PC IBM, yang memiliki sistem file yang masuk akal berkat DOS. Hari ini, sulit untuk memahami apa artinya kode untuk beberapa perangkat keras yang lebih tua. Kecepatan CPU sekarang
diukur dalam gigahertz, tetapi beberapa mesin yang lebih tua hampir mencapai skala megahertz. Namun, ada lebih untuk pemrograman dari kecepatan mentah. Apakah Anda ingin kode permainan seperti Asteroid, dengan sederhana namun elegan fisika dan inersia? Jika Anda mencoba itu sebagai latihan, Anda pasti akan membutuhkan fungsi trigonometri seperti sinus dan cosinus. Mereka mengatur arah (diberi sudut yaw dan kecepatan) dengan menggunakan Persamaan populer:

X=x+speed*cos(yaw)
Z=z+speed*sin(yaw)


Tanda-tanda Matematika dan mana sumbu Anda memanggil X atau Z dapat bervariasi tergantung pada konvensi yang Anda ikuti. Tapi jantung persamaan harus akrab bagi Anda. Sekarang, mari kita berhenti dan menganggap bahwa sederhana namun iblis persamaan. Anda dapat melihat bahwa kita perlu dua evaluasi trigonometri, dua mengalikan, dua tambahan, dan dua penerima pengalihan variabel. Cukup sederhana, bukan? Tapi situasi jauh dari ideal, terutama di komputer 8-bit.
Untuk mulai dengan, bayangkan bahwa Anda tidak memiliki mewah unit floating-point yang melakukan dosa dan cos untuk Anda. Mendapatkan sakit kepala? Yah, aku bisa mendengar pembaca maju menyuruhku kembali ke tabel lookup sebagai gantinya. tapi tunggu, masih ada lagi. Bayangkan bahwa Anda tidak memiliki instruksi floating-point seperti multiply dan Selain itu. Untuk membuat keadaan menjadi lebih buruk, juga membayangkan bahwa Anda tidak memiliki angka floating-point, melainkan
memiliki nilai integer 8-bit saja. Apakah ini terdengar seperti mission impossible? Nah, itulah permainan dunia programmer tinggal di selama sekitar 15 tahun, dan beberapa dari mereka pada platform sederhana masih kode di bawah ini pembatasan hari ini. Dalam bab ini kita akan membahas struktur data yang membuat game-game ini mungkin. Kami kemudian akan bergerak pada algoritma klasik, dan membungkus dengan ringkasan populer efek khusus 2D usia. Secara keseluruhan, ini harus memberikan gambaran yang baik dari 2D algoritma pemrograman game.
 


Struktur Data untuk Games 2D
 

Kita telah melihat bagaimana hardware merupakan faktor pembatas utama untuk pengembangan game. Jelas, coding Quake pada Suara 48KB seperti tantangan yang bagus. Tapi game 2D menggunakan struktur data sederhana dan lebih kecil, dan lessinvolved rutinitas daripada lebih maju judul 3D. Kita sekarang akan mempelajari unsur-unsur pokok dari klasik 2D game. Mendefinisikan struktur untuk tiga elemen kunci di sini adalah penting: 

- Sebuah cara untuk mengkodekan grafis karakter 
- Sebuah cara untuk mengkodekan gambar latar belakang
- Sebuah cara untuk menyimpan peta permainan
 


Karakter Sprite Berbasis
 

Mari kita lihat kembali pada waktunya untuk melihat bagaimana karakter diwakili pada hari-hari awal animasi industri. Pada hari-hari Walt Disney, setiap frame masing-masing karakter dilukis pada lembaran plastik dengan daerah transparan di mana karakter akan "melihat melalui." Untuk menghasilkan ilusi animasi, gambar yang berlapis dan gerakan disimulasikan dengan menukar frame dari setiap animasi. teknik ini dikenal sebagai animasi cel, dari lembaran plastik digunakan di dalamnya.
Analog dengan lembaran plastik, game 2D menyimpan setiap karakter dalam persegi panjang, bitmap grafis, sehingga dapat ditarik dengan cepat pada layar. Informasi tambahan memungkinkan kode permainan untuk mendeteksi daerah transparan, sehingga karakter kita berbaur mulus dengan latar belakang. Kemudian, hardware dan software khusus digunakan untuk membuat lapisan ini ke layar. Setiap bitmap tersebut (dengan keterbukaan informasi yang terkait) adalah disebut sprite. Nama berasal dari hari-hari awal game 2D. Karena kebanyakan game yang terlibat hantu, sprite, dan ksatria, grafis mengadopsi nama. Sprite dapat disimpan dalam berbagai cara tergantung pada perangkat keras. Sebuah ponsel dapat memiliki hitam andwhite, Layar 200x150 piksel, sedangkan beberapa game sprite lebih baru pada PC dapat berjalan pada 800x600, 24-bit warna dengan efek alfa. Sekali lagi, memori dan kinerja CPU adalah faktor pembatas. Mantan akan menempati 30.000 bit (hitam dan putih memerlukan satu bit per pixel saja), yaitu sekitar 4KB. Opsi terakhir akan lebih dari 1MB. Selanjutnya, saya akan membahas beberapa format yang telah populer selama bertahun-tahun.
 

Format pertama menyimpan sprite dalam warna hitam dan putih (atau dua warna yang diberikan), dan membatasi ukuran sprite untuk kelipatan delapan. Beberapa ponsel, serta 8-bit mesin seperti Spectrum, mendukung format ini. sekarang sangat nyaman karena setiap pixel dalam sprite bisa disimpan dalam satu bit, dan menjaga ukuran dalam kelipatan delapan membuat sprite lebih mudah untuk menyimpan dalam bytes. Spectrum, misalnya, digunakan 8x8, sprite dua warna. Latar depan dan warna latar belakang yang dipilih dari palet 16-warna, sehingga masing-masing membutuhkan 4 bit, untuk jumlah byte tambahan. Secara keseluruhan, format ini menggunakan 9 byte per sprite saja. Karena frame buffer adalah 256x176 pixel, atau sprite 32x23, frame buffer seluruh menempati sekitar 6KB (jika sprite
"diratakan" sehingga kita memiliki gambaran layar). Untuk meningkatkan efisiensi, banyak mesin 8-bit tidak memiliki frame buffer, tetapi dapat bekerja dengan meja ubin dan buffer memegang hanya pengidentifikasi sprite. Ini adalah halnya dengan NES (lebih pada arsitektur dapat ditemukan dalam Bab 1, "Kronologi Game Pemrograman "). Dengan asumsi resolusi yang sama sebagai Spectrum dan satu byte untuk setiap sprite, ini sistem perwakilan hanya membutuhkan 736 byte (plus memori sprite). Apapun metode yang Anda pilih, jejak memori rendah datang pada biaya. Setiap persegi 8x8 hanya bisa menampung dua warna, secara signifikan merendahkan kekayaan visual.
 

Sebuah pilihan yang lebih terlibat dapat digunakan jika Anda bekerja pada sebuah display adapter yang mendukung palet 16
warna, langsung mappable untuk setiap pixel (sehingga Anda dapat menampilkan lebih dari dua warna per sprite). Di bawah ini keadaan, setiap pixel dapat dikodekan untuk 4 bit, dan setiap dua piksel mengambil satu byte. Jadi, dalam hal ini, pembatasan adalah bahwa ukuran sprite perlu menjadi kekuatan 2 (8, 16, 32, 64 ...). Sebuah sprite 8x8 maka akan membutuhkan sebanyak 32 byte. Sekali lagi, layar 256x176 akan mengambil 23KB, sekitar empat kali lebih banyak ruang daripada
kasus sebelumnya. Tapi kita bisa mewakili adegan jauh lebih kaya. Membangun pendekatan terakhir ini, kita dapat mengkodekan sprite mendukung sampai 256 warna per pixel. warna-warna ini biasanya datang dari palet tetap atau palet secara bebas didefinisikan oleh pengguna. Ini adalah kasus dengan populer 320x200 PC format, di mana setiap entri palet dapat mengkodekan 24-bit RGB triplet. Mengingat pembatasan ini, kami 8x8 sprite Dibutuhkan persis 64 byte, layar dengan resolusi layar Spectrum akan mengambil 46KB, dan sebuah frame buffer PC berjalan pada 320x200 Dibutuhkan persis 64.000 byte. Tambahkan ruang yang diperlukan untuk palet tabel (256 warna 24 bit masing-masing, 768 byte total), dan keseluruhan akan cocok dengan sempurna di 64KB ditemukan di salah satu segmen memori PC kita tercinta.
 

Bergerak naik dalam skala warna kita dapat mengkodekan sprite-warna yang tinggi (16 bit per pixel). Di sini, ada dua pilihan tersedia. Pertama, Anda dapat memilih untuk mengkodekan menggunakan 5-5-5-1 (lima byte untuk merah, hijau, dan biru, ditambah satu untuk alpha). Kedua, Anda dapat mengkodekan menggunakan 6-5-5 dan encode warna transparansi sebagai salah satu warna
kombinasi yang Anda tidak benar-benar menggunakan, seperti dalam pendekatan chroma key.
Dalam dunia yang ideal, Anda bisa menggunakan warna asli sprite, baik dalam 24 atau 32 bit jika Anda ingin bekerja dengan alpha pencampuran. Sangat mungkin, 8 bit untuk alfa akan terlalu banyak, tapi ini memiliki keuntungan bahwa setiap pixel dapat ditransfer dalam satu double word (32 bit), yang nyaman. Namun, pada saat Anda mulai bekerja dengan sprite warna asli, platform perangkat keras Anda kemungkinan besar akan dukungan grafis 3D. Jadi itulah alasan mengapa game 2D menggunakan warna yang benar jauh lebih populer daripada rekan-rekan 8-bit mereka.