Oyun Motoru Nedir
Oyun motoru oyundaki evren kanunlarıdır. Dünyamızda doğa kanunları vardır. Yeryüzünde yaşadığımız doğa kanunları. Uzayda var olan doğa kanunları. Güneş yüzeyindeki doğa kanunları. Dünyanın çekirdeğine olan yolculuktaki doğa kanunları. Ve daha bilmediğimiz evrendeki başka yerlerde yer alan doğa kanunları. Örneğin elinizle bir kaygan yüzeydeki kutuyu ittiğinizde kutunun ilerlemesi ve yavaş yavaş durması, aynı şekilde elinizle bu sefer toprak yüzeydeki bir kutuyu ittiğinizde kutunun tepe taklak ola ola ilerlemesi ve yavaşça kendini toparlayıp durması.

Oynadığınız her, gerçekten emek harcandığını gördüğünüz her oyunda bir oyun motoru vardır. Oyun motoru şunları yapar;

a)   Konulan ışık kaynağı hedefindeki nesnelerin parlaması ve arkasına gölge konması
b)   Işık kaynağı hareket ettikçe platformdaki nesnelerin parlaklık yüzeylerinin hareket etmesi ve gölgelerin de aynı oranda hareket etmesi
c)   Platformda gezerken ve sağa sola hareketlerde bulunurken gökyüzü resminin olabildiğince yapaylık sergilemeden hareket etmesi
d)   İtilen bir nesnenin ortamda hava var simulesinin hissedilebilmesi adına belli müddet ilerlemesi ve sonra yavaş yavaş durması
e)   Rüzgar simulelerinin çeşit çeşit noktalarda uygulanması
f)   Bir kavisli yolda örneğin yolculuk ederken kavisli yolu takip eden yanınızdaki kişiyi kavisli yolu takip etmeden dosdoğru çimenlerden giderek aynı hızda geçebilmeniz (yani kısayoldan araç geçebilme simulesi (gerçek hayatta olduğu gibi))
g)   Platformda yürürken sol çapraz ve sağ çaprazdaki nesnelerden çapraz açıdan yakın nesneler daha fazla büyür ve arkalarındaki nesneler daha az büyür, ön taraftaki nesneler dik açıdan yakın nesneler daha fazla büyür ve arkalarındaki nesneler daha az büyür. Yani gerçek dünyada yürürkenki sol / sağ çapraz ve ön taraftaki nesnelerin boyutlarının gözümüze küçük ve sonra büyük gelmesi, yürüme simulesi (canlandırması)
h)   ...

Oyunların üzerine inşa olduğu oyun motorları; evrende gördüğümüz eylemlerin basit manada (ve rastgelelik hissi verecek bir çabayla) x ve y'ler ile kodlanmasına denir. Gezegenimizde deneyimlediğimiz eylemler oyunlarda oyun moturudur. Oyunlar bu hazır oyun motorlarını kullanırlar. Üzerine kendi kurgularına göre nesneler ve senaryolar eklerler.

Günümüzde bütçesi yeten firmalar kişisel kendi oyun motorlarını sıfırdan geliştirip sonra üzerine oyunlarını inşa etmektedirler. Örneğin Crysis Serisi (CryEngine), World of Warcraft (Warcraft3Engine), Grand Theft Auto V (Rockstar Advanced Game Engine), v.b. oyunlar.

Sektörde bu gibi bütçesi olmayan oyun firmaları ise piyasada ürün olarak sunulan oyun motorlarının lisansını alıp geliştirecekleri oyunlarını o oyun motoru üzerinde inşa etmektedirler. Örneğin; Bioshock Serisi (Unreal Engine), Pokeman Go (Unity Engine),... gibi.

Lise'de Fizik dersi görmüşüzdür. Çoğumuz için (benim için de) anlamsız bazı harfler ve ilişkiler:

F = m . a // Hareket Kanunu
X = v . t // Mesafe Kanunu
T = 2.π.√(L/g) // Salınma Kanunu

Bu kanunlar esasında biliyor musunuz dünyada yok. Doğa kanunları (daha net tabirle yeryüzü kanunları) değiller. Sadece yeryüzü kanunlarını anlama noktasında temele indirgenmiş soyut kanunlardır. Bir basamaktır. Dolayısıyla tam da bilgisayar dünyasına uygun kanunlar. Çünkü bu kanunlar doğadaki (yeryüzündeki) kanunların yaptığı eylemleri simule eden (benzer şekilde canlandıran) cinsten eylemler yaptırabilmektedirler. Örneğin X=v.t kanununu ele alalım. Diyelim ki GTA V'de yolda seyir halindeyken ve görev falan da almamışken bir araçla yarışma hırsına tutuldunuz.

Not:
Bu arada GTA V'in yapay zekası yerlerde. Bir görev aldığınızda senaryo gereği araç sizin önünüzde olması gerektiğinden oyun motorunun varlığını göz önüne alıp akıllılık ederek kısa yol geçişleriyle araca yetişseniz dahi senaryo gereği oyun hile yapıyor ve araç abartılı bir dozda göz çıkarırcasına hızlandırılıyor ve sonra tekrar normal hız yarışı konseptine giriyor. Yapay zeka yerlerde.

Araçla aranızdaki mesafe hiç değişmiyor. Geçemiyorsunuz ama o da sizle olan arasını açamıyor. Yolda kavisler mevcut. Siz, dışarda gerçek hayattaki mantıktan hareketle kendinizi yoldan çıkarıp kavisin içerisinden aracınızı sürüyorsunuz. Ve yola çıktığınızda aracın önüne geçmiş oluyorsunuz. Siz bunu yaparken farkında değilsiniz muhtemel ama bu, oyun. Farkındasınız değil mi? Nasıl olur da dünyadaki gibi (gerçekte ki gibi) bu kural işe yarıyor ve kavis içerisine yüklenince geçemediğin rakibini geçiyorsun? Bu, oyun motorudur. Yani doğa kanunlarını işleten kodların yer aldığı dosya kümeleri.

Aşağıda fikir uyandırması açısından C++ dili üzerinden bir oyun motoru algoritma parçası sunulmuştur:

Bir Oyun Motoru Algoritması (misal)
 
// Kutuphaneler.. 
#include ... 

using namespace std;

public class TurOyunMotor{
       protected:
       
       double mesafe;
       double hiz;
       double zaman;
       double guzergah;
       ...

       isikYansi(){
          ...
       }

       golgeKaranligi(){
          ...
       }

       ruzgarOlustur(){
          ...
       }

       suruklenmeYavaslaticisi(){
          ...
       }

       sapakDegerlendir(){
          ...
          if ( guzergah == "baskın" ) {
              trafik.geri();
              exit;
          }
          ...
       }
       ...
}

int main($$1,$$2) {
       Evren dunya = new Evren();

       dunya.calistir();
       ...
}

Aşağıda ise fikir uyandırması açısından yine C++ dili ile oyun motoru dosya kümeleri içerisinde var olması gereken hareket kanunu algoritma parçası sunulmuştur (Not: Hatırlarsanız hareket kanunu x=v.t şeklindeydi. Yani mesafe = hiz * zaman şeklinde. Lise fiziği):

Bir Hareket Kanunu Algoritması (Oyun Motoru İçerisinde)
 

public class hareketKanunu : Public EvrenKanunları {
       public:

       static constant double kural_standart = hiz * zaman;
       static constant double kural_yer = ( hiz * zaman ) - 100;
       static constant double kural_yer_surtunme = ( hiz * zaman ) - 400;
       static constant double kural_yer_kaygan =  ( hiz * zaman ) + 30;
       static constant double kural_hava = ( hiz * zaman ) + 1000;
       static constant double kural_hava_ruzgarli = ( hiz * zaman ) + 700;
       ...

       yurumeIsleticisi() {
           ...
       }

       kosmaIsleticisi() {
           ...
       }

       aracIsleticisi(aracTuru, aracHizi){
           ...
       }
}


Bunlar fikir uyandırmak açısından hazırlanmış / karalanmış algoritmalardır. C++ dili üzerine eğitim aldıysanız ve test amaçlı bir oyun motoru geliştirmek istemekteyseniz (örn; bu tez ödevi olabilir veya hobi olabilir) kendinize 3D simulasyon ortamı sunan bir yazılımda (örn; Unity veya Unreal Engine,.. v.b. bir yazılımda) platform (zemin) koyun. Ve zemine nesneler (internetten kopyalayabileceğiz ağaçlar, kopyalayabileceğiniz arabalar, kopyalayabileceğiniz binalar,...) koyun. Ardından arkaya (kodlamaya) geçin ve kodlamada kendi modülünüzü (yani minicik bir oyun motorunuzu) geliştirin. Bu motor, zeminin tepesine suni olarak yerleştireceğiniz bir ışık kaynağının (nesnesinin) yansımasını yapabilsin. Işık vektörleri platform üzerindeki nesneye vuruyorsa (eşleşiyorsa) nesnenin vuran yüzeyi parlasın (rengi açılsın), vurmuyorsa (eşleşmiyorsa) karanlık yapılsın. Bu şekilde mini oyun motoru ile ufak çaplı bir 3D simulasyonunuz olabilir. Oyun denilen şey ise bu simulasyon üzerine kafada tasarlanan konsepte göre nesneler ve kurgulanmış senaryolar ilave etmeye denir. Yani motorun üzerine kurgu ve konsepte uygun nesneler eklenince bir oyun geliştirmiş oluyorsunuz. Bir motor olmadan bir oyun olmaz. Çünkü günümüzde oyun demek içinde dünya olan bir eğlence demek.

Bilgisayar oyunları %98 Windows platformlar için çıktığından oyun motoru geliştirme dili olarak çoğunlukla C++ dili tercih edilmektedir. Daha kolay bir dil olarak C# tercih edilebilir, fakat bu sizin etkili bir oyun motoru yapmanızın önüne engel olabilir. C++, öğrenmesi biraz çaba isteyen bir dildir, fakat elinizin her yana uzanabileceği, aklınıza gelen fikirleri en ince ayrıntısına kadar kodlayabileceğiniz bir oyun motoru geliştirme imkanı sunar. C# ise kodlaması kolaydır, fakat aklınızdaki fikirleri geliştireceğiniz oyun motorunda gerçeklemeniz konusunda dilin kaba oluşu (yani ince ayar vermiyor oluşu, detaycı olmuyor oluşu) dolayısıyla sizi engelleyecektir. Bir diğer seçenek Java'dır. Java platformlar arası (windows, macos, linux) oyun üretmenizi sağlayan bir dil konumundadır. Fakat benim önerim C++'ı tercih etmeniz yönündedir. Çünkü oyun PC'si denilen şey Windows'tur. Linux veya Macos değildir. Windows ise C++'la daha etkin çalışacağından bu dili seçmeniz önerilir. Örneğin PC oyunu Bioshock serisi "Unreal Engine" adlı oyun motorunu kullanır. Bu oyun motoru ise C++ dili ile yazılmıştır.

Oyun Motoru Geliştireceklere Motivasyon

Yabancıların bir deyimi vardır. Hemen hemen her teknoloji kaynağında geçer (internette ingilizce diliyle yapacağınız ders / çalışma / problem çözümü / .. taramalarında sıklıkla geçer), atıfta bulunulur ve tavsiye edilir:

"Tekerleği her defasında yeniden keşfetmeyin".

Bu söz kendi kitleleri için işlevseldir, ama bizim için bir kanserdir. Yol ikiye ayrılır. Ya temelci olacaksınız ya da mevcut zirve teknolojilere hakim biri olacaksınız. Ama bu söz bize (yani kafalarımıza) diyor ki temelci olmak zordur. Güçtür. Uzundur. Neden bir daha keşfededurasın ki? Çabalayadurasın ki? Var olanı kullan ve üzerine inşa yaparak daha iyisini yap.

Yol ikiye ayrılır. Ya temelci olacaksınız ya da mevcut zirve teknolojilere hakim biri olacaksınız. İkisi de doğrudur. Fakat "tekerleği her defasında baştan keşfetmeyin" cümlesi bize birinciye girmenin akıl karı olmadığını söylemekte.

İki yoldan ikisi de doğrudur. Yani ya temelci olacaksınız ya da mevcut zirve teknolojilere hakim biri olacaksınız. Bunun ikisi de doğrudur. Ama ikisi birden olmaz. Şayet olmayı denerseniz üretim denilen şey sizde olmaz. Sadece bilgi olur. Olunması gereken ya temelci olmak ya da zirve teknolojilere hakim biri olmak. Standart bir insan için ikisinden biri olmalıdır. Standart olmayan (yani daha yüksek seviyede bir zekaya sahip olduğunu düşünen) biri bu ikisini de belli ölçüde seçebilir. Burada gerçekçi olmanız gerekir. Eğer ben zekiyim deyip ikisinde de yol almaya çalışırsanız hiçbir halt üretemeyen sadece kitap, sayfa, bilgi olursunuz. Ama ben standardım derseniz ve ikisinden birini seçersiniz zekanız size bir küresel firma ismi ve teknolojisi dahi ürettirebilir. Kendinizi bundan mahrum bırakmak istemiyorsanız ikisini seçip seçmeme kararını buna göre vermeniz gerekir.

"Oyun motoru bir defa kodlanır ve her yeni oyun onun üzerine inşa olur." "Framework bir defa kodlanır ve her yeni uygulama onun üzerine inşa olur" "Tekerleği her defasında yeniden keşfetmeyin".

Psikolojik bir duvar. Oyun motoru geliştirmek o kadar güç ki "oyun motoru bir kez kodlanır ve sürekli aynısı kullanılır". Hayır. Oyun motoru bir defa geliştirilir ve aynı motor defalarca kullanılarak üzerinde birçok oyun yapılır, doğru. Bu bir firma bazında geçerli bir önermedir. Dünyanın geri kalanı için geçerli değildir.

Psikolojik bir duvar. Framework geliştirmek o kadar güç ki "framework bir kez geliştirilir ve sürekli aynısı kullanılır". Hayır. Framework bir defa geliştirilir ve aynı framework defalarca kullanılarak üzerinde birçok uygulama geliştirilir, doğru. Bu bir firma bazında geçerli bir önermedir. Dünyanın geri kalanı için geçerli değildir.

Psikolojik bir duvar. Bir firma, bir ekosistem oluşturur ve oluşturduğu temel üzerinden fabrika gibi sürekli ürün, yeni ürün, daha iyi ürün çıkarır. Bu firma için temeli defalarca yeniden üretmek anlamsızdır. Yanlıştır. Zaman kaybıdır. Para kaybıdır. Akıl karı değildir. Fakat "tekerleği her defasında yeniden keşfetmeyin" kuralı, bu kural, teknolojisini geliştiren firmanın, personellerinin kendisini bağlar. Bu kural teknolojiyi keşfetmemiş firmaları bağlamaz.

Tekerlek bir defa geliştirilir ve üzerine inşa edilecek teknolojiler bunu defalarca kullanır. Bu, bir firma bazında geçerlidir. Dünyanın geri kalanı için geçerli değildir.

Üniversite döneminde her nedense yoğun bir şekilde çevremce ve bilmediğim birçok öğrenci kitlesince bu cümlenin doğru olduğu kanısı baskındı: "Tekerleği her defasında yeniden keşfetmeyin". Bu, bir psikolojik duvar. Bizim hedefimizi, pusulamızı oynayabilen psikolojik bir cümle. Doğru olduğuna inanılan cümle. C How to Program kitabında okumalarım sırasında birer birer sayfaları geçerken defalarca not olarak karşıma çıkan cümle.

Tekerleği her defasında yeniden keşfetmeyin.

Mealen; o kadar zor ki niye sürekli anlamsızca aynı şeyi keşfededurasınız ki? Var olanı kullanın. Var olanı kullanın ve yeni şeyler yapın.

Kitap ilerleyen sayfalarında C kütüphanelerine sıra geldiğinde diyordu ki "bunlar titizlikle hazırlandılar. Hız ve performans açısından uzun uğraşlar sonucunda neticelendirildiler. Baştan yazmaya kalkmayın. Var olanı kullanın." Yani; var olanı kullanın ve bunun üzerine yeni şeyler yapın.

Windows işletim sistemine bakın. Microsoft firması oluşturduğu ekosistemdeki temel üzerinden fabrika gibi sürekli ürün, yeni ürün, daha iyi ürün çıkarmakta. Yani Windows'u çıkarmakta. Fark ettiniz mi bilmem? Notepad'i halen aynı. Basit bir CTRL + Backspace'i halen yapamıyoruz. Yani harf sil değil de kısayoldan kelimeyi komple sil işini. Bu işi yapmayı denediğimizde onun yerine bize bunu üretiyor:⌷ Aynı şekilde windows üzerinde oynanılan bir oyun windows sistem kaynaklarını kullanıyorsa (örn; World of Warcraft gibi) yazı silmede harf değil de kısayoldan komple kelime silmeyi denediğimizde kelimeyi silme yerine ⌷ karakterini bize üretiyor. Eğer windows üzerinde çalışan oyun kendi ortamını açıyorsa o zaman bu ilkellikler yaşanmaz, fakat o zaman da oyun performans kaybı yaşar. Tıpkı bazı oyunların windows fare imlecini kullandırıyor olması ve bazı oyunlarınsa kendine özgü fare imleci kullandırıyor olması gibi. Windows'unkini kullandıranlar performans kaybını göze alamayan oyunlar.

Not:
Linux işletim sistemleri daha dağınık olduklarından, bir firma gibi ekosistemi olmadığından, yani temel ve bina üzerine bir resmi politika olmadığından intizamlı bir gidişatın aksine direk nokta güncellemeler yaparak notepad'inde böyle ilkellikler sergiletmez. Ama dağınıktır. O yüzden problemlidir.

Yani Windows şu an 90'lı yılların temelinde ilerliyor. Onun 30 yıl geriye dönüp mesaisinin tamamını temeli bir daha inşa etmeye çalışması akıl karı değildir. O nedenle framework'ünü bozmadan ince işçilikle yeni ürünler çıkarmaya çalışıyor. Ve diyor ki "tekerleği her defasında yeniden keşfetmeyin". Bize diyor. Onlardaki tekerlek bize geliyor ve diyor ki sen tekerleği keşfetmeye mesaini harcama. Çok zordur. Uzundur. Sen o tekerleğin üzerine bina edeceğin teknolojilere mesaini harca. Akıllıca olan budur. Bu denilen tam bir kelime kurnazlığı sahtekarlıktır. Windows, kaynaklarını para kaybetmemek için temeli bir daha inşa etmek üzerine harcamıyor. Veya ufak ihtimalle harcıyor fakat çok fark ettirmemek için ufak bir mesaiyle çalışmalarını sürdürüyor. Fakat dünyanın geri kalanına "Tekerleği baştan keşfetmeyin" propagandasını içlerinde şu hissiyatla veriyorlar: Keşfetmeye çabalamayın ki keşfederseniz biz ilkel bir teknoloji kullanıyoruz, siz öne geçersiniz.

Yani burada bahsettiğim ilkellik zihinlerde çalışan teknoloji ile mevcut kullanılan teknolojinin arasında uçurum olması. Zihinlerde şu an muhteşem ürünler çıkabilir durumda. Bu teorik ve pratik olarak tamamen mümkün. Ama tekerleği önceden keşfeden firmalar şu an inanılmaz değerlerde gelir kazanmaktalar ve zamanlarını dibe inip temeli yeniden inşa etmeye ayıramamaktadırlar. Çünkü yüzlerce devletin toplam kazancı nispetinde elde ettikleri gelirleri kaybetme toleransları yok durumda. İşte biz, tekerleği yeniden keşfetmeye başlarsak teknolojilerini gördüğümüz için esasında zihnimizdeki teknoloji seviyesiyle harmanlayıp onları geçen ve nirvanalara ulaşacak cinsten bir ürün çıkarabilme potansiyeline sahibiz.

Not:
Üniversiteden, kamplardan, ... çevremle olan irtibatlarımdan gördüğüm şey üretken bir nesiliz. Anlaşılmaz derecede üretken bir nesiliz. 81 ilde üniversite var ve ismi cismi bilinmeyen üniversitelerden üretken insan yığını fırlıyor. Daha önceki nesillerde olmayan bir güç var. Fakat psikolojik cümlelerle ve doğruluğuna inanç vererek gücümüzü yanlış ve işlevsiz kullandırtma çabası var. Bu çabalardan fark ettiğim ve çevremde tesirini gördüğüm tesirli bir tanesini söyledim: "Tekerleği baştan keşfetmeyin".

Peki oyun motoru geliştirmeyi hedefliyorsunuz ve bu alanda çalışma, terleme ve üretim yapmak üzerine yola başladınız. Fakat piyasada şöyle bir gerçek de vardır. Windows, piyasada oyun bilgisayarlarının işletim sistemidir. Bu nedenle geliştireceğiniz veya sonradan bir ekibe dahil olarak geliştireceğiniz motor o işletim sistemi üzerinde çalışacaktır. Fakat bu bir sıkıntı değildir. Siz motor geliştiriyorsunuz. Bunun vereceği tecrübeler dünya yüzeyinde sayılı kimsenin vardığı tecrübelerden olacaktır. Birisi de çıkar işletim sistemini yazarsa işte teknoloji transferleri ile bina dikilir ve kendi işletim sistemimizde kendi oyunlarımızı oynar hale geliriz. Dolayısıyla bakılması gereken tek şey heves edilen ve bunu yapabilirim inancı olan hedef üzerine üretim yapabilmektir. Herkes bu şekilde üretimi temelden veya zirve teknolojilerle yaparsa tecrübe transferleri, teknoloji transferleri ile bir yerli ürün artık sadece yerli ürün kalmaz, zincirleme yerli ürün, birbirini destekleyen yerli ürün, ve tamamen bizim ürün haline gelir. Yani size düşen ekibin bir parçası olmak. Ama üreten bir parçası.

Bir Oyun Örneği

Diyelim ki evde LAN ağınızda ev içi arkadaşlarınızla sadece kendi aranızda bir Counter Strike oynayacaksınız. Tıpkı Internet Cafe'de kendi aranızda oynadığınız gibi.



Bir arkadaşınız der ki oyun kurdum, girin. Diğerleri onun kurduğu sunucuya girerler. Oyun kuran bilgisayar sunucudur. Diğer bilgisayarlar ise oyun kuran bilgisayara (yani sunucuya) bağlanır ve herkes bir noktada buluşmuş olur.

Ev içi ağınızda Counter Strike oynarken bir bilgisayarın sunucu yapılmasının nedeni herkes ortak bir yerde toplansın ki birbirlerini görebilsin diyedir. Örneğin evde 4 bilgisayar olsun. Bir kişi bilgisayarını sunucu yaptı (yani oyun kurdum dedi). Diğer 3 kişi o sunucuya bağlandı. Oyun başladı. A takımı ve B takımı. 2'ye 2 karşılıklı çatışma.

a. Hareket ve Konumlama

A takımındaki JongJong (yani yonyong) bilgisayarındaki Counter Strike uygulamasının üreteceği karakterin ilerleme verilerini x,y ve z koordinat düzleminde peyderpey sunucuya iletecektir. Örneğin A takımındaki JongJong bilgisayarından klavyesiyle (karakterini ilerletme / geriye gitme / çömelme v.b.) hareketler yapacaktır ve konum değiştirmede bulunacaktır. Karakteri 0ncı saniyede (35,48,121) konumunda, 1nci saniyede (45,52,135) konumunda, 2nci saniyede (50,59,142) konumunda seyir halinde olsun. Bu bilgiler A takımındaki JongJong'un bilgisayarından üretildiği her an (yani karakter ilerletildikçe) sunucuya iletilir, ve sunucu veri geldikçe diğer tüm bilgisayarlara bu veriyi dağıtır. Böylece JongJong "a" konumundayken sunucu diğer tüm bilgisayarlara JongJong "a" konumunda der, "b" konumundayken sunucu diğer tüm bilgisayarlara şu an "b" konumunda der, "c" konumuna geçtiğinde sunucu diğer tüm bilgisayarlara JongJong "c" konumuna geçti der.

Yani; A takımındaki JongJong'un bilgisayarında yüklü oyun kendi programı gereği yapılan her hareketi x,y ve z koordinat boyutu düzleminde 0ncı saniyede şu koordinatta, 1nci saniyede şu koordinatta, 2nci saniyede atıyorum siperde (duvar olur, kapı olur, kutu olur) şeklinde veri üretmektedir. Bir koordinat verisi. Üreteç gibi. Bu veri anlık olarak üretildikçe peyderpey sunucuya gider. Sunucu ise kendisine bağlı diğer herkese bu aldığı peyderpey veriyi aynı sırada gönderir. Özetle; evdeki bir kişi karşısında bir diğerini görmeye başladığında esasında olan şey evdeki kişinin gördüğü kişiye ait bilgisayarda üretilen konum bilgisini sunucu ile kendi bilgisayarının alması sonucunda görüş açısına girmesi, ve görmeye başlamasıdır.

b. Görüntüleme

Oyundaki her kişinin klavyesiyle yapacağı hareketler (ilerleme, geriye gitme, çömelme) anlık olarak x,y ve z koordinat verisiyle sunucuya belirli aralıklarla gider ve sunucu bu koordinat verisini diğer bilgisayarlara gönderir. Böylece bir bilgisayar diğer bilgisayarların oyunda nerede olduğunu anlık koordinat akışları ile kendi bilgisayarında görür. Aslında burada olan şey şudur: Diyelim ki oyun başladı ve herkes karakterini / üniforma bilgisini seçti. A takımındaki JongJong sıvışa sıvışa B takımındaki cepheye doğru gidiyor olsun. Bir süre sonra B takımındaki Unyong'u görüyor olsun. JongJong bilgisayarında aslında B takımındaki Unyong'u görmemektedir. Unjong oyun başlarken seçtiği karakter bilgisini tıpkı karakterin konum bilgisini sunucuya gönderir gibi göndermektedir ve sunucu bu bilgiyi tıpkı koordinat verisi gibi diğer tüm bilgisayarlara dağıtmaktadır. JongJong bilgisayarında aldığı konum verilerine göre karşısında Unyong'u görmelidir. Dolayısıyla Unyong'a ait gelen konum verileriyle beraber aynı zamanda o kişinin seçtiği karakter / üniforma verisi de geldiğinden JongJong makinasında yüklü Counter Strike oyununun karakter klasöründeki eşleşen ilgili karakter dosyasını ekranında görüntüler. Yani JongJong kendi makinasında yüklü oyun dosyasını karşısında görüntüler. Ağa bağlı olduğu için Unyong'dan gelen her veriye göre bu karşısındaki karakter hareket eder. Demek istediğim şey Unyong, JongJong'un makinesine girmemektedir. Unyong koordinat verilerini ve karakter seçim verilerini anlık olarak sunucuya göndermektedir ve sunucu ise bu veriyi herkese dağıtırken verilerin görüş açısında duran JongJong bu verilerin karşılığı olan karakter ve hareketlerini kendi bilgisayarında yüklü oyun dosyasının ekranına verdiği nesnede gözlemleyecektir.

Özetle; evdeki bir kişi kendi hakkında anlık verileri sunucuya ve oradan diğer tüm bilgisayarlara gönderir. Evdeki diğer kişi de kendi hakkında anlık verileri sunucuya ve oradan diğer tüm bilgisayarlara gönderir. Bu şekilde herkes anlık verilerini sunucuya ve oradan diğer herkese gönderir. Böylece herkes herkesin verisine anlık olarak sahip olmaktadır. Evde bir kişinin Counter Strike oynu, sunucudan gelen diğer bilgisayar verilerine göre bir başkasıyla koordinat verilerinin yakınlaştığını gördüğünde makinada yüklü oyun dosyalarındaki ilgili karakter dosyasını ekrana getirir ve gelen verilere göre o karakter dosyasını hareketlendirir.

c. Temel Bir Çatışma

Şimdi temel bir çatışma senaryosunun nasıl çalıştığını irdeleyelim. A takımından JongJong karşı takımdan bir düşmanla karşı karşıya geldiğinde faresiyle sol tık yapar. Sol tık ile ateşlediği kurşun bilgisi sunucuya gider. Sunucu bilgisayar ise kendisine gelen bu bilgiyi kendisine bağlı tüm bilgisayarlara anlık olarak dağıtır. A takımındaki JongJong bilgisayarındaki Counter Strike uygulamasının üreteceği kurşun ilerleme verilerini x,y ve z koordinat düzleminde peyderpey sunucuya iletecektir. Örneğin; A takımındaki JongJong'un bilgisayarından ateşlenen kurşun 0ncı saniyede (35,48,121) konumunda, 1nci saniyede (45,52,135) konumunda, 2nci saniyede (50, 59, 142) konumunda,.. Bu bilgiler A takımındaki JongJong'un bilgisayarında üretildiği her an (yani kurşun ilerledikçe) sunucuya iletilir, ve sunucu veri geldikçe diğer tüm bilgisayarlara bu veriyi verir. Böylece kurşun a konumundayken sunucu, bilgisayarlara kurşun a konumunda der, b konumundayken sunucu, bilgisayarlara şu an b konumunda der, c konumuna geçtiğinde sunucu, bilgisayarlara kurşun c konumuna geçti der.

d. Yüzey

Havada kapladığınız alanın sınır koordinatları listesi sizin kurşun yeme yüzeyinizdir. Bu rakamlar aşıldığında / geçildiğinde veya eşleştiğinde (yani teğet geçildiğinde) siz kurşun yemiş olursunuz. Böylece HP sayısal değeriniz 100 birimken hayati bir temas noktasına (karakterin havada kapladığı alan koordinat listesinden kritik olan budur denilen koordinat verisine temas edildiğinde) bu kurşun sizin 50 birim veya 70 birim kadar fazla değerde hp sayınızı düşürebilir. Bu tamamen programcının koyduğu kurala bağlıdır. Yani programcı kritik can kaybı için; kurşun koordinat bilgisi karakterin havada kapladığı alan koordinat listesinden kritik olanına doğru geçmişse 45 birim kadar optimum (ortalama) bir değerde kayıp olsun da diyebilir. Bu, programcıya kalmıştır. Cehennem gibi bir çatışmada gelen kurşun verileri ve karakter koordinatları akışları içerisinde sunucu, temasları gördüğünde (yani kurşun koordinatları ile karakterlerin havada kapladığı alan koordinat listelerinde eşleşmeleri gördüğünde) HP sayısal değerleri düşecek kararını verip ilgili karakterin HP değeri düştü bilgisini "tüm" bilgisayarlara gönderecektir. Çatışma sırasında birçok kişi kurşun yiyecektir ve bu can kayıpları sunucu tarafından "tüm" bilgisayarlara dağıtılıp duracaktır.

e. Sonuç

Unyong, üniformalı bir polis karakteri oynuyor olsun. JongJong konumsal açıdan (verisel açıdan) Unyong'la karşı karşıya geldiğinde JongJong, bilgisayarındaki oyununda yer alan üniformalı bir polis karakteri karşısında görür olacaktır. Unyong faresiyle hareket edip nişan almaya çalışacaktır. JongJong bu hareket verilerini koordinat bilgisi halinde alırken ekranında bilgisayarındaki oyununda yer alan üniformalı bir polis karakterinin veriler doğrultusunda hareket ettirilmesini görecektir. JongJong fırsat vermeden Unyong'a direk nişan alıp kafasına ateş ettiğinde bilgisayarındaki cansız karaktere ateş etmektedir. Fakat bu veri sunucuya gidecektir ve Unyong konumuyla bu kurşun verisi karşılaştırılıp denk gelme kıyaslaması sonucunda kıyaslama tamam denirse Unyong ölecektir ve bilgisayarına öldün verisi gidecektir. Bunun akabinde Unyong'un karakteri ekranında düşecektir. Unyong öldü verisi diğer tüm bilgisayarlara gidecektir ve Unyong'un düşüşünü her bilgisayar görecektir.

Ek: Güvenlik

Online oyun geliştirirken geliştirici; konum akışları, harici nesne konum akışları, cansız nesne konum akışları,... gibi senkron halde herkesin aynı şeyi görmesini sağlayan akışlar ve karar alma mekanizmalarını (örneğin öldün kararını, kurşun yedin kararını, can kazandın kararını) sunucuda yapmalıdır. Eğer X kişisi birini öldürürse ve o kişiye öldün kararı X kişisinin bilgisayarında verilip bu veri sunucu ile o kişiye gönderilirse herhangi bir oyundaki kişi bilgisayarında yüklü oyun dosyalarından hangisinin bir karakteri öldürme sonucunda öldün mesajı yolladığını tespit edip bunu kendi yazdığı programlarla çoğaltabilir, kontrollü şekilde kullanabilir ve bu hileyle diğer herkese öldün mesajı gönderip öldürebilir. Sunucu ise herkesi öldürebilme başarısı gösterebilmiş (yani herkese öldün mesajı gönderebilmiş) bu kişiye ödüller yağdırabilir. Bu nedenle "kontrol" ve "karar" sadece ama sadece sunucuda verilmelidir. Diğer herkes ama herkes sadece ve sadece sunucudan gelen neticeyi doğru kabul etmelidir.

Dipnot: Counter Strike oyunu Valve firmasının geliştirdiği Source adlı oyun motoru üzerine inşa edilmiştir.

Ekstra

Oyun motoru geliştirme üzerine VESTEL firmasının katkılarıyla CHIP TV'de verilen 40 dakikalık "Oyun Motoru Nasıl Geliştirilir" konuşmasını aşağıdan izleyebilirsiniz.



Yararlanılan Kaynaklar:

Bu yazı 30.06.2019 tarihinde, saat 02:04:19'de yazılmıştır. 06.11.2019 tarihi ve 14:21:17 saatinde ise güncellenmiştir.
Yazar : Hasan Fatih ŞİMŞEK Görüntülenme Sayısı : 259
Yorumlar
Henüz yorum girilmemiştir.
Yorum Ekle
*
* (E-posta adresiniz yayınlanmayacaktır.)
*
*

#Arşiv


#Giriş

ID :
Şifre :