hrxdev
Türkçe

#3 Fareyle hapishane inşa edin ve kendiliğinden bulunan odalar

· Nick

İkinci kilometre taşı bitti ve ilk kez bakılacak bir şey var. Godot istemcisi artık simülasyon çekirdeğinin üzerinde duruyor ve fareyle tek katlı bir hapishane inşa edebiliyorsunuz: zemin döşemek, duvar çizmek, kapı koymak, oda işaretlemek, bir şeyleri yıkmak. Her şey sade küpler ve düz renkler; içinde hâlâ kimse yok. Ama bir mekân ve kamerayı içinde gezdirebiliyorsunuz.

Şimdi neler yapılabiliyor

Yeni bir oyun başlatıyor, harita boyutunu (kenar uzunluğu 64, 128 ya da 256 karo) ve isteğe bağlı bir tohumu seçiyor ve boş bir ızgara elde ediyorsunuz. Kamera, sabit eğimli ortografik bir kamera. Kesin 90°’lik adımlarla dönüyor, imlece doğru yakınlaşıyor, tuşlarla ya da orta tuşla kayıyor ve inşa için kuş bakışı bir moda sahip. Serbestçe dönen bir kamerada duvarlar odaları gizlerdi; bu yüzden dönmüyor.

Zeminler ve yıkma bir dikdörtgen alır. Duvarlar bir dış hatta uyar (Shift’e basılı tutarsanız düz bir çizgiye). Kapı bir tıklamadır ve yönünü komşu duvarlardan seçer; çevirmek için bir tuş var. Sürüklerken imlecin altındaki alan hayalet olarak gösterilir: yeşil karolar inşa edilecek, kırmızı karolar atlanacak ve bir etiket kaç tane olduğunu ve nedenini söyler. Siz bırakana kadar dünyaya hiçbir şey gönderilmez ve çekirdek tek bir karonun bile değişmeyeceğini söylerse hiçbir şey gönderilmez. Sağ tık ya da Escape iptal eder.

Dünya modelinde birkaç kat var, bu yüzden bir kat seçici bulunuyor ve içinde bulunduğunuz katın üstündeki katlar gizleniyor. Odaların kendi aracı var; aşağıda anlatılıyor. Bir hata ayıklama katmanı chunk sınırlarını, yürünebilir karoları, imlecin altındaki karoyu ve bir zamanlama panelini gösteriyor. Arayüzdeki her kelime İngilizce.

Önizleme gerçeğin ta kendisi

Sonuçla uyuşmayan bir hayalet, hiç hayalet olmamasından kötüdür. Bu yüzden istemci, bir inşa komutunun ne yapacağını tahmin etmez. Çekirdek, aynı alan için “bunu çalıştırsanız ne olurdu” sorusunu karo karo, reddedeceği her karo için bir nedenle yanıtlayabilir. Önizlemeyi dolduran denetim, komutun gerçekten çalışırken kullandığı kuralın ta kendisidir; yani ikisi birbirinden ayrışamaz. İstemci yalnızca yanıtı çizer. Çekirdeğe yeniden yalnızca yanıtı etkileyen bir şey değiştiğinde sorar: araç, sürüklenen alan, kat ya da haritanın kendisi.

Aynı ilke istemcinin geri kalanını da şekillendirir: dünyanın durumunu okur ve komut gönderir, kendi simülasyon mantığı yoktur. Şimdilik çekirdek ana thread’de tick atıyor ve bir tıklamadan gelen komut, bir sonraki karenin başında, dünya tick atmadan önce uygulanıyor. Dünya insanlarla dolduğunda tick süreleri sıçramaya başlarsa planım çekirdeği kendi thread’ine taşımak; ne zaman yapılacağı için ölçülmüş bir eşikle.

Kendiliğinden bulunan odalar

Oda oluşturmanın iki yoluna baktım. Prison Architect bir bölge çizmenize izin verir; bu bölge kendi karolarına sahip ayrı bir nesne olur. Anlaşılması kolay, ama hapishanede yanlış gidiyor: koca bir hücre bloğu tek bir bölge olurdu ve bir duvarı yeniden inşa ettiğinizde bölgeyi tekrar boyamanız gerekirdi. Diğer yol kapalı alanları otomatik bulmak, ama o zaman etrafında duvar olmayan bir avluyu işaretleyemezsiniz.

Benim seçtiğim bir karışım. Saklanan tek şey her karodaki oda türü: hücre, yemekhane, hamam, revir, görüşme odası, açık hava avlusu ve benzerleri. Geri kalan her şey duvarlardan çıkarılır. Bir alan (space), aynı katta kenarlarından birleşen açık karolar grubudur; haritanın kenarına ya da boşluğa değmiyorsa kapalıdır. Bir oda, bir alanın içindeki aynı türden tüm karolardır. Duvarlar ve kapılar sınırdır; bir duvarın altına boyanan tür korunur ama yok sayılır, dolayısıyla duvarı kaldırırsanız geri gelir.

Bu, kimse anlatmadan doğru hissettiren bir davranış sağlıyor. Bir odanın ortasından duvar çekin: aynı türden iki oda olur. Duvarı kaldırın: birleşirler. Duvarın olduğu yere kapı koyun: hiçbir şey değişmez. Geçerli olmayan bir oda silinmez, çünkü bu “acısız” olmanın tam tersi olurdu; nedenleriyle birlikte kırmızıyla gösterilir: kapalı değil, başka bir türle paylaşılıyor, çok küçük ya da kapısı yok. Bir dikdörtgen boyayabilir, kapalı bir alanın tamamını tek tıkla tek türle doldurabilir ya da temizleyebilirsiniz.

Oda listesi türetilmiş bir veridir; bu yüzden kaydedilmez ve dünya özetine girmez, yalnızca her karodaki tür girer. Komutlardan ve sistemlerden sonra yeniden kurulur ve değişmemiş bir dünyayı denetlemek hiçbir şeye mal olmaz. Bu kilometre taşında değişen kat bütünüyle yeniden hesaplanıyor; bu, 256×256’lık bir haritada yaklaşık yarım milisaniye sürüyor. Chunk chunk yapmak, yol bölgeleri aynı düzeneğe ihtiyaç duyana kadar bekleyebilir. Kendime koyduğum kural, artımlı bir yeniden kurmanın tam bir yeniden kurmayla aynı sonucu vermesi.

Yalnızca değişeni yeniden kurmak, katları bedavaya kesmek

Harita, duvar başına bir nesne olarak değil, kat başına ve chunk başına tek bir mesh olarak çizilir. Her chunk’ın çekirdekte bir sürüm sayacı vardır ve çizici en son hangi sürümü çizdiğini hatırlar. Dünya değiştiğinde yalnızca daha yeni sürümlü chunk’lar bir kuyruğa girer ve kuyruk kare başına bir zaman bütçesiyle işlenir; böylece büyük bir değişiklik tek bir kareyi dondurmak yerine birkaç kareye yayılır. Oda türü boyamak harita sürümünü artırmaz, dolayısıyla mesh oluşturucuyu hiç uyandırmaz.

Kat kesiti de daha az iş yapma fikrini izler. Geçerli katın üstündeki katlar basitçe gizlenir. Geçerli katın duvarları bir shader ile bir metreye basıltılır; tek paylaşılan malzeme ve tek bir yükseklik değeriyle. Yani kat değiştirmek ya da tam duvarları açıp kapatmak hiçbir şeyi yeniden kurmaz. Dört kat arasında geçiş yapmak sıfır mesh yeniden kurulumu tetikler.

On santimetrelik bir boşluk

İlk tek katlı hapishaneyi son kontrolde denediğimde, üst katta bir zemin vardı ve yandan bakınca bir duvarın tepesiyle üstündeki döşeme arasında ince, açık renkli bir çizgi görünüyordu. Bir köşede zemin havada asılı duruyordu. Önce kat kesitinden, sonra z-fighting’den, sonra yumuşatmadan şüphelendim.

Hiçbiri değilmiş. Zemin, kalınlığı olmayan tek bir düz dörtgendi ve kendi katının yüksekliğinin on santimetre üstünde çiziliyordu. Alttaki katın duvarları tam üç metreye kadar çıkıyordu. Sonraki katın zemini üç metre on santimetreden başlıyordu. Boşluk on santimetre genişliğindeydi ve içinden duvarın aydınlatılmış üst yüzü görünüyordu. Yatayda her şey kusursuz hizalıydı; fark etmem bu yüzden uzun sürdü.

Çözüm şu: zemin artık gerçek kalınlığı olan bir döşeme ve katının başlangıcına kadar iniyor. Üst yüz aynı yükseklikte kalıyor, dolayısıyla fareyle karo seçimi ve tüm katmanlar değişmedi. Yan yüzler, bir zeminle bir duvarın aynı chunk içinde değdiği yerlerde atlanıyor ve chunk sınırlarında çiziliyor; böylece bir chunk’ın mesh’i komşularına asla bağlı olmuyor. Bu, döşemenin ucunda on santimetrelik koyu bir kenar bırakıyor. Öncesi ve sonrası ekran görüntülerine baktım ve tutmaya karar verdim. Bir zeminin kenarı gibi okunuyor; zaten de öyle.

Dayanıyor mu

Kilometre taşının son görevi fareyle tek katlı bir hapishane kurup canınızı yakıp yakmadığına bakmaktı. Çoğunlukla yakmadı. Yukarıdaki boşluğun ötesinde bulduğu şeyler küçük ve can sıkıcıydı: fareyle başka bir araç seçtiğinizde araç düğmeleri vurgusunu kaybetmiyordu ve Yeni Oyun penceresinden Escape ile geri çıkmanın yolu yoktu. İkisi de düzeltildi. Bir duraklatma menüsü, ileride yapılacak fikirler listesinde.

Sırada ne var

Sırada M2, hareket ve günlük rutin var. Dünya bölgeler ve erişilebilirlik, katlar arasında çalışan yol bulma ve kalabalıklar için akış alanları kazanıyor. Çekirdeğin her tick’te nihayet yapacak gerçek bir işi olacak, yani kıyaslama eşiği uyumayı bırakacak. Yol haritasına bakın.

← #2 · Tüm devlog yazıları