Bagaimana nyala api diimplementasikan dalam Doom di Playstation


Seluruh bab dari Buku Mesin Game saya : DOOM adalah tentang port konsol DOOM dan tantangan yang dihadapi pengembang mereka. Anda dapat berbicara lama tentang kegagalan total dalam 3DO, tentang kesulitan di Saturnus karena pemetaan tekstur affine dan tentang "rekayasa balik dari awal" yang menakjubkan, dibuat oleh Randy Linden untuk Super Nintendo.

Awalnya bergerak ke arah yang mengarah ke malapetaka [1] , para pengembang port untuk Playstation 1 (PSX) kemudian dapat mengubah arah dan menciptakan port yang berhasil di antara para kritikus dan pasar. Final DOOM adalah port true pertama yang dapat dibandingkan dengan versi PC. Sektor warna dengan alpha blending tidak hanya meningkatkan kualitas visual, tetapi juga meningkatkan gameplay dengan menunjukkan kunci warna yang diinginkan. Berkat efek reverb dari Unit Pemrosesan Audio pada konsol PSX, suara telah ditingkatkan.

Tim pengembang melakukan pekerjaan berkualitas tinggi sehingga masih memiliki beberapa siklus CPU gratis yang mereka memutuskan untuk digunakan untuk menghasilkan api animasi di intro dan gameplay . Ini membuat saya kagum sehingga saya memutuskan untuk mencari tahu bagaimana efeknya disadari. Ketika pencarian pertama tidak memberikan jawaban, saya sedang bersiap untuk mengeluarkan debu dari buku MIPS untuk memecahkan file yang dapat dieksekusi, tetapi Samuel Villarreal menjawab Twitter tepat waktu bahwa ia telah menyelesaikan pengembangan terbalik dari versi untuk Nintendo 64 [2] . Sudah cukup bagi saya untuk hanya membersihkannya sedikit, menyederhanakan dan mengoptimalkannya.

Sangat menarik untuk menemukan kembali efek demoscene klasik ini; ide yang mendasarinya mirip dengan riak air pertama, yang dimasukkan dalam serangkaian program wajib bagi banyak pengembang tahun 90-an. Efek api menjadi saksi hidup saat kombinasi palet warna yang dipilih dengan cermat dan trik sederhana adalah satu-satunya cara untuk mencapai hasil yang diinginkan.

Ide dasar




Pada intinya, efek api menggunakan peta ketinggian sederhana. Array ukuran layar diisi dengan 37 nilai dalam rentang dari 0 hingga 36. Setiap nilai dikaitkan dengan warna dari putih ke hitam, dan menangkap kuning, oranye dan merah di sepanjang jalan di antara mereka. Idenya adalah untuk mensimulasikan suhu partikel api yang naik dan secara bertahap mendingin.


Frame buffer diinisialisasi sepenuhnya hitam (diisi dengan nol) dengan garis putih piksel putih di bagian bawah (36), yang merupakan "sumber" nyala api.


Setiap kali layar diperbarui, "panas" naik. Untuk setiap piksel dalam buffer bingkai, nilai baru dihitung. Setiap piksel diperbarui dengan mempertimbangkan nilai yang terletak tepat di bawahnya. Dalam kode tersebut, sudut kiri bawah adalah indeks nol array, dan sudut kanan atas memiliki indeks FIRE_HEIGHT * FIRE_WIDTH - 1.

function doFire() { for(x=0 ; x < FIRE_WIDTH; x++) { for (y = 1; y < FIRE_HEIGHT; y++) { spreadFire(y * FIRE_WIDTH + x); } } } function spreadFire(src) { firePixels[src - FIRE_WIDTH] = firePixels[src] - 1; } 

Perhatikan bahwa baris 0 tidak pernah diperbarui (iterasi di atas y dimulai bukan dengan 0, tetapi dengan 1). Garis yang diisi nol ini adalah "generator" api. Versi sederhana dengan pendinginan linier (- = 1) memberi kita keluaran seragam yang membosankan.


Kami dapat sedikit memodifikasi fungsi spreadFire () dan mengubah tingkat peluruhan nilai panas. Menambahkan keacakan sangat cocok.

  function spreadFire(src) { var rand = Math.round(Math.random() * 3.0) & 3; firePixels[src - FIRE_WIDTH ] = pixel - (rand & 1); } 


Itu sudah lebih baik. Untuk menyempurnakan ilusi, orang dapat secara acak mendistribusikan tidak hanya ke atas, tetapi juga ke kiri dan kanan.

  function spreadFire(src) { var rand = Math.round(Math.random() * 3.0) & 3; var dst = src - rand + 1; firePixels[dst - FIRE_WIDTH ] = firePixels[src] - (rand & 1); } 


[Catatan jalur: Youtube sangat mencubit video, lebih baik untuk menonton demo di Javascript di artikel asli atau buka GIF di bawah spoiler.]

GIF Flame Animation (23 megabytes)
gambar

Voila! Perhatikan bahwa dengan mengubah proses perambatan nyala, angin juga dapat disimulasikan. Saya akan meninggalkan ini sebagai latihan untuk pembaca yang telah berhasil membaca artikel.

Kode sumber lengkap




Versi Samuel (secara logis) lebih mirip versi assembler. Jika Anda ingin melihatnya, maka ada versi yang dibersihkan dan disederhanakan.

Referensi




[1] Sumber: Kisah lengkap dirinci dalam Game Engine Black Book: DOOM

[2] Sumber: 25 Maret 2018 Twitter post.

Source: https://habr.com/ru/post/id435122/


All Articles