Oyun geliştirme

Bir strateji oyununun dünya haritası nasıl yapılır?

MKA Engine için gerçek veriden 27.357 konumluk bir 1337 dünya haritası ürettik: arazi, nehirler, boğazlar, nüfus ve konum sınırları nasıl çıkarıldı?

İçindekiler
1337 yılı için üretilen dünya haritasının arazi görünümü: ormanlar koyu yeşil, tarlalar sarı, bozkırlar açık yeşil, geçilmez çöl ve buzullar gri, denizler kıyıdan açığa doğru koyulaşan mavi.

Büyük strateji oynayan herkes haritanın başında saatler geçirmiştir. Ordular haritada yürür, vergi haritadan toplanır, bir nehir saldırıyı yavaşlatır, bir boğaz iki kıtayı birbirine bağlar. Bu türde harita bir arka plan resmi değildir, oyunun tahtasıdır.

MKA Engine için bu tahtayı gerçek dünya verisinden kendimiz ürettik. Bu yazıda, bir oyuncunun gözünden başlayıp bir geliştiricinin merak edeceği ayrıntıya inerek, haritanın nasıl yapıldığını anlatıyoruz. İlk deneme yılı olarak 1337'yi seçtik. Yazıdaki her sayı bu haritadan ölçüldü.

  • 27.357 konum 21.622 kara, 5.735 deniz ve göl
  • 16.384 × 8.192 piksel 45. enlemde bir piksel yaklaşık 1,7 km
  • 410 milyon 1337 nüfus tahmini 21.622 kara konumuna dağıtıldı
  • 3,4 sn haritanın motora girişi iki kurulum bayt bayt aynı
1337 dünya haritası

Harita oyunun içinde ne işe yarar?

Haritayı bir satranç tahtası gibi düşünün; yalnız kareler eşit değil. Her konum tahtadaki bir karedir: bir arazisi (ova, tepe, dağ), bir bitki örtüsü (orman, tarla, bozkır), bir iklimi ve bir nüfusu vardır. Bir ordu bir konumdan komşusuna yürür. Aradaki sınır bir nehri geçiyorsa yürüyüş zorlaşır. Kara ile kara arasında dar bir deniz varsa ordu boğazdan geçebilir.

Motor açısından harita bir ağdır. Düğümler konumlar, kenarlar komşuluklardır. Bir kenar ek bilgi taşıyabilir: nehir geçişi, boğaz, kanal ya da gemiyle gidilebilen nehir. Motor bu ağın üstünde yol bulur, mesafe ölçer, ikmal hattı kurar. Hangi arazinin savaşta ne kadar ceza verdiğine ise oyun karar verir; motor "dağ" kelimesini bilmez, yalnız oyunun tanımladığı arazi türlerini taşır.

Önce gerçek veri, ama yalnız izinli olanı

İlk kural basitti: haritaya giren her veri, ticari bir oyunda kullanılmasına izin veren bir lisansla gelmeli. Kamu malı, CC0 ve CC BY verileri kabul ettik. Ticari kullanımı yasaklayan (NC) ya da türevi aynı lisansla paylaşmayı zorunlu kılan verileri baştan eledik. Bu yüzden bazı ünlü kaynakları kullanmadık; örneğin WorldClim iklim verisi ve OpenStreetMap kıyı çizgileri bu elemeden geçemedi.

KatmanKaynakLisans
Yükseklik ve deniz derinliğiNOAA ETOPO 2022CC0
Kıyı, göl, buzul, günümüz ülke sınırları, deniz adlarıNatural EarthKamu malı
NehirlerHydroRIVERS (HydroSHEDS)HydroSHEDS lisansı; yalnız türev
Büyük göllerHydroLAKESCC BY 4.0
Doğal bitki örtüsüRESOLVE Ecoregions 2017CC BY 4.0
1337'de açılmış tarım arazisiKK10 (Kaplan ve Krumhardt)CC BY 3.0
İklim kuşağıKöppen-Geiger (Beck ve ark. 2023)CC BY 4.0
Ülke nüfusuMaddison Project 2023CC BY 4.0
Tarihsel şehir nüfusuChandler (Reba ve ark. 2016), BuringhCC BY 4.0, CC0
Yer adlarıGeoNamesCC BY 4.0
Haritaya giren veriler

Her dosya, indirildiği gün sabitlenmiş bir parmak iziyle kaydediliyor. Kaynaktaki dosya değişirse boru hattı bunu fark ediyor ve durduruyor.

Dünyayı düz bir kâğıda sermek

Küreyi düz bir dikdörtgene sermenin kusursuz bir yolu yoktur; her izdüşüm bir şeyi bozar. Biz Gall stereografik izdüşümünü seçtik. Boylamlar düz ve eşit aralıklıdır, bu yüzden haritanın doğu ucu batı ucuna dikişsiz bağlanır ve Pasifik'te dolaşan bir gemi haritanın kenarına takılmaz. 45. enlem civarında, yani Avrupa'nın, Anadolu'nun ve Çin'in büyük kısmında, ölçek doğrudur. Kutuplara doğru şişme, sık kullanılan düz enlem-boylam haritasından azdır.

Harita 16.384 × 8.192 pikseldir ve yaklaşık 75° kuzey ile 56° güney arasını kapsar. Horn Burnu içeride kalır, Antarktika ve Svalbard dışarıda.

Geliştiriciler için bir ayrıntı: bütün katmanları önce düz enlem-boylam ızgarasında üretiyoruz, izdüşümü en son adımda uyguluyoruz. İzdüşümü değiştirmek istersek yalnız son adımı yeniden koşuyoruz. Motor da mesafeyi düz haritada ölçmüyor. Her konumun küre üzerindeki konumu kilometre cinsinden verildiği için iki konum arasındaki uzaklık her enlemde gerçeğe yakın çıkıyor.

Arazi: ova, tepe, dağ

Balkanlar, Anadolu ve Karadeniz yakından, arazi görünümünde: her konum kendi arazi rengiyle boyanmış; dağlık konumlar kahverengi, ormanlar yeşil, Karadeniz ve Ege mavi.

Bir yerin dağ mı ova mı olduğunu yalnız yüksekliğe bakarak anlayamazsınız. Konya Ovası deniz seviyesinden 1.000 metre yüksektir ama dümdüzdür. Bu yüzden her noktanın çevresindeki en yüksek ve en alçak yer arasındaki farka bakıyoruz. Fark küçükse ova, ortaysa tepe, büyükse dağ. Yüksek ama düz yerler yayla oluyor.

Bitki örtüsü iki katmandan geliyor. Doğal bitki örtüsü bugünkü ekolojik bölgelerden alınıyor: orman, bozkır, çöl, tundra. Sonra KK10 verisine bakıyoruz. Bu veri, insanların geçmişte hangi oranda ormanı açıp tarla yaptığını yıl yıl tahmin ediyor. 1337'de açılmış arazi payı yüksek olan yerler tarla oluyor, yarı açılmış yerler ağaçlık. Aynı yöntem 1836 haritasında başka bir sonuç verecek.

Kara konumlarının bitki örtüsü (1337) (konum)

02.0004.0006.0008.0007.6664.7183.2272.1001.9661.471432TarlaBozkır ve çayırAğaçlıkOrmanTropik ormanÇölTundra
Kara konumlarının bitki örtüsü (1337)
EtiketKonum
Tarla7.666
Bozkır ve çayır4.718
Ağaçlık3.227
Orman2.100
Tropik orman1.966
Çöl1.471
Tundra432
Kaynak: MKA Engine 1337 harita paketi, 21.622 kara konumu

Bazı konumlara hiç girilemiyor: buzullar, ortalama yüksekliği 5.000 metreyi aşan dağlar ve neredeyse kimsenin yaşamadığı çöller. 1337 haritasında böyle 674 konum var. Kapak görselindeki gri alanlar bunlar.

Haritayı konumlara bölmek

İşin en zor kısmı bu. Bir pastayı dilimlere ayırdığınızı düşünün, ama bıçağı istediğiniz yerden geçiremiyorsunuz. Dilimler aşağı yukarı eşit olmalı, her biri tek parça kalmalı ve kesikler mümkünse doğal çizgilerden geçmeli: nehirden, dağ sırtından, kıyıdan.

Aynı bölge konum görünümünde: her konum ayrı bir renkte. Karada küçük ve sık, açık denizde büyük konumlar; İstanbul Boğazı ve Çanakkale çevresinde konumlar daha küçük.

Yöntem şöyle işliyor:

  1. Önce konumların merkezleri seçiliyor. 1337'de nüfusu 10 bini aşan bilinen şehirler kendi konumlarının merkezi oluyor. Kalan merkezler nüfusa göre dağılıyor: kalabalık yerlerde konumlar küçük, seyrek yerlerde büyük.
  2. Her merkezden su gibi taşan bir dolum başlıyor (bu yönteme "havza" bölümlemesi deniyor). Nehir, sırt ve kıyı bu dolum için yokuş gibi davranıyor; dolumlar en çok bu çizgilerde karşılaşıyor. Sınırlar da oraya oturuyor.
  3. Şehir olmayan merkezler iki kez kendi konumlarının ortasına kaydırılıp dolum tekrarlanıyor. Böylece konumlar daha yuvarlak oluyor.
  4. Kalan küçük kırıntılar komşuya katılıyor, her konumun tek parça olduğu denetleniyor.

Denizde de aynı yöntem kullanılıyor, yalnız hedef büyüklük farklı. Kıyıda ve boğazlarda küçük, açık okyanusta büyük deniz konumları çıkıyor. Görselde İstanbul ve Çanakkale boğazlarının çevresindeki küçük deniz konumlarını görebilirsiniz.

ÖlçüSonuç
Kara konumu sayısı21.622
Deniz ve göl konumu sayısı5.735
Kara konumunun ortanca alanı2.313 km²
Nehir üstüne oturan kara sınırı%28,8
Dağ sırtına oturan kara sınırı%20,3
Kıyıya oturan kara sınırı%15,1
Birden çok parçalı konum0
Bölümlemenin ölçüleri

Bölümlemeyi aynı veriden iki kez koşturduk; iki çıktı bayt bayt aynıydı.

Konumdan eyalete, bölgeden alt kıtaya

Oyuncu 27 bin konumu tek tek yönetmez. Konumlar gruplanır ve gruplar daha büyük gruplara katılır. Bizim haritada dört düzey var: yaklaşık beşer konumluk eyaletler (5.181), onlardan alanlar (912), bölgeler (131) ve alt kıtalar (19).

Dünya haritası bölge görünümünde: kara ve deniz bölgeleri ayrı renklerde, ince siyah çizgilerle ayrılmış. Siyasi sınır yok; bölgeler arazi, iklim ve günümüz ülke sınırlarından türetilmiş.

Gruplar, komşu konumlar adım adım birleştirilerek kuruluyor. Her adımda en uygun komşu çifti seçiliyor. Gruplar derli toplu olsun, benzer büyüklükte kalsın diye uğraşıyoruz. İki konum farklı iklim kuşağındaysa ya da bugünkü bir ülke sınırının iki yanında kalıyorsa birleşmeleri zorlaşıyor. Kara ve deniz hiçbir düzeyde karışmıyor.

Her konumun ve her grubun bir adı ve kalıcı bir anahtarı var: istanbul, canakkale, kobenhaven. Adlar GeoNames'teki yerleşim adlarından geliyor. Bu bir modcu için önemli: harita yeniden üretildiğinde anahtarlar korunuyor. Bir konumun merkezi biraz kaysa bile denememizde anahtarların en az %95'i yerinde kaldı. Kullanılmış bir anahtar başka bir yere verilmiyor; böylece eski bir mod yanlış konumu değiştirmiyor.

Nehirler, boğazlar ve kanallar

Nehirler HydroRIVERS verisinden geliyor. Yeterince büyük bir nehri geçen her kara sınırı "nehir geçişi" olarak işaretleniyor. Ayrıca 1337'de gemiyle taşımacılık yapılan 27 büyük nehri tek tek seçtik: Tuna, Ren, Volga, Nil, Fırat, Dicle, Yangçe, Ganj ve diğerleri. Bunların akışı boyunca 3.036 kara sınırı "su yolu" olarak işaretlendi.

Boğazların bir kısmını adıyla biz tanımladık: İstanbul Boğazı, Çanakkale Boğazı, Cebelitarık, Øresund ve Babülmendep. Gerisini boru hattı buluyor: iki ayrı kara parçası arasında 35 kilometreden kısa bir su geçişi varsa, bu bir boğaz adayıdır. Her kara parçası çifti için yalnız en kısa geçiş alınıyor. Bu kuralla 1.168 boğaz daha çıktı. Süveyş ve Panama ise "kanal" olarak işaretli. 1337'de ikisi de yok; ne zaman açılacaklarına oyun karar verecek.

1337'de dünyada kaç kişi vardı?

Kimse kesin bilmiyor; tarihçilerin tahminleri var. Biz şöyle ilerledik:

  1. Ülke toplamlarını Maddison Project'ten aldık. Maddison'da rakamı olmayan 134 ülke var. Bunların nüfusunu, aynı alt bölgede rakamı bilinen ülkelerin aynı iklim kuşağındaki nüfus yoğunluğundan tahmin ettik ve kayıtta tahmin olarak işaretledik.
  2. Bilinen şehirleri Chandler ve Buringh derlemelerinden yerlerine koyduk.
  3. Kalan kırsal nüfusu kara konumlarına dağıttık. Tarla, ova, nehir kenarı ve kıyı daha çok insan çekiyor; dağ, çöl ve tundra daha az.

Sonuç: 1337 için dünya nüfusu yaklaşık 410 milyon. McEvedy ve Jones'un tanınmış tarihsel nüfus atlası 1340 için 443 milyon veriyor; bizim tahminimiz bunun %7,4 altında. Bu atlası yalnız karşılaştırma için kullandık; haritaya girmedi.

Aynı veriden aynı harita

Çok oyunculu bir strateji oyununda her oyuncunun bilgisayarı dünyayı kendisi hesaplar. Bu yüzden haritanın da herkeste aynı olması gerekir. Bir konumun sınırı bir bilgisayarda bir piksel kaysa, birkaç oyun yılı sonra iki oyuncu farklı dünyalarda oynuyor olabilir. Bunu Çok oyunculu ve tutarlılık günlüğünde ayrıntılı anlattık.

Haritanın her adımı bu yüzden tekrarlanabilir. Rastgele görünen her seçim sabit bir tohumdan geliyor. Harita paketi motora bsm map build aracıyla giriyor. Bu araç konumları ekranda yakın duranlar bellekte de yakın dursun diye yeniden numaralandırıyor, komşulukları ve sınır uzunluklarını çıkarıyor, motorun okuyacağı tabloları yazıyor. Tam harita için bu 3,4 saniye sürüyor. Aracı iki kez çalıştırdık; iki çıktı bayt bayt aynıydı.

Ekranda: Godot

Haritayı ekranda görmek için Godot 4.7 ile küçük bir görüntüleyici yazdık. Fikir, büyük strateji oyunlarının çoğunda kullanılan fikirle aynı: haritadaki her piksel, ait olduğu konumun numarasını taşıyan bir doku. Ekran kartı her pikselde bu numaraya bakıyor ve küçük bir renk tablosundan o konumun rengini alıyor. Bir konumun sahibi ya da harita kipi değişince yalnız renk tablosu değişiyor; yaklaşık 270 MB'lık harita dokusuna dokunulmuyor. Sınırlar da aynı şekilde çiziliyor: bir pikselin komşusundaki numara farklıysa orası sınırdır.

ÖlçümSonuç
Haritanın yüklenmesi0,5 saniye
Ekran kartı belleği280 MB
Bir karenin süresi, bütün dünya görünürken5,2–5,7 ms
Bir karenin süresi, yakın planda1,3–1,4 ms
Görüntüleyicinin ölçümleri

Ölçümler, ayrı ekran kartı olmayan bir bilgisayarda, işlemcinin içindeki AMD Radeon grafik biriminde yapıldı. Bilgisayar ölçüm sırasında başka işlerle de meşguldü. Bu görüntüleyici bir oyun ön yüzü değil, haritayı denetlemek için bir araç.

Neler eksik?

Haritanın bugünkü hâli bir deneme ve eksiklerini saklamıyoruz:

  • Geçilmez çöller fazla geniş. Sahra, Arabistan ve Avustralya'nın içi neredeyse tamamen gri. Gerçekte 1337'de bu çöllerden kervanlar geçiyordu. Eşiği ayarlayacağız.
  • Hazar Denizi ve Sibirya gölleri en yakın deniz bölgesi olan Akdeniz bölgesine katılıyor. Göllerin kendi bölgeleri olmalı.
  • Siyasi sınır yok. 1337 için ticari kullanıma izinli tarihsel sınır verisi bulamadık. Ülkeler ve sınırları, oyunun içeriği olarak elle kurulacak.
  • Hava durumu haritada değil. Mevsimler ve hava değişen şeyler. Bunları sabit bir haritaya gömmek yerine motorun hesaplamasına bıraktık. Haritada yalnız her konumun iklim kuşağı var.
  • 1836 haritası henüz yok. Yöntem hazır, ikinci yıl için verileri değiştirip yeniden koşturmak gerekiyor.

Henüz oynanabilir bir oyun yok. Bu harita, motorun gerçek boyutta bir dünyayı taşıyıp taşıyamadığını sınamak için yapıldı ve sınavı geçti: 27 bin konumluk dünya motora birkaç saniyede giriyor, ekranda da akıcı çiziliyor.

MKA Engine'in genel durumunu MKA Engine sayfasında, motorun neden ve nasıl yazıldığını Oyun motoruna giden yol yazısında bulabilirsiniz.

Kaynaklar

  • NOAA National Centers for Environmental Information (2022): ETOPO 2022 Global Relief Model (30 açı saniyelik sürüm), doi:10.25921/fd45-gt74.
  • Natural Earth (naturalearthdata.com), 10m fiziki ve kültürel katmanlar.
  • Lehner, B. ve Grill, G. (2013): Global river hydrography and network routing: baseline data and new approaches to study the world's large river systems. Hydrological Processes 27(15). HydroRIVERS, HydroSHEDS lisansıyla.
  • Messager, M. L. ve ark. (2016): Estimating the volume and age of water stored in global lakes using a geo-statistical approach. Nature Communications 7:13603 (HydroLAKES).
  • Dinerstein, E. ve ark. (2017): An Ecoregion-Based Approach to Protecting Half the Terrestrial Realm. BioScience 67(6) (RESOLVE Ecoregions 2017).
  • Kaplan, J. O. ve Krumhardt, K. M. (2011): KK10 tarihsel arazi kullanımı, PANGAEA, doi:10.1594/PANGAEA.871369.
  • Beck, H. E. ve ark. (2023): High-resolution (1 km) Köppen-Geiger maps for 1901–2099 based on constrained CMIP6 projections. Scientific Data 10:724.
  • Bolt, J. ve van Zanden, J. L. (2024): Maddison Project Database 2023.
  • Reba, M., Reitsma, F. ve Seto, K. C. (2016): Spatializing 6,000 years of global urbanization from 3700 BC to AD 2000. Scientific Data 3:160034 (Chandler verisi).
  • Buringh, E.: European urban population, 700–2000, DANS, doi:10.17026/dans-xzy-u62q.
  • GeoNames (geonames.org), cities1000, 14 Ekim 2026 dökümü.
  • McEvedy, C. ve Jones, R. (1978): Atlas of World Population History (yalnız karşılaştırma).

Kaynaklar ve ilgili belgeler

Bunlar da ilginizi çekebilir