Sejarah festival seni komputer, juga dikenal sebagai demopati, telah ada selama seperempat abad di negara kita. Orang-orang dari seluruh negeri berkumpul untuk menunjukkan latihan mereka dalam mengekstraksi yang mustahil dari komputer lama atau modern dan sejumlah kecil kode. Dalam periode lima tahun pertama,
CAFe (tiba-tiba,
Festival Seni Komputer ), yang diadakan di Kazan dari tahun 1999 hingga 2003, menjadi salah satu demopati utama di negara ini. Kemudian, dia menghilang dari radar untuk waktu yang lama, memberikan telapak tangan ke
Chaos Constructions dan
DiHalt yang lebih terkenal, dan tahun ini kembalinya dia cukup berjaya - jika tidak dengan skala acara, kemudian dengan jumlah berbagai karya, yang berlangsung hingga enam pagi. Di antara mereka adalah milikku, ciptaannya akan dibahas dalam artikel ini.
Pada demoscene, saya lebih simpatik daripada peserta aktif. Minat utama saya adalah dalam pengembangan game retro dan perangkat lunak suara. Sebelumnya, saya hanya membuat satu
demo penuh bersyarat
untuk telepon merah , yang sejak itu menjadi meme pemandangan, dan sekitar selusin pengantar kecil untuk platform yang berbeda. Penyelenggara
CAFe , yang telah memulai agitasi pribadi para penulis terlebih dahulu, pertama dari jarak jauh, melalui teman bersama, dan kemudian dalam pertemuan pribadi, akhirnya memotivasi saya untuk menciptakan karya pertama saya yang benar-benar lengkap dalam kategori demo berdurasi penuh. Seperti yang terjadi, pada platform lain yang bukan yang paling populer - konsol game
NES /
Famicom , yang paling dikenal dengan nama Dandy.
Perencanaan
Awalnya, saya akan membuat demo lama untuk platform 8-bit yang lebih populer. Tetapi untuk implementasinya, perlu untuk melakukan sejumlah besar pekerjaan penelitian, yaitu, tidak ada pemahaman tentang waktu, kelayakan mendasar ide, atau kualitas hasil yang mungkin. Karena itu, tindakan spesifik diambil dengan sangat lambat. Tenggat waktu mulai habis secara signifikan, dan menjadi jelas bahwa jika saya ingin menepati janji partisipasi, sangat mendesak untuk memilih proyek lain yang lebih dapat diprediksi dalam pelaksanaannya. Setelah memikirkan ide kedua, untuk kategori
Wild , yang juga memerlukan eksperimen, saya memutuskan untuk kembali ke demo kosong lama untuk
NES , dibuat tiga tahun lalu, kemudian untuk
Multimatograf . Akibatnya, mereka sendiri tidak benar-benar digunakan, tetapi arah kerja akhirnya ditentukan.
Rencana untuk melakukan pekerjaan khusus untuk
SEN akhirnya disetujui pada awal Oktober, sampai
CAFe sekitar tiga minggu lagi. Folder proyek dibuat pada 5 Oktober, tetapi beberapa gerakan terjadi sebelum itu.
Pertanyaan pertama yang perlu dipecahkan adalah berapa banyak efek (adegan) yang diperlukan untuk membuat durasi demo cukup untuk mengklaim bentuk besar, daripada intro sederhana. Itu juga diperlukan untuk memahami apa durasi yang cukup ini.
Untuk ini, antara lain, pekerjaan terbaik saat ini untuk platform yang dipilih di
Pouet ditinjau , dan dua yang terbaik dianalisis -
Harapan Tinggi dan
NESPECCY . Yang terakhir, yang merupakan undangan ke demopati yang sama, dirilis pada Desember 2018, dan sampai saat itu entah bagaimana saya tidak menarik perhatian saya. Pada awalnya, itu bahkan sedikit mengenai motivasi, karena saya awalnya menganggap tingkat lebih mudah untuk pekerjaan masa depan saya.
Menurut hasil analisis, ternyata di
Harapan Tinggi ada sekitar enam efek dan durasi 2:45, dan di
NESPECCY sekitar 11 efek dan durasi 3:45. Itu adalah rata-rata sekitar 25 detik per efek. Saya menyarankan bahwa, rata-rata, 10-15 efek akan cukup, berdasarkan pada asumsi bahwa hanya 3-5 dari mereka akan relatif rumit secara teknis, dan sisanya dapat menjadi pengisi sederhana tetapi cantik. Agar tidak menunda tampilan adegan sederhana, rata-rata akan berubah sekitar 15 detik per efek, dengan total durasi demo sekitar dua atau tiga menit yang sama.
Ini diikuti oleh perhitungan berapa banyak waktu yang bisa dihabiskan untuk menciptakan setiap efek. Ternyata satu setengah sampai dua hari, tidak termasuk banyak karya lain yang diperlukan, seperti musik, grafik, semacam ide, dan hanya menyiapkan dasar teknis yang menggabungkan efek. Jadwal seperti itu tidak terlihat sangat realistis, tetapi saya memutuskan untuk membuat sebanyak mungkin efek, mencoba menyesuaikan diri menjadi dua hari untuk masing-masing.
Dengan demikian, tugas prioritas ditentukan - untuk dapat melakukan dalam waktu setidaknya sesuatu yang cocok untuk partisipasi dalam kompetisi, serta mode pengembangan dalam gaya "tidak ada waktu untuk menjelaskan". Ini juga mengesampingkan buku harian pengembangan, dan sekarang Anda harus memulihkan peristiwa dari ingatan, berusaha untuk tidak berbohong terlalu banyak.
Tugas untuk melakukan pekerjaan itu, mengklaim tempat pertama, tidak diajukan. Yang utama bukanlah kemenangan, tetapi partisipasi dan semua itu, dan secara umum kemenangan utama adalah di atas diri sendiri. Saya tidak membuat ramalan khusus berdasarkan hasil kompetisi untuk tidak populernya kategori yang dipilih, berharap bahwa dalam kasus terburuk (terbaik) partisipasi dalam kompetisi beberapa karya yang cukup kuat, tambang akan menjadi pengisi kompos, yang juga diperlukan dan penting, dan jika tidak ada karya, maka saya akan kembali seorang pemenang di antara dirinya sendiri, seperti yang telah terjadi dalam disiplin ilmu lain. Tentu saja, saya ingin memenangkan pertarungan yang layak, tetapi saya sendiri menilai pekerjaan saya lebih rendah dari perkiraan para penonton.
Kode
Setelah tenggat waktu ditetapkan, menjadi jelas bahwa untuk memiliki waktu untuk meningkatkan proyek seperti itu, perlu untuk mengikat dengan perfeksionisme yang tidak sesuai dan tidak mencoba untuk membuat kode demo paling berteknologi atau kompak. Semakin sederhana dan cepat, semakin baik, sambil mempertahankan efek eksternal yang cukup.
Diputuskan untuk memilih konfigurasi yang cukup kuat dan bahkan berlebihan - sebuah mapper
MMC3 dengan 256 kilobytes kode ROM dan 256 kilobytes grafik grafis, dan cobalah untuk tidak khawatir bahwa potensi penuhnya akan tetap belum dimanfaatkan. Konfigurasi ini bukan yang paling canggih dari yang ada dan bahkan lebih mungkin, telah banyak digunakan dalam permainan komersial, dimulai dengan
Super Mario Bros. 3 (1988), tetapi sebelumnya penulis demo untuk
NES terbatas pada pemetaan yang lebih sederhana dan lebih sedikit memori. Hasilnya, 80% volume kode ROM digunakan dan sedikit kurang dari dua pertiga volume grafis ROM. Jumlah memori yang berlebihan membuat kami tidak perlu membuang waktu untuk menyelesaikan masalah kompresi data, meskipun tidak dapat melakukannya tanpa itu.
Metode pengembangan juga jelas - terutama di C, dengan memasukkan assembler sesuai kebutuhan, terutama menyalin ke memori video, interrupt handler dan pemutar musik. Saya sudah lama dan berhasil menggunakan pendekatan ini pada platform retro. Ini sangat menghemat waktu pengembangan, karena prototyping kode dapat dilakukan secara lokal: pertama implementasikan dalam C dan segera dapatkan hasil yang bekerja pada
NES , dan kemudian, jika tidak bekerja cukup cepat, tulis ulang di bagian assembler sesuai dengan templat yang sudah disiapkan, hingga Kecepatan yang dibutuhkan telah tercapai.

Salah satu masalah utama yang diharapkan, yang, bagaimanapun, dalam praktiknya tidak menyebabkan banyak masalah, adalah jumlah RAM utama - di
NES hanya 2 kilobyte, dan dalam pekerjaan saya, saya memutuskan untuk melakukannya tanpa mengembangkannya, meskipun mapper pada dasarnya memungkinkan perpindahan ini. Memori dalam sistem yang didasarkan pada
prosesor 6502, mengingat total kapasitas delapan-bitnya, sering dipertimbangkan dalam halaman 256-byte, dan di dalamnya distribusi RAM ternyata sebagai berikut:
- Satu halaman untuk variabel "cepat";
- Satu halaman untuk tumpukan dan palet perangkat keras (sebagian besar tumpukan tidak digunakan);
- Satu halaman untuk buffer daftar sprite (fitur arsitektur pengontrol video memerlukannya);
- Satu halaman untuk daftar pembaruan memori video;
- Satu halaman untuk daftar parameter untuk efek raster.
Dua yang terakhir dideklarasikan dalam program dalam bentuk array char biasa tanpa tanda 256 byte dan di beberapa tempat juga digunakan kembali untuk keperluan lain. Tiga halaman sisanya diberikan di bawah tumpukan program
cc65 , yaitu, di bawah variabel global dan lokal dari program C.
Perlu dicatat bahwa alokasi dinamis memori (malloc / gratis) pada platform tersebut praktis tidak digunakan, diperlukan solusi statis. Pada awalnya, saya berpegang pada metode menggunakan sebanyak mungkin variabel lokal, yang memungkinkan saya untuk secara otomatis menggunakan kembali memori tumpukan perangkat lunak untuk mereka. Tetapi variabel lokal bekerja jauh lebih lambat, dan sebagai hasilnya, volume yang tersedia untuk variabel global mulai kurang, dan tidak nyaman untuk menulis kode dengan cara ini, berulang kali menggunakan variabel dengan nama yang sama. Kemudian saya menerapkan solusi yang sebelumnya tidak digunakan: sebuah iklan dalam konfigurasi linker dari beberapa segmen RAM yang secara fisik terletak di alamat yang sama. Kelompok variabel yang digunakan dalam efek yang sama ditempatkan menggunakan arahan kompiler di segmen ini, memungkinkan penggunaan kembali memori yang sama.
Masalah lain - distribusi kode program C oleh bank memori kode (
NES menggunakan pengalamatan halaman untuk memori tambahan) - sebelumnya diselesaikan oleh saya dalam proyek lain, dan tidak menyebabkan masalah. Kode untuk ditempatkan di halaman dibatasi hingga 16 kilobyte (ukuran jendela memori yang dapat dialihkan) ke bagian yang dilengkapi secara fungsional, dan disebut dengan metode overlay: halaman yang diinginkan terhubung, kode dari itu diproses, eksekusi kembali ke halaman utama, dan akses memori antara halaman tidak dimungkinkan. Fungsi dialokasikan ke bank secara manual, melalui arahan penyusun. Kode yang diperlukan di semua bagian program, seperti pemutar musik, output sprite dan interrupt handler, terletak di jendela memori non-switchable atas, juga berukuran 16 kilobyte.
Ketika mengerjakan efek terakhir, koridor dengan Mario, saya menemukan pesan kesalahan kompilasi yang menghibur:
label lokal meluap . Seperti yang saya pahami, kompiler memiliki batas internal pada jumlah label lokal yang dihasilkan (tampaknya 65536) di dalam satu modul objek, tetapi saya menggunakan satu modul umum untuk menyederhanakan pengelolaan memori bersama. Salah satu solusi yang mungkin adalah dengan membagi kode menjadi beberapa modul, dan saya sudah berencana untuk menerapkannya, namun, setelah memindahkan satu array konstanta dari sumber di C ke bagian assembler (
incbin dengan label eksternal), masalah teratasi dengan sendirinya, batas berhenti dilampaui, dan bahkan setelah menambahkan beberapa ratus baris kode pesan kesalahan tidak lagi terjadi.
Pengembangan
Dalam pilihan efek ada rencana untuk membatasi diri kita pada yang sederhana, tetapi selalu mulus, bekerja pada kecepatan tampilan penuh (60 frame per detik). Efek demo tradisional seperti plasma dan rotator zoom pada awalnya tidak dipertimbangkan, karena mereka tidak cocok dengan arsitektur set-top box, yang memiliki batasan signifikan pada akses ke memori video - ini akan terlihat buruk dibandingkan dengan platform di mana efek seperti itu berulang kali diimplementasikan dalam semua kejayaannya.
Pada awalnya, saya ingin membuat sebagian besar efek sesuai dengan rencana tiga tahun, berdasarkan manipulasi baris-demi-baris dengan raster yang ditampilkan - mengubah perpindahan vertikal dan horizontal setiap baris, serta tepi grafik yang ditampilkan, sementara sinar melewati raster. Pendekatan semacam itu dapat bekerja berdasarkan satu blok kode yang sama, menghemat waktu pengembangan, tetapi efeknya akan berubah menjadi sangat seragam, dan juga cukup tradisional, ditemukan di banyak karya lain. Selain itu, ada kesulitan men-debug blok kode umum ini, dan sebagai hasilnya, demo hanya menyertakan satu efek dari jenis ini, yaitu cartridge yang berputar.
Mengutak-atik beberapa efek berdasarkan ide-ide lama, salah satunya akhirnya menjadi efek Kirby, dan yang kedua tidak masuk ke demo, saya mulai menulis dokumen teks di mana saya menuliskan semua ide yang datang ke kepala saya, baik untuk efek individu dan untuk konsep umum. Daftar ini mencakup lebih dari 40 efek, sementara dalam karya akhir kurang dari 15 diterapkan. Pada saat yang sama, sebagian besar efek adalah animasi dari satu jenis atau yang lain, meskipun masing-masing variannya cukup unik dan menggunakan berbagai trik untuk memastikan konsumsi memori yang dapat diterima dan operasi yang diperlukan lancar . Juga tidak sengaja terjadi bahwa jenis efek yang paling dominan adalah rotasi sesuatu. Pada prinsipnya, ini adalah kebetulan yang baik, karena semacam kesatuan konseptual muncul.
Intro dengan gajah dikandung dan dibuat, sebagai lelucon tentang topik pekerjaan saya sebelumnya, kemudian efek dengan garis-garis berwarna dan gangguan. Tanpa banyak berpikir, judul kerja,
HEOHdemo , dipilih sebagai kelanjutan dari lelucon dari pendahuluan (DIA BUKAN DIA). Ketika sampai pada realisasi adegan dengan menunjukkan nama, itu disetujui sebagai final, karena tidak ada ide yang lebih sukses pada saat itu, dan tidak ada waktu untuk memunculkannya.
Keputusan spontan dengan demo nama memicu konsep akhir dari semua pekerjaan, yang akhirnya terbentuk sepuluh hari sebelum batas waktu. Ini menyiratkan penggunaan video game yang dikenali dan materi budaya pop, seperti karakter, logo, adegan dari game, tetapi dimodifikasi sedemikian rupa sehingga membuat aslinya sedikit berbeda (seperti "bukan mereka"). Juga diputuskan untuk menyebarkan humor dari adegan awal dan akhir ke seluruh demo, sehingga mengimbangi tingkat teknis yang tidak terlalu tinggi, yang dalam semangat era yang dikutip (pertengahan 90-an), dan menarik bagi khalayak yang lebih luas - lagipula, konsol game lama memiliki sendiri, tidak bersinggungan dengan demoscene dan tidak terlalu tercerahkan dalam teknologi, tetapi audiens yang sangat luas. Sekitar waktu yang sama, diputuskan untuk menggunakan demo inheren tahun 90-an yang membagi ke dalam adegan independen yang terpisah, karena lebih mudah dilakukan dalam waktu yang tersedia, dan ini kemudian sangat membantu dengan bagian musik dan sinkronisasi efek dengan itu.
Ide-ide adegan dengan Vid, logo yang berputar dan sebagian dengan Mario di koridor juga muncul secara alami selama bekerja. Mereka dibuat dari gilirannya, sebagai semacam penundaan - sampai efek yang direncanakan terpaku.
Majelis
Awalnya, jelas bahwa waktu terlama dalam waktu akan mengambil bagian dengan pengantar, judul, salam, dan kredit akhir. Pekerjaan pada mereka dilakukan di tempat pertama, jadi pada beberapa titik ternyata demo sudah memiliki awal dan akhir yang lengkap (sama seperti dalam rilis final), tetapi hampir tidak ada jalan tengah yang hanya satu yang lebih atau kurang siap efek. Tenggat waktu hampir berakhir. Pekerjaan pada proyek berubah menjadi maraton selama berjam-jam, mengambil semua kemungkinan gratis, dan tidak gratis juga, waktu. Efek yang tersisa dalam rencana diurutkan berdasarkan kompleksitas, semua ide disederhanakan sebanyak mungkin. Penyerbu ruang angkasa dibuat, masalah dengan kartrid yang berputar dikalahkan, dan menara yang mudah diimplementasikan dengan derit selesai (bereksperimen dengan penampilan). Ketika efek sudah siap, urutan tampilan mereka ditentukan.
Setiap trifle membutuhkan waktu tiga kali lebih banyak daripada yang terlihat pada awalnya, dan beberapa hari sebelum batas waktu, ketika masih tidak ada setengah dari efek atau musik, ada perasaan kuat bahwa itu tidak akan berhasil. Rencana B dipertimbangkan, untuk menyelesaikan dan mengekspos pekerjaan pada demopati lain, atau di luarnya. Tapi kemudian keputusan yang lebih efektif dibuat: untuk segera mengumpulkan dan menyelesaikan semua yang sudah ada, menjadi setidaknya beberapa kemiripan produk yang siap untuk rilis, bahkan benar-benar bodoh, untuk menulis musik untuk ini, dan jika masih ada waktu yang tersisa setelah itu, coba tambahkan lebih banyak efek. Di antara adegan-adegan tersebut ditambahkan pada saat terakhir adalah Pakman dan koridor, baik dalam versi yang paling disederhanakan dibandingkan dengan ide-ide aslinya.
Metode perakitan ini menyebabkan ketidakcocokan efek yang terlihat di tengah-tengah demo dan perubahan musik yang lengkap antara banyak adegan. Namun, itu membantu menghemat banyak waktu, dan pada kenyataannya pekerjaan itu benar-benar siap untuk dirilis sehari sebelum batas waktu. Waktu ekstra ini dihabiskan untuk menyelesaikan berbagai hal sepele di semua bagian dan dalam musik. Secara khusus, pada saat inilah penjajah dan katak memperoleh penampilan alternatif mereka.
Debugging
Karena kurangnya kemampuan debug pada perangkat keras yang nyata, dan juga perangkat keras itu sendiri, demo didebug secara eksklusif di emulator. Pekerjaan utama adalah di emulator
FCEUX . Ini tidak terlalu akurat, tetapi memiliki debugger yang baik dan dimulai dengan sangat cepat, yang penting dengan metode pengembangan "menambahkan beberapa baris, berjalan, memeriksa." Efek kritis waktu juga
dipertanyakan dalam Mesen ,
punes, dan
Nestopia yang jauh lebih akurat tetapi kurang nyaman.
Karena format demo itu sendiri menyiratkan keinginan untuk mendapatkan dari platform apa yang sebelumnya tidak dilakukan oleh siapa pun, itu menguji keakuratan emulator untuk kekuatan, termasuk dengan menunjukkan ketidaksepakatan mereka tentang berbagai kasus ekstrim. Setelah men-debug efek di satu emulator, Anda bisa mendapatkan artefak di dalamnya di emulator lain. Karena hal ini, dan juga karena fitur arsitektur
NES , banyak efek yang terkait dengan penentuan waktu yang tepat harus berulang kali di-debug. Sebagai hasilnya, saya membuat demo untuk pekerjaan bersih di emulator
FCEUX populer, yang dengannya dikirim ke kontes, dan untuk pekerjaan normal di semua emulator lainnya.
Dari kesalahan menarik yang ditemukan selama debugging, ada masalah dalam adegan dengan logo berputar, memanifestasikan dirinya secara eksklusif di emulator
Mesen . inspired by, , . ,
Mesen . .
NTSC - ,
PAL โ , . ,
PAL -, . , 17% .
โ
NES ,
Famicom AV ,
Pegasus (
Dendy Classic 2 , ). , , , , . , ,
MMC3 Flash -,
MMC3 .
Pegasus , โ . , โ โ .
, , . , , .
Flash -.
ยซ ยป ยซยป. . ' , . , , , , . , . .
NES , , , -. , , , , , . , .
Reaper MIDI-, ,
FamiTracker . MIDI-, Reaper,
FamiTracker .
FamiTracker NES , , , โ , . , . , ยซยป
FamiTracker '
NSF - . , ,
NES .
. .
FamiTracker Zxx , .
. , . ยซ ยป , , .
, , . .
, โ
Graphics Gale , (10). , .
NES Screen Tool .

, , , . , , .
8 32 , PC. . MMC3, ( ), , . , .

, . โ , , .
, , . 12x16 , 8x8, โ . โ 00 99, โ . . , .

, , MMC3, , .
, 32 . 238 , 7 . , , , 53. , PC, , .

Judul
, , .
. . . Blender . , ,
NES Screen Tool โ 82 . , .

, . , , . , , . , .
MMC3 , .
, , ,
Gale . , , .

. .
, . , , .
Karena kurangnya efek dan waktu untuk mengembangkannya, saya memutuskan untuk menggunakan kembali intro kecil yang ditulis beberapa tahun yang lalu, di mana surat-surat terbang di sepanjang jalur yang sama di sekitar logo statis. Baru-baru ini, saya kembali tertarik pada awalan
N64 , yang saya abaikan pada akhir tahun 90-an, dan dalam proses pengerjaan efek lainnya, sebuah ide spontan muncul dengan animasi rotasi dari logo yang terkenal, yang tampaknya sangat sederhana untuk diterapkan - kedua pemikiran ini datang bersamaan, tetapi implementasinya butuh waktu lebih lama dari yang diperkirakan.
Kompleksitas teknis utama dari adegan tersebut adalah pengurangan jumlah memori yang diperlukan untuk animasi yang halus dan besar. Jika Anda menyimpan frame-nya tanpa kompresi, satu frame akan menempati satu set 4-kilobyte (karena dua frame tidak muat dalam 256 ubin), dan itu akan membutuhkan 256 kilobyte ROM grafis, yaitu, semua volume yang digunakan dalam volume demo. Untuk mengatasi masalah ini, tiga trik diterapkan sekaligus: animasi rotasi hanya 90 derajat (64 frame), setelah itu dua warna wajah ditukar; konversi grafis lossy untuk menempatkan kelompok empat bingkai dalam set 256 ubin; serta memperbarui memori video di bagian raster yang terlihat. Dengan demikian, animasi mengambil ruang empat kali lebih sedikit.
Model huruf dan animasi rotasi dibuat di
Blender . Selama dia cermin ide Anda datang yang sesuai dengan konsep demo, dan itu lucu - "dan-dan-and-dan-dan-dan" adegan mengatakan, Bingkai animasi dikelompokkan, kedalaman warna dikurangi menjadi 4, dan gambar-gambar ini dikonversi oleh fungsi impor yang
hilang di Alat Layar NES . Fungsi ini mungkin merupakan senjata rahasia utama saya - jika batas ubin dilampaui selama kompresi, ia mencari ubin visual yang paling mirip dan menggabungkannya sampai jumlah ubin yang diperlukan tetap. Tentu saja, ini memberikan artefak konversi visual dan membutuhkan penyempurnaan manual berikutnya, tetapi memungkinkan Anda untuk memeras gambar yang lebih kompleks dengan sedikit tenaga kerja ke dalam batas.

Untuk animasi logo, set ubin diubah, dan jendela 14 oleh 14 ubin di peta ubin latar belakang diperbarui, yang interupsi MMC3, yang dipicu sebelum baris teks, digunakan. Garis juga mengharuskan pengalihan grafik yang diatur ke font, setelah itu ada keterlambatan dalam kode untuk waktu garis prasasti ditampilkan, maka tampilan mati (warna latar belakang terus-menerus ditampilkan) dan data ditransfer ke memori video.
Koin ditampilkan oleh sprite dan terbang di jalur yang dihitung secara jujur โโ(menggunakan titik tetap). Kode lama telah dimodifikasi sehingga rotasi berlangsung, jika mungkin tanpa berpotongan dengan logo yang lebih besar, serta agar koin muncul dan menghilang secara bertahap pada saat yang tepat. Mereka melampaui grafis logo menggunakan bendera prioritas yang dimiliki setiap sprite.
Kartrid berputar
Implementasi efeknya sangat sederhana dalam kata-kata, tetapi membutuhkan debugging yang panjang. Handler interrupt meluncurkan efek raster pada jalur yang diinginkan (untuk menyisakan waktu untuk utas utama). Selanjutnya, kode dengan pemilihan waktu yang sangat akurat dijalankan untuk mengatur offset vertikal piksel demi piksel dari peta ubin yang ditampilkan untuk setiap baris layar. Ini membutuhkan skema penulisan yang sangat rumit untuk register
PPU , dan beberapa dari mereka harus benar-benar jatuh ke tempat tertentu di telepon. Dalam versi
NTSC dari set-top box, kecepatan jam prosesor dan tingkat pengulangan piksel tidak banyak, dan waktu eksekusi kode dapat sedikit bervariasi tergantung pada beberapa faktor, sehingga penentuan waktu dari setiap baris secara bertahap melayang dan membutuhkan koreksi.
Bagian utama dari grafik untuk adegan ini diambil beberapa tahun yang lalu untuk upaya sebelumnya untuk membuat demo untuk
NES , tetapi sekarang telah dilengkapi dengan wajah kartrid lain dan logo demo. Gambar asli ditumpuk dalam satu layar. Untuk menyederhanakan kode efek, garis yang sama digandakan beberapa kali di bagian belakang kartrid.

Animasi rotasi sepenuhnya dihitung di muka menggunakan program PC dan mengambil sejumlah besar kode ROM - tiga bank masing-masing 16 kilobyte, di mana untuk masing-masing dari 256 frame animasi sebuah tabel disimpan dalam 176 nomor garis raster yang ditampilkan. Itu mungkin untuk membuat efek secara real time, saya sudah melakukan demo serupa untuk platform lain, tetapi dalam hal ini ada cukup memori gratis dan tidak ada waktu tambahan.
Pacman
Awalnya, adegan yang lebih kompleks telah direncanakan, tetapi karena kurangnya waktu, ia memasuki demo dalam versi paling minimalis, dalam bentuk gangguan adegan pada saat perubahan musik.
Masalah utama adalah menemukan cara untuk membuat animasi dengan cepat. Pertama, muncul ide untuk menggunakan
Blender atau program grafis lainnya lagi. Tetapi setelah upaya pertama dan beberapa perhitungan, menjadi jelas bahwa hanya delapan frame animasi membuka mulut dari posisi yang benar-benar tertutup ke posisi yang sepenuhnya terbuka sudah cukup, dan mereka akan jauh lebih mudah dan lebih cepat untuk menggambar secara manual di
Gale .
Selanjutnya, sebuah program ditulis untuk PC, mengambil urutan frame dari siklus animasi penuh dan menemukan frame yang berubah di antara ubin. Alamat ubin ini di peta ubin di memori video disimpan sebagai daftar panjang variabel, efek dalam demo hanya memperbarui bagian yang diubah dari daftar ini. Grafik semua bingkai cocok dalam satu set ubin dan tidak berubah selama efek.

Kirby
Efek ini tidak jelas pada
gambar Catrix lama saya. Ada rencana untuk mengubah gambar wajah kucing menjadi gambar alternatif dengan kucing Cheshire melalui semacam efek visual. Ketika ide muncul untuk menambahkan karakter permainan ke dalam demo, setelah pemilihan singkat - sangat mendesak untuk menggambar dua gambar layar penuh baru - diputuskan untuk mengambil Kirby dan menjadikannya versi "Cheshire". Efek mengubah gambar dalam proses telah disederhanakan menjadi flicker pendek.
Blok gambar bergerak ditampilkan sebagai sprite dan dicetak pada peta ubin ketika mereka sampai ke tempat yang tepat. Demikian pula, penghapusan blok terjadi.
Menara
Saya selalu menyukai efeknya di level akhir permainan
Battletoads , dan saya sudah lama ingin mengulanginya. Dalam demo, ia datang ke suatu tempat di tempat kejadian dengan salam.
Bagian teknis sangat sederhana, ini adalah pengguliran vertikal normal dari lapisan latar belakang. Efek rotasi dicapai dengan animasi grafik ubin, sementara peta ubin tetap tidak berubah. Untuk animasi, mode
MMC3 digunakan dengan empat
CHR windows yang dapat
diaktifkan . Jendela pertama berisi ubin bagian statis, sementara tiga lainnya beralih dengan kecepatan yang berbeda. Salah satu jendela juga dengan lancar mengubah arah animasi. Karena 64 petak ditempatkan di setiap jendela, dan elemen animasi hanya membutuhkan 28, grafik petak digandakan di setiap jendela untuk menerima animasi di arah yang berlawanan.



Masalah utama dalam mewujudkan efek adalah persiapan animasi. Itu dieksekusi oleh program pada PC yang mengambil tekstur 16x16 dan tabel kecepatan untuk setiap kolom piksel pada input, dan menghasilkan blok 16 frame animasi dalam bentuk satu set 256 ubin (beberapa di antaranya kosong). Set dikonversi ke format yang diinginkan dalam
Alat Layar NES dan didistribusikan ke bank-bank grafis ROM dengan offset yang diinginkan melalui opsi direktif assembler
incbin .
Tugas penting lainnya mengenai salam adalah jangan lupa untuk menyampaikannya kepada semua orang yang ingin. Karena jumlah ini cenderung tak terbatas, dan pemandangan yang terlalu panjang akan terlihat membosankan. Saya memutuskan untuk membatasi diri hanya untuk mereka yang telah saya lewati selama setahun. Nama-nama dikumpulkan dalam file teks ketika mereka datang ke pikiran. Tentu saja, setelah menyelesaikan pekerjaan, ternyata saya masih lupa menyebutkan banyak orang.
Koridor
Ada keinginan untuk membuat semacam adegan dengan perspektif, seperti terowongan klasik. Terowongan klasik atau rakester
3D Wolfenstein nyata telah hilang karena kerumitan. Selain itu,
SEN sudah memiliki beberapa rakaster nyata, termasuk tekstur, tetapi semuanya terlihat tidak terlalu mengesankan karena kecepatannya yang sangat rendah.
Saya sangat tertarik dengan grafis tiga dimensi semu di awal permainan, dan di antara perkembangan lama sudah ada koridor sprite dengan animasi bergantian yang halus, terinspirasi oleh permainan
Zig Zag untuk
ZX Spectrum . Diputuskan untuk menggunakannya. Karena koridor abstrak itu sendiri tidak terlalu menarik, sebuah plot internal adegan dengan Mario dan toilet humor diciptakan, yang secara logis menyelesaikannya, serta demo secara keseluruhan. Adegan itu dibuat paling terakhir, dan meskipun menggunakan blanko, mengerjakannya butuh lebih dari 11 jam berturut-turut, tidak termasuk pekerjaan persiapan selama perencanaan.
Semua frame gerak dilacak secara manual di Gale. Ini adalah satu-satunya efek dalam demo, dengan kecepatan di bawah 60 frame per detik, meskipun dapat bekerja pada kecepatan itu tanpa masalah. Untuk alasan keterbacaan visual dan sinkronisasi dengan musik sambil melempar di sepanjang koridor, kecepatan refresh layar dibatasi hingga 30 frame per detik, sebagai alternatif untuk menambahkan fase gerakan menengah, untuk persiapan yang tidak ada waktu tersisa.
Bingkai grafis mengambil dua set ubin. Pada saat-saat diperlukan animasi, lapisan latar belakang diperbarui, set grafis yang diinginkan terhubung dan dua warna diatur dalam dua palet (untuk bagian atas dan bawah layar), karena ketika memutar 90 derajat warna dinding berubah tempat.
Kartu tile animasi pertama kali disalin ke RAM dengan kode di bank tetap dari salah satu dari dua bank plug-in ROM yang lebih rendah. Selama tampilan raster tepat di bawah jendela efek yang ditampilkan, render dimatikan dan data ditransfer dari RAM ke memori video. Mematikan render juga berfungsi sebagai batas bawah dari kliping visual untuk sprite Mario.
Keterangan
Adegan ini adalah salah satu yang pertama, setelah bilah warna, berdasarkan kode dari salah satu proyek lama. Itu sudah memiliki dukungan untuk dua font, palet dan perlambatan yang berbeda pada akhirnya. Untuk demo, font baru digambar, yang digunakan di mana-mana, dan efek ditambahkan di tepi layar.
Pada awalnya saya ingin membuat tepiannya menjadi halus, tetapi selama percobaan pendahuluan saya mencoba opsi dengan offset garis horizontal, saya menyukai hasilnya, dan saya memutuskan untuk tidak menghabiskan waktu ekstra. Naungan sedikit ditambahkan dengan menggunakan fitur kontroversial dari
pengendali video
NES , mendapatkan-mematikan komponen warna. Kontroversi terletak pada kenyataan bahwa di berbagai versi regional dan klon konsol, fungsi ini bekerja secara berbeda, tetapi dalam aplikasi ini seharusnya tidak ada masalah khusus (tidak termasuk yang disebut
PPU RGB , di mana ujung-ujungnya akan diisi dengan warna putih).
Lihat
Sekitar waktu adegan caption dibuat, ide adegan ini muncul secara spontan. Gagasan awal adalah memasukkannya secara acak, tetapi pada akhirnya berhasil masuk ke dalam akhir. Meskipun durasinya singkat, adegan ini terdiri dari tiga elemen: mensimulasikan penskalaan sprite, meningkatkan jumlah nuansa abu-abu dengan bergantian dua frame, dan secara terprogram memainkan sampel
DPCM .
Untuk mensimulasikan penskalaan, fakta bahwa semua sprite besar pada
SEN terdiri dari yang kecil, dalam hal ini ukuran 8x16, digunakan. Jika Anda menggesernya relatif satu sama lain, Anda bisa mendapatkan efek penskalaan atau distorsi, yang terlihat cukup baik dengan nilai perubahan yang kecil. Untuk efek ini, Anda perlu mengalikan offset masing-masing sprite dari pusat dengan skala, tetapi karena prosesor
NES tidak dapat mengatasi sejumlah besar penggandaan bilangan bulat, trik diterapkan - di awal bingkai, kisi koordinat di sepanjang sumbu X dan Y dipertimbangkan, dan output sprite menggunakan nilai yang sudah dihitung sebelumnya. . Dengan demikian, jumlah penggandaan yang dibutuhkan berkurang secara signifikan - dengan semprotan komposit elemen 8x8 (64 sprite), hanya 16 (8 + 8) perkalian yang diperlukan alih-alih 128 (8 * 8 * 2).
SEN hanya dapat menampilkan 4 warna abu-abu, termasuk putih dan hitam. Efeknya meniru 7 gradasi: jika Anda menampilkan piksel putih dan putih melalui bingkai, itu akan menjadi putih, jika abu-abu dan abu-abu itu akan abu-abu, dan jika Anda bergantian putih dan abu-abu, maka secara visual akan terlihat seperti gradasi antara antara putih dan abu-abu. Kesulitan utama lagi adalah persiapan grafis, yaitu dua setengah-frame dari gambar, yang dilakukan oleh sejumlah manipulasi manual di
Gale dan
GIMP . Untuk mengurangi flicker, garis-garis setengah-bingkai bergantian.


Pemutaran program
DPCM diperlukan karena tidak ada ruang untuk sampel dalam format yang lebih baik, dukungan perangkat keras tidak dapat memutar sampel dari bagian bawah memori, tetapi tidak ada ruang untuk sampel dengan panjang seperti itu di memori non-switchable atas. Fragmen suara itu sendiri bukan dari screen saver asli, tetapi jingle terdengar agak mirip dari game terkenal dengan finishing yang kejam, terdengar pada saat finishing yang sebenarnya.
Kartu memori
Dalam perkembangannya, utilitas Space Checker NES terus digunakan, yang memvisualisasikan pengisian bank memori. Sangat menarik untuk melihat contoh yang baik tentang apa dan di mana di dalam program.
PRG00 ...
PRG02 - data musik
PRG03 - sampel adegan dengan Tampilan
PRG04 ...
PRG06 - data animasi rotasi kartrid
PRG07 - animasi ubin jauh ke koridor
PRG08 - animasi rotasi ubin di koridor
PRG09 - kode adegan menara
PRG0A - kode adegan dengan logo yang berputar
PRG0B - kode adegan dengan nama dan koridor
PRG0C - kode adegan dengan kartrid berputar, Kirby, View, invaders, Pakman
PRG0D - kode adegan dengan intro, noise, bar warna, keterangan
PRG0E - bank utama kode, hanya berisi panggilan dari semua adegan
PRG0F - bank kode tetap, pemutar musik, output sprite, interrupt handler
CHR00 - bayi gajah dan ubin untuk garis-garis berwarna
CHR01 - font dan noise
CHR02 - Lihat sprite dan ubin surat berputar dalam nama
CHR03 -
Ubin Kirby Normal
CHR04 - Cheshire Kirby
TilesCHR05 - gambar untuk pemandangan dengan kartrid yang berputar
CHR06 ...
CHR0D - rotating logo animation
CHR0E - font untuk salam dan animasi ubin penyerbu
CHR0F -
Genteng Pakman
CHR10 ...
CHR13 - animasi tekstur menara
CHR14 -
Ubin Koridor
CHR15 -
Sprite Mario
CHR16 ...
CHR1F - tidak digunakan
Alih-alih sebuah kesimpulan
Saya akan mengakhiri dengan memo kombo: dalam situasi apa pun yang tidak dapat dipahami, tulis adegan demo, Tuan-tuan!