Bir akşam canım sıkıldığı için başladı.
Bu sitenin ana yapısını bitirmiştim, vaka çalışmaları yazılmıştı ve bir proje bittiğinde ama durmaya hazır olmadığında hissettiğin o huzursuzluk vardı üzerimde. Bir oyun ekledim. Sonra bir tane daha. Sonra duramadım, ve şimdi sekiz tane var, her birinin kendi müziğiyle, hepsi /arcade altında yaşıyor.
Bu, o işin nasıl olduğunun ve oyunları yavaş yoldan yaparken — motor yok, framework yok, sadece bir canvas ve bir sürü matematik — ne öğrendiğimin hikayesi.
Why no engine#
Bariz hamle bir oyun motoruna uzanmak olurdu. Tarayıcıda çalışan iyileri var. Ama bariz hamleyi istemedim — ne yaptığımı, piksel piksel anlamak istedim.
Yani buradaki her oyun saf Canvas ve vanilla JavaScript. Fizik kütüphanesi yok, sprite framework'ü yok, başkasının yazdığı bir oyun döngüsü yok. VOID'de bir asteroit bölündüğünde, onu bölen vektör matematiğini ben yazdım. Kırkayak vurduğun yerden ikiye ayrıldığında, hangi segmentlerin yeni bir yaratığa dönüşeceğine ve boşlukta hangi mantarın belireceğine karar veren benim kodum. Dört hayalet seni bir labirentte kovaladığında, her biri farklı bir kişilikle, onlar elle yazdığım dört küçük karar fonksiyonu.
Bu daha yavaş. Çok daha yavaş. Ama bir şeyi kullanmakla onu anlamak arasındaki fark bu — ve anlamak, bu işi yapmamın bütün sebebi. Koda gelmeden önce yıllarca jeolojiyle uğraştım, ve beni bağlayan şey tam olarak buydu: bir şeyi neden hareket ettiğini bilene kadar parçalarına ayırmak.
The eight#
Hepsi klasik, yeniden yapılmış: VOID (gerçek momentumlu asteroids), SNAKE, PONG (gerçekten yenebileceğin bir AI'ya karşı), INVADERS, BREAKOUT (güçlerle), CENTIPEDE (bölünen türden — örümcekler, pireler ve akreplerle), PAC-MAN (kendi labirentim, dört hayalet AI'sı) ve TETRIS (yedi-torba, wall kick'ler, hayalet parça).
Bazıları kolaydı. SNAKE bir öğleden sonra sürdü. Bazıları neredeyse beni bitirdi — TETRIS, rotasyon sistemi, wall kick'leri ve satır-temizleme zamanlamasıyla, doğru yapması göründüğünden çok daha zor. PAC-MAN'in hayaletlerinin her biri kendi kovalama mantığına ihtiyaç duydu: biri doğrudan üstüne gelir, biri pusu kurmak için önünü keser, biri dolaşır, biri utangaçtır ve yaklaştığında kaçar. O son detay — utangaç olan — orijinalleri canlı hissettiren şey, ve ancak yeniden yapmaya çalıştığında değerini anlıyorsun.
En zor kısım genelde dengeydi. Bir oyun mekanik olarak doğru olabilir ama yine de eğlenceli olmayabilir. INVADERS, sürü inceldikçe hızlandırana kadar ağır hissettirdi — o sürünen ivme, orijinalin bütün gerilimi. PAC-MAN her şeyi yavaşlatıp labirenti genişletene kadar çok hızlı ve çok sıkışıktı. Bu sayıları düşünerek bulmuyorsun. Kendi oyununu doğru hissedene kadar tekrar tekrar oynayarak buluyorsun.
The sound is code too#
İşte en gurur duyduğum kısım: seslerin hiçbiri dosya değil. Hiç .mp3 yok, sample yok, kayıt yok. Her ses efekti ve müziğin her notası tarayıcıda canlı olarak Web Audio API ile üretiliyor — osilatörler ve gürültü, bliplere, sweep'lere ve davullara şekillendirilmiş.
Bu, küçük bir müzik motoru yazmak demekti. Zamanda biraz ileriye bakıp notaları kuyruğa alan bir zamanlayıcısı var — ritim sıkı kalsın diye — dört kanalı (bir kare-dalga lead, bir üçgen bas, perküsyon için bir gürültü kanalı, bir arpej) ve anlık tempo değiştirme yöntemi. Sonra üstüne sekiz tema besteledim — oyun başına bir tane, her biri farklı bir ruh halinde. VOID itici ve gergin. SNAKE neşeli. INVADERS karanlık ve sürü yaklaştıkça hızlanıyor. TETRIS, seviyeyle hızlanan hipnotik bir folk teması. Hiçbiri orijinallerin kopyası değil — Tetris'in meşhur melodisi birinin aranjmanı, o yüzden aynı ruhta kendi şeyimi yazdım.
Yazdığın bir melodiyi, tamamen matematikten yapılmış, yine senin yazdığın bir oyundan duymak ne kadar tatmin edici, anlatamam. Müze enstalasyon işimde kovaladığım hisse en yakın şey bu — yanıt veren, sesi olan bir şey inşa etmek.
What it's for#
Bir portfolyo ne yapabildiğini göstermeli. Sana etkileşimli şeyler yaptığımı, Unity ve fiziksel enstalasyonlardan geldiğimi, bir şeyin sadece çalışıp çalışmadığını değil hissini de önemsediğimi söyleyebilirim. Ya da önüne her birinin kendi müziği olan sekiz oynanabilir oyun koyup, kendin keşfetmene izin verebilirim.
İkincisinin daha iyi olduğunu düşünüyorum. Bir şeyleri duyarlı ve canlı yapma konusunda bildiklerimin çoğu bir vaka çalışmasına sığmıyor — zamanlama, geri bildirim ve zorluk hakkında ancak oynayarak hissedebileceğin binlerce küçük kararda yaşıyor.
Yani: git oyna. PONG AI'sını yen. CENTIPEDE'de mantarlar seni ezmeden ne kadar ilerleyebildiğine bak. Müziği aç. Hepsi şu anda tarayıcında çalışıyor, ve her pikselini ve her notasını ben yazdım.
Yaklaşık on dakika canım sıkıldı. Sonra bir arcade yaptım.