tc süleyman demirel üniversitesi fen bilimleri enstitüsü html5 tabanlı

advertisement
T.C.
SÜLEYMANDEMİRELÜNİVERSİTESİ
FENBİLİMLERİENSTİTÜSÜ
HTML5TABANLIOYUNLARİÇİNYAPAYZEKAKÜTÜPHANESİ
BerkanUSLU
Danışman
Doç.Dr.EcirUğurKÜÇÜKSİLLE
YÜKSEKLİSANSTEZİ
BİLGİSAYARMÜHENDİSLİĞİANABİLİMDALI
ISPARTA-2015
©2015[BerkanUSLU]
İÇİNDEKİLER
Sayfa
İÇİNDEKİLER........................................................................................................................... i
ÖZET............................................................................................................................................ iii
ABSTRACT................................................................................................................................ iv
TEŞEKKÜR................................................................................................................................ v
ŞEKİLLERDİZİNİ.................................................................................................................... vi
ÇİZELGELERDİZİNİ.............................................................................................................. vii
SİMGELERVEKISALTMALARDİZİNİ........................................................................... viii
1.GİRİŞ....................................................................................................................................... 1
2.KAYNAKÖZETLERİ.......................................................................................................... 3
3.BİLGİSAYAROYUNLARINDAYAPAYZEKA........................................................... 6
3.1.OyunlardaYapayZeka’nınTarihi..................................................................... 6
3.2.AkademikYapayZekaveOyunlardaKullanılanYapayZeka
TeknikleriArasındakiFarklar.......................................................................... 8
3.3.OyunlardaKullanılanYapayZekaKütüphaneleri..................................... 10
3.3.1.Kythera............................................................................................................... 10
3.3.2.HavokAI............................................................................................................. 11
3.3.3.RAIN..................................................................................................................... 11
3.3.4.Kynapse.............................................................................................................. 12
3.3.5.PathEngine........................................................................................................ 13
3.3.6.MasaLife............................................................................................................ 14
3.3.7.Cyntient.............................................................................................................. 15
3.4.OyunTürleriileYapayZekaİlişkisi................................................................. 15
3.4.1.Aksiyon(Action–FPS,TPS)...................................................................... 16
3.4.2.RolYapmaOyunu(RPG)............................................................................. 18
3.4.3.GerçekZamanlıStrateji(RTS).................................................................. 19
3.4.4.Macera(Adventure)...................................................................................... 23
3.4.5.Platform.............................................................................................................. 24
3.4.6.Spor(Sport)...................................................................................................... 26
3.4.7.Yarış(Racing).................................................................................................. 28
3.5.HTML5veWEBGL’inGelişimi............................................................................ 29
3.6.HTML5OyunMotorları......................................................................................... 36
3.6.1.Construct2........................................................................................................ 36
3.6.2.ImpactJS............................................................................................................. 37
3.6.3.PixiJS.................................................................................................................... 38
3.6.4.PlayCanvas........................................................................................................ 38
3.6.5.Three.js............................................................................................................... 40
3.6.6.Phaser................................................................................................................. 41
3.6.7.Kiwi.js.................................................................................................................. 41
3.6.8.enchant.js........................................................................................................... 42
4.ARAŞTIRMABULGULARIVETARTIŞMA................................................................ 44
4.1.DignityAIYapayZekaKütüphanesi................................................................. 44
4.1.1.DignityAIGenelSınıfYapısı....................................................................... 44
4.1.2.DignityAIKullananÖrnekBirModelinÇalışmaMantığı............... 48
4.1.3.DignityPathSınıfıileYönBulma.............................................................. 50
4.1.4.DignityActionSınıfıileAksiyonYönetimi........................................... 60
4.1.5.DignityMissionSınıfıileGörevYönetimi............................................. 65
i
4.1.6.DignityAIBaseSınıfıveTemelYapayZekaFonksiyonları............ 68
4.1.7.DignityStructure,DignityVehicle,DignityHumanve
DignityAnimalSınıflarıileYapayZekalıNesneler........................... 79
4.2.DignityAIKullananÖrnekOyunModeli........................................................ 88
5.SONUÇVEÖNERİLER...................................................................................................... 104
KAYNAKLAR............................................................................................................................. 106
EKLER......................................................................................................................................... 108
EKA.DignityAIDetaylıSınıfDiagramı..................................................................109
ÖZGEÇMİŞ................................................................................................................................. 110
ii
ÖZET
YüksekLisansTezi
HTML5TABANLIOYUNLARİÇİNYAPAYZEKAKÜTÜPHANESİ
BerkanUSLU
SüleymanDemirelÜniversitesi
FenBilimleriEnstitüsü
BilgisayarMühendisliğiAnabilimDalı
Danışman:Doç.Dr.EcirUğurKÜÇÜKSİLLE
Bu çalışmada; oyunlarda yapay zekanın tarihi, kullanılan yapay zeka
kütüphaneleri analiz edilmiş ve en popüler olanları incelenmiştir. Bu inceleme
sonucunda, geliştirilen yapay zeka sistemlerinin; aksiyon, RPG, RTS, macera,
platform,sporveyarıştürlerineetkiettiklerigörülmüşveoyuntürleriileyapay
zekailişkisidetaylıolarakelealınmıştır.Bunagöreoyuntürlerininyapayzeka
gereksinimleri belirlenerek, o oyun türüne özgü kullanılan yapay zeka
elementlerivemetotlarıincelenmiştir.Bumetotlariçerisinde;davranışağaçları,
sonlu durum makineleri, yol bulma, mantıksal durum makineleri, hiyerarşik
yapay zeka ve veriye dayalı sistemler gibi metotlara atıfta bulunularak oyun
türleriiçerisindekirollerianlatılmıştır.
HTML5veWEBGL’ingelişimielealınarak,masaüstücihazlardanmobilcihazlara
kadar büyük bir yelpazede HTML5 ve WEBGL desteğinin giderek arttığı, bu
artışla birlikte HTML5’in neler yapabildiği, avantajları ve dezavantajları,
çalışmanın nasıl bir sistem üzerine kurgulandığını ve gelişmekte olan bu yeni
teknolojiüzerineyapılanaraştırmanınaslındaileridenekadarpopülerbiralana
hitap edeceği konularına değinilmiştir. Bu bağlamda, HTML5 için geliştirilen
oyunmotorlarıincelenerek,özellikleri,sunduklarıolanaklargözönünealınmış
vepopüleroyunmotorlarınınseviyesiniyakalamayayakınolmalarınarağmen,
herhangibiryapayzekakütüphanesininşimdiyekadarHTML5tabanlıoyunlar
içingeliştirilmemişolmasınadikkatçekilmişveçalışmanınbunoktadabüyükbir
boşluğudolduracağınavurguyapılmıştır.
Sonuç olarak, çalışmaya konu yapay zeka kütüphanesi DignityAI geliştilerek,
yapısı,sınıfları,çerçevesi,kullanımalanıdetaylıcaaktarılmış,DignityAIkullanan
örnek bir modelin çalışma mantığı anlatılmış ve DignityAI kullanan örnek bir
oyun tasarlanmıştır. DignityAI, oyun motorundan bağımsız olarak tüm HTML5
oyunlarınaentegreedilebilenvebuoyunlarayapayzekadinamiklerikatmakiçin
geliştirilmişbiryazılımkütüphanesidir.
Anahtar Kelimeler: HTML5, WebGL, yapay zeka kütüphanesi, dignityai,
bilgisayaroyunları.
2015,110sayfa
iii
ABSTRACT
M.Sc.Thesis
ARTIFICIALINTELLIGENCELIBRARYFORHTML5BASEDGAMES
BerkanUSLU
SüleymanDemirelUniversity
GraduateSchoolofAppliedandNaturalSciences
DepartmentofComputerEngineering
Supervisor:Assoc.Prof.Dr.EcirUĞURKÜÇÜKSİLLE
Inthisstudy;itwasexploredthehistoryofAI,analyzedtheAIlibrarywhichwere
usedandexaminedwhicharethemostpopularofthem.Attheendofthissurvey,
ithasseenthatAIsystemsthatweredevelopedhaveaneffectonaction,RPG,
RTS, adventure, platform, sport and the racing types. With this result, relation
betweengametypesandAIwasdeeplyanalyzed.Asthisanalyzeresult,theneed
ofAIofthegametypeswasdeterminedandthemethodandelementofAIthat
wasspecialtothatgamewasexamined.Someofthesemethodslike;behavior
trees, finite state machines, path finding, fuzzy state machines, hierarchical
artificialintelligenceanddata-drivensystemswerereferredandexpressedthe
roleoftheminthegametypes.
DevelopinghistoryofHTML5andWEBGLwerediscussed.Itwasclaimedthatthe
HTML5 and WEBGL support was gradually growing in a wide range from the
desktoptothemobile.Withthisgrowth;whatHTML5coulddo,itsadvantages
anddisadvantages,onawhatkindofsystemthestudyisfictionalizedandhow
thesurveyaboutthisnewgrowingtechnologywouldappealtoapopulararea
wereallmentionedindetail.Inthiscontext,gameenginesthatweredeveloped
for HTML5 were analyzed by taking into consideration their features and
advantages.Althoughtheywereclosedtothelevelofpopulargameengines,it
wasmentionedthatnoneofAIlibrarywasdevelopedforHTML5basedgames
anditwashighlightedthisstudywouldfillabiggap.
As a result; the subject of this study, DignityAI was developed. Its structure,
classes, outline, usage area was mentioned in detail. It was explained the
operating logic of a model which uses DignityAI and designed a sample game
whichusesDignityAI.DignityAI,isasoftwarelibrarywhichwasdevelopedtoadd
AIdynamicstoHTML5basedgamesandindependentfromthegameengineit
wasintegratedtoanygamesthatwasdevelopedwithHTML5.
Keywords:HTML5,WebGL,artificialintelligencelibrary,dignityai,computer
games
2015,110pages
iv
TEŞEKKÜR
Buaraştırmaiçinbeniyönlendiren,karşılaştığımtümzorluklarıbilgivetecrübesi
ile aşmamda yardımcı olan, teşvikleri ve yönlendirmeleriyle araştırmanın
başarıya ulaşması sağlayan ve her zaman güçlü desteğini hissettiğim değerli
DanışmanımDoç.Dr.EcirUğurKÜÇÜKSİLLE’yesonsuzteşekkürlerimisunarım.
Tezimin her aşamasında beni cesaretlendiren ve çalışma azmimi artıran, her
zaman yanımda desteğini hissettiğim sevgili karım İtibar AYDEMİR USLU’ya
sonsuzsevgiveteşekkürlerimisunarım.
BerkanUSLU
ISPARTA,2015
v
ŞEKİLLERDİZİNİ
Sayfa
Şekil3.1.PathEngineÇalışmaModeli........................................................................... 14
Şekil3.2.SüperMarioBrosoyunuanagörseli.......................................................... 24
Şekil3.3.SüperMarioBrosdenizbölümü.................................................................. 25
Şekil3.4.SüperMarioBros'unEnPopülerBölümSonuCanavası:Bowser. 25
Şekil3.5.PlayCanvasOnline3DEditörü...................................................................... 39
Şekil3.6.Three.jsOnline3DEditörü............................................................................. 40
Şekil4.1.DignityAIGenelSınıfTasarımı..................................................................... 44
Şekil4.2.RastgeleOluşturulanHaritaÖrneği1.Görüntü.................................... 89
Şekil4.3.RastgeleOluşturulanHaritaÖrneği2.Görüntü.................................... 89
Şekil4.4.HaritaÜzerindeRastgeleOluşturulanModeller.................................. 93
Şekil4.5.OluşturulanMaviveKırmızıTakımTankModelleri.......................... 101
Şekil4.6.OluşturulanTanklarınBirbirleriniAlgılayıpAteşEtmeleri
1.Görüntü.............................................................................................................. 102
Şekil4.7.OluşturulanTanklarınBirbirleriniAlgılayıpAteşEtmeleri
2.Görüntü.............................................................................................................. 103
vi
ÇİZELGELERDİZİNİ
Sayfa
Çizelge3.1.WebGLDestekleyenTarayıcıveSürümleri....................................... 34
vii
SİMGELERVEKISALTMALARDİZİNİ
AI
Yapayzekâ
A*
AYıldızalgoritması
API UygulamaProgramlamaArayüzü
AJAX AsenkronVeriİletişimKatmanı
CPU Merkezişlembirimi
DOM DökümanNesneModeli
FPS Birincişahısnişancı
FSM SonluDurumMakineleri
FuSM MantıksalDurumMakineleri
IDA* TekrarlamalıderinleşenAYıldızalgoritması
JSON JavascriptNesneNotasyonu
LOD DetaySeviyesi
LRTA*
GerçekzamanlıöğrenmeAYıldızalgoritması
MA* HafızasınırlamalıAYıldızalgoritması
MMORPG
DevasaÇokoyunculuRolYapmaOyunu
NPC OyuncuOlmayanKarakter
RPG Rolyapmaoyunu
RTS GerçekZamanlıStrateji
SDK UygulamaGeliştirmeKiti
SVG ÖlçeklendirilebilirVektörGrafiği
TBS DönüşümTabanlıStrateji
TPS ÜçüncüŞahısNişancı
2D
İkiboyutlu
3D
Üçboyutlu
viii
1. GİRİŞ
Dünyanınsonyıllardaüzerineyoğunlaştığı,enyenivepopülerteknolojilerinden
birisiolanHTML5veWebGLüzerindeyapılanaraştırmalarla,yinesonyıllarda
ivmesini artırarak güçlenen oyun geliştirme konusu üzerine yapılan her
araştırmaçokdeğerlibirkonumayükselmektedir.Tümbunlarınyanında,büyük
teknoloji şirketlerinin yakından ilgilendiği yapay zeka konusu da yükselen bu
değerliaraştırmakonularınınyanındabelkidebirincisıradagösterilebilecekbir
popülerliktedir. Bu durum başta Apple, Microsoft ve Google gibi teknoloji
devlerinin birer birer yayınladıkları yapay zekalı kişisel asistanlarla daha da
önemkazanmışdurumdadır.
ÇalışmabuaçıdanhemHTML5veWebGL,hemdeoyungeliştirmeveyapayzeka
konularını tümüyle ele aldığı için, titizlikle ve derinlemesine bir araştırmanın
ürünüolarakhazırlanmıştır.Alanındadahaönceyapılmışufaktefekçalışmaların
tümünü kapsayan ve üzerine komple bir API sunarak, tüm oyun geliştiriciler
tarafındankullanılabilmesinisağlayacakbirçerçeveiçerisindeincelenmiştir.
Öncelikli olarak yapay zekanın bilgisayar oyunlarındaki tarihi ele alınarak,
oyunlardaki yapay zeka sistemlerinin gelişimi ve kullanılan yapay zeka
kütüphaneleri detaylıca incelenmiştir. İnceleme yapılırken bir diğer ölçüt ise
herhangi bir oyun motoruna bağımlı olmadan tüm oyun motorlarına entegre
edilebilenyapayzekakütüphanelerininincelenmesisağlanmıştır.Ancaktabiiki
buradaki incelenen kütüphanelerin hiç birisi HTML5 tabanlı oyunlar için
kullanılabilecek kütüphaneler değildir. Bu noktada geliştirilen DignityAI
kütüphanesi ilk olma özelliği taşımaktadır. Ayrıca, yapay zeka kütüphaneleri
incelenirkengeliştirilenheryapayzekakütüphanesininbellibirtüreodaklandığı
görülmüştür. Bu doğrultuda ise oyun türleri ile yapay zeka ilişkisi üzerine de
incelemeleryapılmıştır.
Oyun türleri içerisinden aksiyon (FPS,TPS), rol yapma oyunu (RPG), gerçek
zamanlıstrateji(RTS),macera,platform,sporveyarıştürlerineodaklanılmışve
butürlerinözellikleri,kısatarihleri,bilinenenpopüleroyunlarıincelenerektür
1
içerisindekullanılanyapayzekametotlarıdadetaylıcaelealınmıştır.Bumetotlar
içerisinde, sonlu durum makineleri (FSM), hiyerarşik yapay zeka, mantıksal
durummakineleri(FuSM),davranışağaçları(behaviortrees),yolbulma(pathfinding),veriyadayalısistemler(datadrivensystems)vebulanıkmantık(fuzzy
logic)olmaküzerehangioyuntürlerindehangimetotlarınsıklıklakullanıldığıve
kullanımalanlarınailişkinincelemeyapılmıştır.
Yapay zeka incelemelerinin ardından, HTML5 ve WebGL’in gelişimi ve
yapabildikleri listelenerek teknolojinin bu kadar popüler olmasının arkasında
yatan güçlü özellikler irdelenmiştir. Bu özelliklerin yanında, WebGL
teknolojisinin hangi tarayıcılar tarafından desteklendiği konusu incelenerek
WebGL gücünün nasıl hızla hem masaüstü hem de mobil cihazlar üzerinde
yayıldığıbelirtilmiştir.Ardından,HTML5oyunmotorlarıincelenmişvehem2D
hem de 3D oyun geliştirilebilecek, kararlı durumdaki ve en popüler olarak
kullanılanoyunmotorlarıelealınmıştır.Construct2,ImpactJS,PixiJS,PlayCanvas,
Three.js, Phaser, Kiwi.js ve enchant.js incelenen oyun motorları arasındadır.
ÇalışmaiçerisindekiörnekoyundaPlayCanvaskullanılarakgeliştirilmiştir.
Tüm bu ön incelemelerin ardından, çalışma kapsamında geliştirilen DignityAI
yapayzekakütüphanesiningenelyapısıvetümsınıflarıdetaylıcaincelenmiştir.
DignityObjectsınıfıtümdiğersınıfarıntüretildiğitemelsınıftır.DignityPathsınıfı
ile yön bulma sistemlerinin yönetimi, DignityMission sınıfı ile görev yönetimi,
DignityAction sınıfı ile aksiyon altyapısının oluşturulması ve temel aksiyon
yönetimi işlemleri geliştirilmiştir. Tüm bu yönetim sistemlerini kullanan temel
bir DignityAIBase sınıfı tasarlanmış ve tüm yapay zekalı nesnelerin
kullanabileceği ortak özellikler tanımlanmıştır. DignityAIBase sınıfından
türetilen: DignityStructure bina ve yapılara, DignityVehicle araçlara,
DignityHuman insanlara, DignityAnimal ise hayvanlara yapay zeka özellikleri
kazandırmakiçinözelleştirilmiştir.SonolarakDignityAIyapayzekakütühanesini
kullanarakgeliştirilmişörnekbiroyundetaylarıylaanlatılmıştır.
2
2. KAYNAKÖZETLERİ
Wexler (2002) çalışmasında, öncelikle bilgisayar oyunlarının tarihine giriş
yapmış ve bilgisayar oyunlarında yapay zekanın gelişimini incelemiştir. Asıl
irdelediği konu bilgisayar oyunlarında yapay zeka olmakla birlikte, Lionhead
Studios’un oyunu Black and White’ın yeni yapay zeka sistemini ve oyunlarda
yapayzekanınnereleregidebileceğiniincelemiştir.
Middleton(2002)çalışmasında,oyunlardakiyapayzekanıntarihinivebilgisayar
oyunlarının son 25 yıllık tarihindeki yapay zeka sistemlerinin gelişimini
incelemiştir.Çalışmasında1950’lerdeAlanTuring’intasarladığısatrançyapay
zekasından Garry Kasparov’u yenen Deep Blue bilgisayarına, ünlü RPG oyunu
Dungeons&Dragons’dan, yine bir başka efsane RTS oyunu Dune II’ye, Age of
Empires serisinden, Valve’ın FPS türündeki en popüler oyunu Half Life’daki
yapayzekasistemlerinekadardetaylıbirincelemevekarşılaştırmayapmıştır.
Buckland (2005) çalışmasında, oyunlarda yapay zeka konusunu örneklerle
işleyerek akademik yapay zeka ile oyunlarda kullanılan yapay zeka sistmeleri
arasındakifarklaradikkatçekmiştir.
Stall(2006)çalışmasında,sonludurummakinelerinianlatmakiçinyaşadığıçok
doğalbirörneküzerindenilerlemişvesonludurummakinelerinidahiyanebir
şekildeanlatmıştır.
Schwab (2009) çalışmasında, AI (Yapay Zeka) oyun motoru geliştirmenin
detaylarını, karar verme, girişler, navigasyon gibi basit bileşenlerden, oyun
türlerinindetaylıinclemesinevebileşenlerine,sonludurummakineleri,bulanık
durum makineleri, mesajlaşma sistemleri gibi detaylı metot analizlerinden
komplebirAIoyunmotorugelişiminekadarçokdetaylıbirşekildeincelemiştir.
Genetikalgoritmalar,yapaysinirağları,bulanıkmantık,davranışağaçlarıgibibir
çoküstdüzeykonuyadaayrıntılıolarakkitabındayervermiştir.
Lubbers vd. (2011) çalışmalarında, HTML5’in temeli olan HTML ve XML’den
3
şimdi HTML5’i oluşturan bileşenler Javascript ve CSS olmak üzere HTML5
programlamanındetaylarınainmiştir.AyrıcaHTML5’inyaygınolarakkullanılan
ve henüz geliştirilme aşamasında olan tüm API kütüphanelerini detaylıca
incelemiş ve bu inceleme ile birlikte hangi API’ın hangi tarayıcı tarafından
desteklendiğininöğrenilebilmesiiçingüzelörneklervermiştir.
Freeman(2011)çalışmasında,HTML5’ioluşturanJavascriptveCSS’iincelemiş
vebuteknolojilerikullanarakHTML5’ingücünütamolarakkullanabilmekiçin
detaylıbirrehberortayaçıkarmıştır.HTML5’inprogramlamatarafınaeğilerek,
formlar, form doğrulama yöntemleri konularına değinmiş ve detaylı bir CSS
kaynağıortayakoymuştur.
Parisi (2012) çalışmasında, WebGL’in dünyasının kapılarını aralamış ve
WebGL’in tarihi ve oluşumundan bu günlere nasıl geliştiğini anlatmıştır.
ÖncelikliolarakWebGL’ebirgirişyaparakdahasonraThree.jsoyunmotorunu
kullanıpbasitbirWebGLuygulamasıgeliştirmiştir.Grafikler,animasyonlar,2D
ve3DortamlarilebirliktepromosyoniçinWebGL’inkullanılmasınadeğinmişve
örnekbirWebGLoyunugeliştirmiştir.
Rabin(2002)çalışmasında,RPGoyunlarındayenibiryapayzekayaklaşımıolan
detay seviyesine (level of detail / LOD) bağlı yapay zeka tekniğini detaylıca
anlatmıştır.Grafikprogramlamadakibutekniğinyapayzekayauyarlanmasıile
birlikte sistemin hızlanmasını ve CPU yükünün azalmasını sağlayan etkin bir
sistemolduğunadeğinmiştir.
ComptonveMateas(2006)çalışmalarında,platformoyunlarındakienağıryapay
zekakonularındanbirisiolanprosedürelbölümtasarımıüzerineodaklanmışve
dört seviyeli bir metot geliştirerek bölüm tasarımı için yeni bir algoritma
geliştirmişlerdir.
Beirne (2007) çalışmasında, yarış oyunlarındaki yapay zeka sistemlerini ele
almış ve en çok kullanılan modelleri ile yeni nesil inovasyonlar olan araba
modifikasyonuveayarlamayapayzekasistemleriningelişimlerinianlatmıştır.
4
Ayrıca github.com üzerindeki bazı projeler de HTML5 oyunlarda yapay zeka
konularındagirişniteliğindeçalışmalaryapmıştır.
Gordon(2011)çalışmasında,JavascriptyStateMachineolarakisimlendirilenve
sonludurummakineleri(FSM)üzerineodaklanmışbirframeworksunmaktadır.
Cowart(2012)çalışmasında,yineaynısonludurummakineleri(FSM)üzerine
odaklanmış olan Machine.js isimli proje de davranış ağaçları oluşturma
özelliklerisunmaktadır.
Xu(2011)çalışmasında,sadeceyolbulma(path-finding)üzerineodaklanmışve
birçokaramaalgoritmasınıbünyesindebarındırarakbualandaözelleşmişeniyi
projelerdenbirisiolanPathfinding.jsisimliprojedeincelenmiştir.
5
3. BİLGİSAYAROYUNLARINDAYAPAYZEKA
3.1.OYUNLARDAYAPAYZEKA'NINTARİHİ
Bilgisayar oyunları, 1958'de ilk olarak Brookhaven National Laboratory'de
araştırmacıolanWilliamHiginbothamtarafındangeliştirilen“TennisforTwo”
isimlioyunladoğmuştur.William'ıngeliştirdiğibuilkoyunyalnızcabirosilaskop
üzerinde oynanabilmekteydi. Bilgisayarlar üzerinde oynanan ilk oyun ise
MIT'den Steve Russell tarafından geliştirilen “Spacewar” isimli oyundur.
Spacewar'ıngrafikleriiseASCIIkarakterlerdenoluşmaktaydıvebirDigitalPDP1 üzerinde çalışmaktaydı. 1970'lere gelindiğinde ise gelecekte Atari'nin de
kurucuları olacak olan Nolan Bushnell ve Ted Dabney, ilk video arcade oyunu
olacak olan “Computer Space” isimli oyunu geliştirdiler. 1980'de ise ABD
hükümeti askeri alanlarda eğitim amaçlı kullanılması için ilk üç boyutlu oyun
olanBattlezone'ugeliştirdivebundandörtyılsonrayani1984'deNintendooyun
konsolu piyasaya çıkarak bilgisayar oyunlarının ticari olarak evlere girmesini
sağladı. Daha sonra Sony'nin PlayStation'ı almasıyla ve kişisel bilgisayarlarda
bilgisayar oyunlarının yaygınlaşmasıyla birlikte bilgisayar oyunları çok büyük
endüstrihalinialdı.İşlemcilerinsınırlarınızorlayarakbirsürüüstdüzeyişlem
gereksinimleriilegelişmeyedevametmektedir.Bunlarınenbüyükörnekleriise
artıkgerçekzamanlıüçboyutlugörüntüişleme,filmkalitesindesesvegörüntü
ve üst düzey zeki bilgisayar bileşenleri ile donatılarak karşımıza gelmektedir.
(Wexler,2002)
Bilgisayaroyunlarındayapayzekanıntarihinebakıldığındaiseöncelikleboard
game türündeki oyunların üzerinde doğduğu söylenebilir. Yapay Zeka'nın
babaları olarak görülen Alan Turing ve Claude Shannon tarafından 1950'de
satrançoyunuiçinyazılanyapayzekabununilkörneğiolarakgösterilir.1952'de
iseIBM'denArthurSamueltarafındangeliştirilen“TheSamuelCheckers-playing
Program” isimli dama oyunu kendi kendine öğrenebilen ilk programı olarak
kabul edilir ve yapay zekanın ilk örnekleri arasında kabul görmektedir.
Bilgisayarlarınboardgametüründekisatrançvedamagibioyunlardakikuralları
öğrenerekhızlıcevaplarvermesiilebirliktebilgisayarlarbuoyunlardainsanları
yenebilirhalebilegelmiştir.1997'de“DeepBlue”isimlibilgisayardünyasatranç
6
şampiyonu Gary Kasparov'u yenerek bilgisayarın karar alma konusunda ne
kadarhızlıişlemyapabildiğinigöstermiştir.(Middleton,2002)
1990'laragelindiğindeiseartıkbilgisayaroyunlarındakiyapayzekakullanımıve
oyunların gelişen işlemci teknolojisi ile birlikte daha zeki sistemler olarak
kurgulanması dönemi başlamıştır. “Turn-based Strategy / TBS” türündeki bir
çokoyun(Satranç,Dama,Govb.)yapayzekanınkullanıldığıilkoyuntürüolarak
kabuledilmektedirvebunu“Role-PlayingGames/RPG”türütakipetmektedir.
RPG türünde ise karar verme (decision-making) sistemleri gelişmiş ve yapay
zekalı karakterin oyuncu ile savaşması öğeleri de katılmıştır. Ancak 1992'de
WestwoodStudiostarafındangeliştirilenve“Real-TimeStrategy/RTS”türünün
ilkörneğiolarakkabuledilenDuneIIoyunupiyasaçıkmış,yapayzekanıngerçek
zamanlı hesaplamalar ve karar verme yapıları üzerine daha hızlı ve yeni
algoritmalar üzerinde çalışması gerekliliği doğmuştur. Dune II, yapay zeka
açısından çok kompleks öğeler içermemektedir. Ancak 1997 yılında piyasaya
sürülen Warcraft ve Command & Conquer serileri insanların büyük haritalar
üzerinde tek başına zaman geçirmelerini ve oyun içerisinde bulunan bir çok
puzzle öğesini bulup çözmelerini haliyle de oyunların yapay zeka
gerekliliklerininvegüçlerinindahaiyiseviyeyegelmelerinigereklikılmıştır.
1998'de Valve'ın geliştirdiği “First-person shooter / FPS” türündeki Half-Life
isimli oyun yapay zeka konusundaki inovatif oyunlardan birisi olarak
sıyrılmaktadır. Half-Life üzerindeki en büyük yeniliklerden birisi, oyunlardaki
yapay zekada kullanılan finite state machine (sonlu durum makinesi) olarak
adlandırılan, sınırlı sayıda durum, durumlar arası geçiş ve eylemlerin
birleşmesindenoluşanbirdavranışmodelininkullanılmayıp,“schedule-driven
state machine” olarak isimlendirilen yeni bir türün uygulanmasıdır. Bu yeni
teknik ile birlikte düşmanların birbirleri ile birlik kurmaları, bu birlikler ile
hareket ederek ve saklanarak atış pozisyonu almaları, canları azaldığında
takviyebirlikalmalarıvepusukurmalarıgibidahabirçokyenilikeklenmiştir.
1999'daiseAgeofEmpiresIIveUnrealTournamentgibioyunlarınçıkmasıyla
birliktezatenRPG,RTSveFPSoyuntürlerindegelişenyapayzekanındahada
7
zeki “oyuncu olmayan karakterler” (NPCs) geliştirmenin gerekli olduğunu
göstermiş ve günümüzdeki bir çok üst seviye özelliği kullanmaya kadar gelen
sürecibaşlatmışlardır.
Günümüzdeisedinamikolarakyolbulmaalgoritmalarınınüstseviyelereçıktığı,
karakterlerindavranışveizlemesensörlerinindahahızlıtepkivererekinsanlar
gibi düşünüp davranmaya yaklaşmış oyun karakterlerinin yazılabileceği bir
sistemedoğruilerlenmektedir.NPCkarakterlerüzerindeoluşturulansensörler
yardımı ile bir çok aksiyonun ve eylemin izlenmesi ve buna uygun cevaplar
verilmesi sağlanmaktadır. Hatta karakterin bir iki örnek öğrenme modelinden
sonra davranışını geliştirerek zamanla daha zeki bir düşünce yapısına sahip
olarakhareketedebileceğibirsistemedoğruyolalmaktadır.
İlerideoluşturulanbirbilgisayaroyununda,yapayzekalıkarakterlerinoyunuele
geçirdiği ve tüm insanlığın oyun içerisindeki yapay zekalı karakterleri
yenebilmek için mücadele vereceği süper zeki NPC'ler ile geliştirilmiş oyunlar
oluşturulabilecektir.Ayrıcasürekliöğrenerekdahadazekiolmayadevameden
sistemleribünyesindebarındıranyapayzekalıoyunlarınoynanabilecekolması,
hatta üstün yapay zeka öğeleri ile donatılmış ve sanal gerçeklik öğeleri ile
desteklenmiş dünyalarda yaşanabileceği düşüncesi, Alan Turing'in makineler
düşünebilirmiteziningeldiğiuçnoktalarıhayaldengerçeğedönüştürebilecektir.
3.2.AKADEMİKYAPAZEKAVEOYUNLARDAKULLANILANYAPAYZEKA
TEKNİKLERİARASINDAKİFARKLAR
Literatür üzerinde yapay zeka ile ilgili çalışmalar ve araştırmalar yapıldığında
aslında akademik yapay zeka olarak tanımlanan, bilgi tabanlı sistemler
(knowledge based systems), doğal dil işleme (natural language processing),
makineöğrenimi(machinelearning),robotik(robotics),otomatikprogramlama
(automatic programming), bilgisayar destekli öğrenme (computer-aided
instruction),görüntüişleme(computervision)vederinöğrenme(deeplearning)
olaraksıralanarabilir.(ElSayadveSaad,2007)
8
Akademikaraştırmalardatemeldeikiyeayrılır.Buaraştırmalargüçlüyapayzeka
ve zayıf yapay zeka olarak sınıflandırılabilir. Güçlü yapay zeka, insan düşünce
süreçlerinitaklitetmeyiamaçlayançalışmalarileilgilenir.Zayıfyapayzekaise,
gerçek dünya sorunlarının çözümlenmesinde yapay zeka tekniklerinin
kullanılmasını içeren ve bu günlerde daha popüler olduğu varsayılan
sistemlerdir. Bununla birlikte her iki alanda da sorunların çözümü optimal
düzeydetutulmalıdır.(Buckland,2005)
Akademik araştırmacılar için simülasyon sistemleri üzerinde saatler, günler
hatta haftalar süren ve 1000 işlemcili devasa bir bilgisayarın bahse konu
simülasyonu işletmesi ve bulunan sonuçların bir makale ya da teze
dönüştürülmesi bir başarı ölçüsüdür. Bununla birlikte çok büyük kaynak
gereksinimlerivezamanaihtiyaçduyulabilir.
Oyun yapay zeka programcıları ise sürekli sınırlı bir kaynakla çalışmak
zorundadırlar. Platformdan platforma değişen seviyelerde işlemci ve hafıza
kaynaklarını en iyi şekilde kullanmak zorundadırlar. Tüm bu performans
handikaplarının yanında bir de zaman problemi bulunmaktadır ki oyunlarda
düşünme, öğrenme ve tepki verme süreleri genellikle saniyeler içerisinde
gelişmektedir.
Ayrıcabilgisayaroyunlarınıngenelamacıinsanlarakeyifvermesidir.Bunoktada
geliştirilenyapayzekasistemiheminsanlarakeyifvermelihemdeaslındazeki
birsistemizlenimivererekinsanlarıntıpkıkarşılarındagerçekbirinsanlaoyun
oynuyormuşhissinekapılmalarınısağlamalıdır.(Buckland,2005)
Sonuç olarak bilgisayar oyunlarındaki yapay zeka teknikleri ile akademik
araştırmalar için kullanılan yapay zeka sistemleri arasında bu bağlamda bir
farklılık bulunmaktadır. Hal böyle olunca kullanılan teknikler ve klasik yapay
zeka algoritmaları bakımından bilgisayar oyunlarında kullanılan yapay zeka
sistemleri içerisinde çok daha optimal bir düzeyde ve aslında oyunculara
karşısındakikarakterinzekiolduğuhissiuyandıransistemlerüzerindedahaçok
durulmaktadır.
9
3.3.OYUNLARDAKULLANILANYAPAYZEKAKÜTÜPHANELERİ
Oyunlarda bugüne kadar bir çok farklı yapay zeka kütüphanesi kullanılmış ve
bunların çoğu oyun motorları içerisinde entegre olan, oyun motoru
kullanılmadan çalışmayan kütüphanelerdir. Burada asıl incelemek istediğimiz
kısımoyunmotorlarındanbağımsızolarakçalışanyapayzekakütüphanelerini
incelemektir. Zira tezin konusu olarak tasarlanan DignityAI tamamen oyun
motorundan bağımsız bir yapı ile tasarlanmış ve her oyun motoruna
uygulanabilecekbiryapısunmaktadır.
Bu bağlamda aşağıda listelenen yapay zeka kütüphanelerini, özelliklerini ve
kapsamlarınıincelemekgerekir.
•
Kythera
•
HavokAI
•
RAIN
•
Kynapse
•
PathEngine
•
MasaLife
•
Cyntient
3.3.1.Kythera
Kytherasonyıllardaçokünlenenvebüyükoyunlardakullanılmayabaşlananbir
yapayzekakütüphanesidir.BuoyunlarınbaşındaStarCitizengelmektedir.Daha
sonraUmbraveRickFutureisimlioyunlardadakullanılmıştır.Kythera'nınüç
farklıkullanımalanıvardır.Bunlardanbirisi3DUçuşuygulamalarıdır.Birdiğer
kullanımı ise FPS tarzında oyunlardır. Sofistike davranış sistemi ile gerçekçi
düşmanlarvesilahlıçatışmalaroluşturmakmümkündür.Sonolarakiseyaşayan
dünyalar(livingworlds)içinçokzenginveçeşitlietkileşimleriçererek,tamamen
yaşayanbiratmosfersunmaktadır.(Moon,2014)
10
Bununla birlikte algılama, hedef seçme, saklanma ve grup koordinasyonu gibi
klasikişlevlerinyanında,dinamikyönbulma(dynamicnavigation)vedavranış
ağaçları(behaviortrees)bakımındandiğerkütüphanelerinönünegeçmektedir.
KytheraWindows,MacveLinuxile32-bitve64-bitişlemcimimarilerinedestek
verenC++tabanlıbirsistemolaraktasarlanmışvetümoyunmotorlarınaentegre
edilebilirşekildedizaynedilmiştir.ŞuandaCryEngineüzerineücretsizentegre
edilebilenbirsürümübulunmaktaveUnityoyunmotorunaentegreedilebilen
yapısıdageliştirilmektedir.AncakHTML5ileentegrasyonubulunmamaktadır.
3.3.2. HavokAI
Havok AI, Havok'un ürünlerinden biri olarak Havok Vision Engine, Havok
Pyhsicsgibibirçokürününarasındayerinialmışsağlambirsistemdir.HAVOK
AI,yönbulma(path-finding)veyolizlemegibitemelnavigasyonfonksiyonlarına
odaklanmış bir yapay zeka kütüphanesidir. En belirgin özelliklerinden birisi
otomatiknavigasyonmesholuşturabilmesidir.Ayrıca,NPCkarakterleridinamik
yolbulmailebirliktedahaüstseviyedeolmaktavebunabağlıolaraktopluluk
(crowd) sahnelerinde avantajlı duruma gelmektedir. Böylece NPC'ler
kendilerinin ve çevresinde hareket eden başkalarının hareketlerini tahmin
edebilmektebunabağlıdavranabilmektedir.(Havok,1998)
Havok AI'ın en büyük özelliği de yine C++ ile geliştirilmiş ancak lider tüm
platformlaradestekverebilirhaldedir.BuplatformlararasındaWindows,Mac,
Linux, PlayStation PS3, Xbox 360, PlayStation Vita, Nintendo Wii U, iOS ve
Android platformları da bulunmaktadır. Ancak HTML5 ile entegrasyonu
bulunmamaktadır.
3.3.3.RAIN
Unity oyun motoru için geliştirilmiş ancak Unity'den bağımsız satılan ve
dağıtılanbiryapayzekakütüphanesidir.Otomatiknavigasyonmesholuşturma,
yolbulma(path-finding),rotatakibi(path-following)gibigelişmişnavigasyon
özellikleriniiçerir.Bunlarıdavranışağaçları(behaviortrees)iledesteklediğiiçin
11
birkarakterekolaycaatakyapma,devriyeşeklindebölgedegezinme,kovalama
ve kaçma dinamikleri gibi bir çok özellik eklenebilmesini sağlamaktadır.
Davranış ağaçlarında esnektir. Böylelikle karar düğümleri, zamanlayıcı
düğümleri, dinamik olarak öncelik belirleme, paralel aksiyon belirleme, ses,
animasyon, sensörler ve hareket duyarlılık, durum makineleri desteği ile tüm
aksiyonlarıözelleştirebilmeimkanısunar.Algılamakonusundahemgörüşhem
de ses sensörlerine duyarlıdır. Unity oyun motoruna entegre olduğu için tüm
platformlardaçalışabilir.Shadowrun:Returns,Grave,Saurian,Reflections,The
Crow gibi bir çok oyun içerisinde kullanılmıştır. Unity'nin büyük oyuncu
ekosistemi içerisinde de gelişmeye devam etmektedir. Ancak HTML5 desteği
bulunmamaktadır.Unity5ilebirlikteWebGLexportseçeneğigetirilmişancakbu
doğal(native)birHTML5çıktısıvermemektedir.(Rival,2015)
3.3.4.Kynapse
Kynapse Autodesk firması tarafından geliştirilen ve şimdilerde Gameware
NavigationveGamewareCognitionisimleriileikifarklıürüneayrışangenişbir
yapay zeka kütüphanesidir. Gameware Navigation, klasik yön bulma ve
navigasyon gerekliliklerine çözüm arayan bir yapay zeka kütüphanesidir.
GamewareCognitionisegörselprogramlamaaltyapısısunarakdavranışağaçları
(behaviortrees)oluşturmayayarayanbiraraçtır.(Autodesk,2013)
Kynapse,tamamen3Dortamlariçintasarlanmış,devasaharitalariçingelişmiş
yönbulmavedinamiknavigasyonmesholuşturmayetilerinesahipgelişmişbir
yapayzekakütüphanesidir.MafiaII,FableII,MedalofHonor:Airbornegibibir
çokprofesyoneloyundakullanılmışveEADS,BAESystems,ÉlectricitédeFrance
gibifirmalartarafındanaskerisimulasyonolarakdakullanılmıştır.
Unreal Engine ve Unity gibi oyun motorlarına entegre edilebilen ve bunun
dışındanativeolarakPlaystation3,PlaystationVita,Xbox360,Windows,MacOS,
Linux,Wii,WiiUgibibirçokplatformadadestekvermektedir.
12
3.3.5.PathEngine
Şimdiye kadar geliştirilmiş en iyi yön bulma (path-finding) algoritmalarına
odaklanmış yapay zeka kütüphanesidir. Dinamik navigasyon mesh oluşturma,
dinamikengeltanımlama,çarpışmaalgılamagibietkinözellikleriilebirlikteçok
iyi tasarlanmış bir hareket modeline sahip olan PathEngine bir çok büyük
yapımdakullanılarakkendisiniispatetmiştir.TheWitcher2,Metro2033,Just
Cause 2, Shadow of Mordor gibi bir çok büyük yapımın yön bulma tarafında
kullanılan PathEngine kendine has yol bulma algoritması ile bir çok modern
oyunun vazgeçilmezi haline gelmiştir. Bu bağlamda aşağıdaki gibi bir çalışma
modelinesahiptir.(PathEngine,2004)
Şekil 3.1’deki çalışma modelinde PathEngine’in tamamen alt seviyede bir yön
bulma işlemine odaklandığı anlaşılmaktadır. Kullanıcının diğer davranış
ağaçlarını(behaviortrees)oluşturmasıişlemiylehiçilgilenmemiştir.
13
Şekil3.1:PathEngineÇalışmaModeli(Bk.http://www.pathengine.com/overview)
3.3.6.MasaLife
Karar verme üzerine odaklanan bir yapay zeka kütüphanesidir. Windows
üzerindeçalışanC++ilegeliştirilmişveufakbirUnityWindowsentegrasyonu
olan Masa Life, daha çok karar verme mekanizmaları, davranış ağaçları
(behaviortrees),navigasyongibikonularaeğilmiştir.Bukonularınyanısıraakıl
yürütme, bilgi sunumu ve işleme gibi çalışma alanları bulunmaktadır. (Masa,
2014)
MasaLife,kendiiçerisindebireditöryardımıilededavranışağaçları(behavior
trees) oluşturmaya yardımcı olan bir yapıya sahiptir. Oyun geliştirmenin yanı
sırasimülasyonveeğitimalanındadaaktifolarakkullanılmaktadır.Bunoktada
senaryooluşturma,davranışbelirleme,acildurumkontrolügibibirçoközellik
geliştirilmiştir. Masa Life'ın tasarımcıları klasik bilgi girişi ve aksiyon çıkışı
şeklindemimariyioluşturmuşlardır.
14
3.3.7.Cyntient
Cyntient, oyun sektörü için geliştirilmiş bir yapay zeka kütüphanesidir. Sanal
karakterlerin birbirlerinin davranışlarını öğrenerek analiz etmelerini ve
harekete geçmelerini sağlayan bir sistemdir. Zeki ve duygusal karakterler
yaratarak gerçekçi bir deneyim sunmayı amaçlayan Cyntient, Galak-Z isimli
oyunlaaçıkdünyabiruzayoyunugeliştirmeyihedeflemektedir.(Cyntient,2015)
Yukarıdakigibibirçokyapayzekakütüphanesibulunmaktavebunlaraekolarak
bir de oyun motorlarının içerisindeki entegre yapay zeka modülleri
bulunmaktadır.DignityAIbubağlamdaHTML5veWebGLüzerineodaklanmış,
yön bulma, karar verme, davranış ve görev yönetimi gibi bir çok klasik yapay
zekaöğesinibarındırır.
Bu noktada tamamen açık kaynak kodlu olduğu için diğer tüm yapay zeka
kütüphanelerindenayrılmaktadır.Ancakbununyanındaçokgüçlübiraltyapıile
hemen hemen tüm oyun türlerinde kullanılabilecek bir mimari yapıda
tasarlanarak HTML5'in gücü ile tüm tarayıcı tabanlı sistemlerden yayılmayı
hedeflemektedir.
3.4.OYUNTÜRLERİİLEYAPAYZEKAİLİŞKİSİ
Günümüzde oyunlarda kullanılan yapay zeka kütüphanelerine yakından
bakabilmek için oyun türlerine ve oyun motorlarına göre özel bir araştırma
yapmakgerekir.Bununiçinyapayzekayönündenkuvvetlibirkaçfarklıtürdeki
oyunmotorunuincelenerekbaşlanabilir.
Aslındaşimdiyekadarhazırlanançoğuoyunmotorubellibirtüreözgüoyunlar
geliştirmek ve bu oyunlar içerisindeki belli işlevleri yerine getirmek üzerine
kurulu bir yol izleyerek çalışmalarına devam etmiştir. Bu konunun türe özgü
olmasındaki en büyük etkenlerden birisi, oyunların diğer sistemlere göre çok
karmaşıkyapıdaolmalarıveoyunve/veyaoyunmotorugeliştirenlerinproblemi
15
parçalara bölerek çözme yoluna odaklanmaları olarak özetlenebilir. Problemi
parçalarabölmeninenkolayyoludabunutüregöreözelleştirmektir.
•
RAGEEngine–GTA,RedDeadRedemption–Action-Adventure
•
Unreal Engine – Gears of War, Infinity Blade, Mass Effect, Dishonored,
BioShock
•
CryEngine–Crysis,FarCry,Aion,Sniper:GhostWarrior2,CabalOnline2–
Action,Adventure,MMORPGvb.
•
Unity–BadPiggies,CastleStory,DeadTrigger2,Republique,Wasteland2–
Action,Adventure,RPG,RTS,Racing,Fightingvb.
Oyuntürleri,oyunmotorlarınışekillendirirkenyapayzekakütüphanelerinide
özelleştirmiştir. Öyle ki her oyun türünün kendine özgü farklı mekanikleri
bulunmaktadır.Aşağıdaoyuntürleriveözelliklerigenişolarakanlatılmaktadır.
3.4.1.Aksiyon(Action-FPS,TPS)
Aksiyonoyunlarıgenellikle,FirstPersonShooter(FPS)veThirdPersonShooter
(TPS) oyun türlerinde geliştirilirler. Aksiyon oyunlarının olmazsa olmaz
mekaniklerindenbirisiyolbulma(path-finding)özelliğidir.Birdiğerözellikise
düşmanyapayzekasıolarakisimlendiribileceğimizEnemyAIkavramıdır.Butip
aksiyon oyunlarında genelde bir düşman olur ve bu düşman belli zeka
seviyelerindefarklıdavranışlargösterir.Budavranışlariçindemutlakadavranış
ağaçları (behavior trees) olması gerekir. Hangi olay karşısında hangi tepkiyi
vereceklerinibilmelerigerekirvekararverme(decisionmaking)mekanizmaları
gelişmişolmalıdır.
Bu oyunlara verilebilecek en güzel ve en popüler örnek Call of Duty serisidir.
Oyunda, bir askerin gözünden (FPS) takımla birlikte bazı görevleri yerine
getirmeyeçalışılmaktadır.Buradaoyunungenelinebakıldığındaöncelikleiçinde
bulunulan bir takım sistemi (squad system) göze çarpmaktadır. Belli görevler
verilmekte ve bu görevler doğrultusunda başta bulunan komutanın
direktifleriyle görevler yerine getirilmektedir. Yapay zeka açısından oyuna
16
bakıldığında ise öncelikle çok çok iyi bir yol bulma (path-finding) sisteminin
olduğu söylenebilir. Bunun dışında oyuncu tarafındaki askerler genelde
komutanıtakipetmektevehepoyuncuçevresindedurmaktadırlar.Bazıdavranış
ağaçları(behaviortrees)tanımlanmıştır.Bununlabirliktekarakterlerkomutanı
takip etmekte, herhangi bir yerde yavaş gitmeleri gerekiyorsa yavaşlamakta,
saklanabilecekleribirnesnebulupsaklanabilmektevedüşmanıalgıladığındada
düşmana ateş etmektedir. Aynı zamanda karar mekanizmaları da vardır. Bu
karar mekanizmaları ile birlikte; Örneğin silahında kurşun bitince onu atıp
yerineyenisinialabilmekteveyabulunduğubölgedençokfazlaateşalıyorsao
bölgeyideğiştirebilmektedir.
Buradaaksiyonoyunlarınabakıldığındageneldeşuelementleriiçerirler.Bunlar:
düşmanlar (enemies), silahlar (weapons), takım üyeleri (squad members), yol
bulma (path-finding), davranış ağaçları (behavior trees), akıl yürütme
(reasoning),kararverme(decisionmaking)elementleridir.
Bu türde genellikle, sonlu durum makineleri (finite-state machine/FSM)
kullanılır. Bu aslında çok basit bir bilgisayar kuralından öteye geçmeyen
kavramın teoriye dönüştürülmüş halidir. FSM'lerde her duruma karşılık bir
durumbulunur.Bunuanlatabilecekçokzekicebirörnekbulunmaktadır.
Örneğinbiryaşlarındabirçocukelinikapıyailkdefasıkıştırmaktaveağlamaya
başlamaktadır. Annesi ve babası onu bir türlü susturamazken, annesi onu
yatağına yatırmakta, ağlaması geçmeyen çocuğu tekrar yataktan aldığında
ağlamasının kesildiğini fark etmektedir. Yani çocuk daha önceden bildiği bir
durum olan “yataktayken ağlama” durumundan → “yataktan alınınca susma”
durumuna geçiş yapmaktadır. Oysa ki, yukarıdaki el sıkışması durumuna geri
dönüldüğünde,
çocuk
daha
önce
kapıya
el
sıkışması
durumuyla
karşılaşmamıştır.(Stall,2006)
İşte buradaki gibi her bir duruma göre belli çıkışların olduğu ve bu durumlar
arasında geçiş yaparak sonuca ulaşma kavramı finite-state machine (sonlu
durummakineleri)olarakadlandırılmaktadır.Aksiyonoyunlarındavedahabir
17
çoktürdebutarzdabirkullanımyapılabilir.Davranışağaçları(behaviortrees)
aslında bir finite-state machine (sonlu durum makineleri) örneğidir. Her bir
davranışakarşılıkyapayzekalınesneninneyapacağınakararverilir.
3.4.2.RolYapmaOyunu(RPG)
RPGyanirolyapmaoyunları,bilgisayarlarilkçıktığındanberivarolanbiroyun
türüolarakkarşımızaçıkmaktadır.RPGoyunlarıdevasaharitalardaoynananve
oyuncununbelligörevleriyerinegetirerekkendiseviyesinigeliştirmesişeklinde
tanımlanabilir. Ancak, bu oyun tarzı bu kadar basit ifade edilmesine rağmen
zamanlaçokkompleksoyunlaraevrilmişvebirçokmekaniğibarındırarakonline
tarafadakayıpMMORPGoyuntürünüoluşturmuştur.
RPG oyunlardaki yapay zeka, kontrol ettiğimiz karakterin yol bulma ve bir
yerdenbaşkabiryeregitmesiilebaşlar.Buhareketesnasındakendisineverilen
görevi yerine getirmek için (örneğin 100 altın toplamak gibi) büyük haritada
yerinibilmediğialtınlarıaramayabaşlar.Buarayışiçerisindekarşısınagelentüm
engellergeneldedüşmanlardır.Ancakaltınbulmakvetoplamakiçinkaraktere
görev veren NPC'ler de olabilir. Karakterin bir envanter listesi bulunur, bu
envanterlistesindesilahları,yiyecekleri,kıyafetlerigibibirçokçeşitlimateryal
bulunabilir. Karakter, karşısına gelen düşmanın hangi silahla öldürüleceğini
deneyereköğrenir,düşmanındabellisilahlarıyadabüyügücüolabilir.Ancak
buradaki karakterler genellikle basit davranış ağaçları (behavior trees)
barındırarakalgılama,silahkullanmagibitemelaksiyonlarıkullanırlar.Birdiğer
farklıözellik,oyuniçerisindekialım-satımişleriyleilgilenenkarakterlerdir.Bu
karakterlereldekibirmateryalebellibirfiyatvererekonlarısatınalabiliryada
yenibirmateryalsatışıyapabilir.RPGtüründekioyunlarıdiğertürlerdenayıran
enbüyüközellikiseetkileşimlinesnelerinçokluğudur.Hemenhemenhernesne
ileetkileşimiçerisinegirebilirvebunesnelerdenbirşeylertoplanabilir.
RPGtarzıoyunlarda,davranışağaçları(behaviortrees)sıklıklakullanılır.Öyleki
bu ağaç yapısı etkileşimli olan tüm nesneler üzerinde etkilidir. Ayrıca karar
18
verme ve yol bulma mekanizmaları da sıklıkla kullanılan yapay zeka
özellikleridir.
RPGoyunlardakullanılanyapayzekatekniklerindenbirideBaldur’sGateserisi
gibidevasaharitalarüzerindegerçekleşenoyunlariçerisindekullanılanvedetay
seviyesine (level of detail/LOD) göre yapay zeka olarak isimlendirilen bir
tekniktir. Bu teknik ile birlikte oyuncunun yakınında olan nesneler detay
seviyeleri yüksek, uzağında olan nesneler ise detay seviyeleri düşük olacak
şekildeekranaçizdirilir.Bununiçinmodelbirdenfazla(istenildiğikadar)detay
seviyesinde tasarlanır ve oyundaki karakterin yakınlık-uzaklığına göre detay
seviyesi değiştirilerek ekrana çizdilir. Sadece ekrana çizdirme durumlarında
değiloyuniçerisindekiyapayzekasistemininçalıştırılmasıveişletilmesindede
bu teknik kullanılır. Neverwinter Nights oyununda uygulanan bu teknik
sayesinde karakterden uzak olan nesnelerin yapay zekalarının işletilmesi
engellenerekCPU’yuyormasıengellenir.Busayededahahızlıvekararlıçalışan
yapayzekasistemleritasarlanabilir.(Rabin,2002)
3.4.3GerçekZamanlıStrateji(RTS)
RTS yani gerçek zamanlı strateji oyunları belki de yapay zekanın en çok
kullanıldığı oyun türlerinden birisidir. Strateji ile yönetilen herhangi bir ordu,
şehir vb. oyuncu tarafından yönetilirken aynı zamanda diğer ordu, şehir gibi
öğelerdeyapayzekatarafındanyönetilirler.
RTStarzıoyunlaraengüzelörneklerkuşkusuzbilgisayaroyunlarıtarihininen
popüleroyunlarıolarakdagösterilebilirki,1992'deyayınlananDuneIIvedaha
sonrasındagelenWarcraft,Command&Conquer,AgeofEmpires,Civilization,
Starcraft,TotalWar,CompanyofHerosgibibirçokefsaneoyunserisiRTSoyun
türününeniyiörnekleridir.
RTS oyunları yapay zeka açısından geliştirilmesi en zor oyunlardan birisidir.
ÇünküCPUyapayzekaileyorulurkengrafikselolarakdaoluşanbinalar,oradan
orayagidenkarakterlergibibirçoknesneyiişlemekzorundadır.Optimizasyon
19
olarakzorluğununyanında,yapayzekaöğelerininzenginliğibakımındandaçok
detaylıdır. Öyle ki, bir RTS oyununda statik görevli birimler, statik görevli
ekonomikbirimler,komutvericistratejikbirimler,üstseviyestratejikbirimler,
bina-yapı birimleri, yaşayan hayat birimleri, yol bulma ve stratejik destek
sistemlerigibigenelöğeleryeralmaktadır.
Bu parağrafta yukarıda anlatılan öğeler biraz daha açılarak RTS oyunlarının
yapayzekasistemleriincelenmeyedevamedilecektir.Statikgörevlibirimler,
genel olarak bir savaş oyunu örneği göz önüne alındığında, oyundaki savaşan
askerleri temsil eder. Bunların yol bulma ve hedef belirleme gibi temel
özelliklerinin yanında bir de statik görevleri vardır. Bu görevler hedefe
kilitlendiklerinde okçu birliklerinin hedefe ok atması, kılıçlı askerlerin hedefe
kılıçsallamasışeklindegider.Kilitlendiklerihedefyokolanakadaryadaoyuncu
oaskeriseçipbaşkabiryereyönlendirenekadarkendilerineverilenstatikgörevi
yerine getirirler. O esnada saldırının sağdan arttığını anlayıp sol tarafa geri
çekilmezleryadaherhangibirşekildegüçlerininazaldığınabakıpkorunacakbir
alanaramazlar.Yani,kararvermemekanizmalarıgelişmişdeğildir,bununyerine
basitolay-sonuçdöngüsüylehareketederler.Birdiğerönemlielementisestatik
görevli ekonomik birimlerdir. Bu birimler genelde oyunun ekonomi
döngüsünekatkıdabulunurlar.Örnekolarak,biraltınmadenindemadeninher
10dk'dabir1kgaltınüretmesinigösterebiliriz.Bustatikekonomikbirimlere
tarlada çalışan işçiler veya inşaat yapan işçiler de dahil olabilirler. Bunlar da
sadeceverilengörevleriyerinegetirenveonundışındapekdaakılyürütmeyen
öğelerdir.Bakıldığındakapitalistveemperyalistolguylanekadarbağdaştığınıda
görülmüşolur.Üstseviyestratejikbirimler,tıpkıoyunuoynayaninsanlargibi
düşünen,birçokekonomik,sosyalveaskeriparametreyikontroletmesigereken
birimdir.Bubirimkişioyunuoynarkenkarşısınarakipolarakgelecekdüşman
orduların oluşturulmasında kullanılır. Bu birim kendinden aşağıdaki tüm alt
birimleriyönetenbirimdir.Komutvericistratejikbirimise,üstseviyestratejik
biriminaltındayeralır.Yaniüstseviyestratejikbiriminyönettiğibirimlerinalt
birimlerini yöneten birimdir. Örneğin, bir komut verici stratejik birim altın
madenini kontrol eder ve altın sayısı ihtiyacı artığında altın madeni
oluşturulmasınısöyler.Busayedeoyunungenelinikontroletmekyerineherbir
20
parametreiçinbirkomutanatamasıyapılmışgibiolacaktır.Bina-yapıbirimleri
RTS oyunlarının olmazsa olmazlarındandır. RTS oyunlarında elde edilen
kaynaklarbellibaşlıbinalardasaklanırveyinebukaynaklarbellibaşlıbinalar
tarafından üretilir. Onun için RTS sisteminde bina-yapı birimlerinin önemi
fazladır. Yaşayan hayat birimleri içerisinde oyunun yaşayan atmosferi
gösterilmektedir. Ortalıkta dolanan karakterler ve hayvanlar oyunun yaşayan
atmosferininioluştururlar.Bunlarınherhangibirgörevleriolmayacağıgibibelli
biramacadahizmetedebilirler.Tümbunesneleringeneliisemutlakabiryol
bulma(path-finding)algoritmasıileoradanorayaoyuniçerisindeyerdeğiştirip
dururlar.
Stratejikdestekbirimleriise,RTSoyunlarınıdahazekihalegetirenyapayzeka
elementleridir.Bunlararazianalizi,rakipmodelleme,kaynakyönetimi,keşifve
diplomasi sistemi olarak gösterilmektedir. Arazi analizi, aslında grid tabanlı
olarakarazininayrıştırılmasıveherbirgridüzerindebellibilgilerintutularak
yapayzekalırakiplerinbilgiyedahaçabukulaşmalarınısağlamak,böylecedaha
güçlürakipleroluşturmakiçinçokönemlidir.Herbirgridüzerindesaklananbilgi
oyunyüklenirkenoluşturulurveyapayzekalırakiplerbuözelliklerikullanarak
dahazekihalegelirler.Örneğin,büyükbiraskerkafilesibiryerdenbaşkabiryere
taşımakistediğindeoyunuoynayankişibüyükbirkafileninköprüdesıkışacağını
bilir ve hemen yığılmayı önlemek için alternatif bir yol bulur. İşte bu gridlere
yazılacak ekstra bilgilerle yapay zekalı rakiplerin de aynı şekilde insan gibi
davranabilmeleriiçinaraziyebiripucubırakılabilir.RakipModelleme,aslında
kendi kaynaklarını yö netebilen ü st seviye stratejik birimlerden çok kendi
rakibini tanıyabilen ve rakibine gö re strateji geliştirebilen bir modelin
oluşturulması ve bö ylelikle daha zorlu ve gerçekçi rakiplerin oluşturulması
anlamına gelmektedir. O‚ rneğ in, oyuncu oyunu oynarken diğ er rakiplerinin
(yapayzekalıveyadeğ il)barındırdığ ıkaynaklara,nerelerdeaskeribirliklerinin
olupnerelerdezayıfolduğ unadairbilgilerigö rerekonagö restratejigeliştirebilir.
Ancak, yapay zekanın genel gö revi sadece atak yapmaktır algısı burada çok
monotonolarakkabuledilmektedir.Yapayzekalıkarakterindediğ errakiplerini
ve oyuncuyu tanıması daha iyi atak yapmasına ve daha iyi defans yapmasına
olanak sağ layacak, bu sayede daha zeki bir rakip ü retilmiş olacaktır. Kaynak
21
Yönetimi;BirçokRTSoyunugenelliklekaynaklarü zerindenilerleyenbiryapıya
sahiptir.I„lerlemeveataksonucuişgaletmedeenö nemliolguişgaledilenyerdeki
kaynakların zenginliğ idir. Kaynakların yö netimi konusunda gü çsü z olan yapay
zeka nesneleri deneyimli oyuncular tarafından çabuk farkedilecek ve
zaaflarından daha kolay yararlanabilecektir. O‚ rneğ in, bir yapay zekalı rakip
sü reklibirbinainşaediyor,birbinainşaettiktensonradiğ erinebaşlıyorsabu
inşaişlemlerisırasındagü çlü birdefansyapamayacaktır.Bunubilendeneyimli
oyuncularisebuzaaflardanyararlanarakkolaycakaynaklarıelegeçirebilecektir.
Keşif; Aslında yukarıda sayılan tü m ö zellikler insanların daha kolay yaptıkları
şeyleriyapayzekalırakiplerindeyapabilmelerinisağ lamakiçindir.Bunlarınen
belirginleridekeşifö zelliğ idir.Çü nkü insanlarharitayıkeşfeçıkarakbilgisayar
başında oturarak altınların oluşmasını izlemek yerine yeni yerler keşfetmeyi,
yenidü şmanlarveonlarınkaynaklarınıbulmayıisterler.Onlarınzayıfnoktalarını
belirlerlerveonagö retaktikvestratejibelirlerler.Yapayzekanınkeşfetmesiise
kendi alanı ile sınırlı kalmalıdır. O‚ yle ki, yapay zekalı rakip herhangi bir şeyi
nereye koyacağ ını hesap etmek zorunda değ ildir, çü nkü rastgele ö ğ eleri
yerleştirerekoyuniçerisindekendialanınıoluşturmayaçalışır.Ancakuçkısma
yerleştirdiğ i binaların gö rü ş alanına herhangi bir nesne girdiğ inde kendisine
karşıbiristilaolduğ unuanlarveonagö reatağ ageçer,amageneldehepbuö n
taraftaki binaları kaybederler. Buna rağ men insanlar ö ncelikle şehirlerinin
etrafınıduvarlakaplarlarvebuduvarlarıngerisinenö betçikuleleriyerleştirirler,
busayedenö betçilerdenhabergelsebilebirliklerorayasevkedilenekadarduvar
şehrikorurveuçkısımdakibinalarınkaybedilmesiniö nlemişolurlar.Sonolarak
diplomasi sistemini açıklayacak olursak, diplomasi sistemi aslında yine ü st
kısımdabahsedildiğ igibiinsanlarınçokiyiyaptığ ıancakyapayzekalırakiplerin
yapamadığ ı bir sistemdir. Diplomasi sisteminde genel olarak oyuncu bir diğ er
oyuncuya“bensanasaldırmayacağ ım”sö zü nü verir,dahasonradiğ eroyuncuda
sö zü verene kendi haritasını gö sterir. Buna bakarak oyuncu “rakibim şu
geliştirmeleriyapıyorozamanbenimdeşuveşunlarıyapmamgerekir”şeklinde
bir fikir yü rü tü r. Sonuç olarak oyuncu, diplomasi sistemi geliştirilen bir yapay
zekalı rakip ile konuşabilerek ne zaman ve nereden atak gelebileceğ ini ona
sö yleyebilir.Aynışekildeodaoyuncuyabutipö ncedenbilgilendirmeleryapabilir.
(Schwab,2009)
22
Bu tarz oyunlarda yine sonlu durum makineleri (finite-state machine) statik
gö revlibirimleriçinsıklıklakullanılır,yinedavranışağ açları(behaviortrees)ve
yol bulma (path-finding) becerilerinden yararlanılır. Ancak stratejik birimlerin
modellenmesinde mantıksal durum makineleri (fuzzy state machine/FuSM)
olarak adlandırılan bir yapı kullanılır. Mantıksal durum makineleri sistem
içerisindebirçokdetayıhesaplayarakkararverenbiryapıyasahiptir.RTSoyun
tü rü ndekullanılanbirdiğ erdurumisehiyerarşikyapayzeka(HierarchicalAI)
olarak adlandırılan yapıdır. Bu yapıya ö rnek vermek gerekirse, bir yere atak
yapılırken asıl hedef olmasa bile yolda karşılaşılan diğ er dü şmanlarla da
savaşmakgerekecektir.Budurumdahiyerarşikolarakyenigö revö nealınacakve
çö zü ldü ktensonraasılhedefeilerlenilecektir.
3.4.4.Macera(Adventure)
Macera oyunları çok eski bir tü r olmasına rağ men gü nü mü zde Walking Dead
serisi ile yaşatılmaya devam eden ve bir hayli de fanatiğ i olan bir tü rdü r. Aynı
zamanda Grim Fundando, The Monkey Island, Day of The Tentacle gibi başını
LucasArts'ın çektiğ i oyunları da barındıran bir tü rdü r. Macera oyunlarında
geneldeoyuncununbellibirakışıtakipetmesiistenmezvekendikendineortamı
keşfetmesi, bununla birlikte ortamda gizli nesneleri bularak veya bunları
toplayarakbirsonrakietabageçmesi,kısacasıderinbirmacerayakoyulmasıile
oyunsü rü pgitmektedir.Çoğ uzamanoyununtekbirgidişatıolmaz,oyuncunun
yaptığ ı seçimlere gö re bir veya birden fazla sonuçla birlikte oyun şekillenerek
devameder.
Macera oyunları içerisinde genel dü şman yapay zekası, algılama sistemleri ve
klasik davranış ağ açları (behavior trees) yer almaktadır. Ayrıca, oyuncu ile
işbirliğ i yapan karakterlere de bu oyun tü rü nde sıklıkla rastlanmaktadır. Bu
karakterleroyuncuyabirşeyleriişaretederekyardımcıolankarakterlerdir.
Macera oyunlarında genelde bulanık mantık (fuzzy logic) kullanılır. Bu sistem
sonludurummakinelerinin(finitestatemachine)dahagelişmişiolanvegirdiye
23
gö reçıktınınmantıksalolarakoluşturulduğ ubirsistemdir.Buyö nü yleFSM'lerin
daha gelişmiş bir tü rü dü r diyebiliriz. Yani, bir çok girdiyle birlikte davranışın
oluşmasıyö ntemidir.
3.4.5.Platform
Bir diğ er popü ler tü r ise platform oyunlarıdır. Platform oyunları, herkesin
yakındanbildiğ iSuperMarioBros'unbaşınıçektiğ ioyunlardır,Şekil3.2’deSü per
Mario Bros’un ana gö rseli bulunmaktadır. Sü per Mario Bros’un yanı sıra bu
kategoridedahabirçokü nlü oyunbulunmaktadır.Bunlardanbaşlıcaları:Sonic,
Limbo,DonkeyKong,PrinceofPersia,Castlevania,TombRider,LittleBigPlanet,
Mega Man, Ratchet and Clank gibi daha yü zlercesini sayabileceğ imiz efsanevi
oyunlardır. Platform oyunları bilgisayar oyunlarının ilk yıllarından bu yana
popü lerliğ i hiç dü şmeyen ve gelişen mobil teknolojiler ile birlikte tekrar
gü ndeme gelerek Limbo, LittleBigPlanet gibi yeni efsaneler ortaya çıkaran bir
tü rdü r.
Şekil3.2:SüperMarioBrosoyunuanagörseli
Platform oyunları genelde iki boyutludur, ancak son zamanlarda ü ç boyutlu
ö rneklerini de gö rdü ğ ü mü z, bir platform ü zerinde seyreden, kameranın
karakteritakipettiğ ivesü rekliyeniortamlarınekranaakmasıilebirlikteoyuncu
karşısınagelendü şmanlarlasavaşılanyadahiçsavaşmadankaçılaneğ lencelibir
oyuntü rü dü r.Buoyunaherkesinhayatındaenazbirkereoynadığ ıyadagö rdü ğ ü SuperMarioö rnekolarakverilebilir.Mario,ekrandahareketettikçekamerada
onunla birlikte ileri gider. Bu esnada Mario ekrandaki platformların ü zerine
24
zıplayarakveyamantardü şmanlarınü zerinebasıponlarıezerekyolunadevam
eder ve platformdaki boşluklardan gelen engellerden kaçarak bir sonraki
seviyeyegeçmekiçinuğ raşır.
Şekil3.3:SüperMarioBrosdenizbölümü
Şekil3.2veŞekil3.3’degö rü ldü ğ ü gibioyun,farklıharitalardafarklıdü şmanlara
karşı ilerleyerek devam etmektedir. Mario'nun dü şmanı aslında mantarlar ve
kaplumbağ alar olarak gö rü nse de farklı bö lü mlerde çeşitli dü şmanları vardır.
Bunların arasında bomba atan kapakçıklardan, pirana bitkilere, uçan
kaplumbağ alardan, deniz anası ve çekiç fırlatan kaplumbağ alara kadar bir çok
çeşit bulunmaktadır. Şekil 3.4’te ise platform oyunlarının vazgeçilmezi, bö lü m
sonucanavarlarınınenpopü leriolanBowser’ınbirekrangö rü ntü sü verilmiştir.
Şekil3.4:SüperMarioBros'unEnPopülerBölümSonuCanavarı:Bowser
Platform oyunlarında genelde path-finding (yol bulma) gibi bir ö ğ e
bulunmamaktadır. En basit ve yapay zeka açısından en az karmaşık olan oyun
tü rü dü r.
25
Platform oyunlarında kullanılan en karmaşık yapay zeka oyunların harita
tasarımlarındadır. Prosedü rel olarak bö lü mlerin oluşturulması işi platform
oyunlarındageneldeyapayzekatarafındanyapılır.HattabuişlemRPGvestrateji
oyunlarındakibö lü mtasarımişlemindenbilezordur.Çü nkü değ işikliklerçokaz
olduğ u için birbirini tekrar etmeyen nesnelerin ve tekdü zeliğ i yok edecek
bö lü mlerin tasarlanabilmesi için akıllıca bir yapay zeka algoritmasına gerek
duyulur.(ComptonveMateas,2006)
3.4.6.Spor(Sport)
Spor oyunları da yapay zekanın en ağ ır kullanıldığ ı alanlardan birisidir. Spor
oyunlarına en bü yü k ö rnek yıllardır adı ezberlenilen ve artık bir klasik haline
gelen FIFA ve PES serileridir. Futboldan başka spor dallarında da bir çok spor
oyunuheryılyenilenerekpiyasayasü rü lmektedir.
Spor oyunlarındaki yapay zeka çok komplekstir, uygulandığ ı spor dalıyla ilgili
kurallar setini ve bir takım hesaplamaları içerir. Basit olarak tenis oyunu ele
alındığ ındabiletoputakipetme,gelenpozisyonagö reendoğ ruhareketlevuruşu
yapma ve sayı alma gibi aksiyonları içerir. Ayrıca topu çizgi dışına atmama,
filedengeçirememegibikuralsetleriniveelbetteskorsisteminioluşturur.Spor
oyunları genellikle hızlı ilerleyen, dinamik ve uzun sü reli devam eden oyunlar
olabileceğ igibi(futbol,basketbol,tenisvb.),herbirsettesıfırlananveyeniden
başlayan(beyzbol,amerikanfutboluvb.)oyunlardaolabilirler.(Schwab,2009)
Sporoyunlarındagenelliklesensö rler,algılamayadayalıvebellidavranışağ açları
şeklindekompleksbiryapayzekabulunur.Ayrıca,oyununilerleyişininyanında
yapılacakdeğ işiklikler,taktiksisteminindeğ iştirilmesivb.gibidurumlariçinde
taksikselbiryapayzekanınbulunmasıgerekmektedir.Ancakgenellikleişinilk
başlarında bu taksiktsel yapay zeka gö z ardı edilir ve mevcut oyunun ana
mekanikleriileilgilenilir.
26
Klasik olarak bir futbol oyunundan ö rnek verilecek olursa, ö ncelikli olarak
futbolcularınsahayadizilişlerivemevkiileribelirlenir.Herfutbolcuiçingerekli
koşualanıdaburadabelirlendiktensonrafutbolcularınherbiriiçinbirsensö r
geliştirilir.Busensö rtopkendibö lgelerindeolduğ uzamantopaduyarlı,kendi
bö lgelerinde olmadığ ı zaman ise rakibe duyarlı olmalıdır. Yani top kendi
bö lgesindeyse topu çalmak veya pas almak için doğ ru koşuyu yapmalı, kendi
bö lgesindedeğ ilsemarkajaltınaalabileceğ ibirrakipbelirlemelidir.Dahasonra
birdavranışağ acımodeliolmalıdır.Budavranışağ acıoyuncununhangibö lgede
ve hangi durumlarda nasıl davranacağ ını belirlemeli ve bö ylece futbolcu orta
sahadan amaçsız şutlar çekmeye kalkmamalıdır. Futbol gibi oyunlarda
oyuncuların ve kalecilerin yapay zekaları ve davranış ağ açları farklıdır. Ancak
buradaki kompleks yapı tabii ki oyuncu ve kalecilerin farklılıklarında değ ildir.
Karmaşıklık topa sahip olan oyuncunun seçeceğ i muhtemel davranış biçimine
gö re farklılık gö stermesidir. O‚ rneğ in, ö nü boş olan bir oyuncu topu sü rmek
isteyecek,toplabirliktehü cumkanadındakioyunculardahareketedeceklerdir.
Hareketetmeleriesnasındaofsaytkuralınadikkatetmelerigerekirvetopusü ren
oyuncunundavranışıpasvermeeyleminegeçecekse,ozamandapasverebileceğ i
enuygunveenetkilikişiyihesaplamasıgerekmektedir.Buşekildekompleksolan
biryapıdaşü phesizanındakararvermevekararmekanizmalarıçokgelişmişve
hızlıolmalıdır.
Çoğ u araştırmacı dö vü ş oyunlarını spor oyunlarından farklı bir sınıfta
değ erlendirir. Ancak dö vü ş oyunları tam da spor oyunları klasmanında
değ erlendirilmesi gereken durumdadırlar. Dö vü ş oyunlarında rakibin
hareketlerini takip eden sensö rler bulunur. Bu sensö rlere gö re rakibin yaptığ ı
hareketlerizlenirveonagö rerakibesaldırmaveyakorunmadurumlarınageçiş
yapılır.Saldırmadurumunageçişyapıldığ ındahangihareketoandadahaverimli
verakibekarşıgalipgelmeyikolaylaştıracaksaohareketekararverilir.
Klasik sonlu durum makineleri (finite-state machine) kullanımına ek olarak
mantıksal durum makineleri (fuzzy-state machine) kullanımı ve veriye dayalı
sistemler(data-drivensystems)sıklıklakullanılır.Çü nkü oyuniçerisindebirçok
27
yerdeverilerdeğ işecek,oyuncununperformansı,kondisyonugibiparametreler
izlenerekbuparametreleregö redurummakineleriişleyecektir.
3.4.7Yarış(Racing)
Yarışoyunlarıdakendilerineö zelyapayzekamekanikleriolanoyunlardır.Yarış
oyunlarında genellikle çok fazla yapay zekaya ihtiyaç duyulmaz. Çü nkü , genel
olarak çok fazla takip edilecek parametre yoktur. Genel olarak sisteme
bakıldığ ında yine birden fazla sensö rü n bulunduğ u sö ylenebilir. Bunlar diğ er
yarışçıları kontrol eden sensö r, yolu kontrol eden sensö r olmak ü zere basitçe
ikiyeayrılabilir.Bununyanındaeğ eryarışyapılanpisttebirtrafikvarsamutlaka
bu trafiğ in de kontrol edilmesi gerekecektir, bunun için de ekstra bir sensö r
gerekir.
Yolu kontrol eden sensö rü n ana gö revi, oyuncuyu maksimum hızda yolda
tutmaktır.Bununiçinyoldaolupolmadığ ınıkontroleder,yoldançıktığ ındayada
yanlışyolagirdiğ indeyolatekrargirmesinisağ lar.Bunuyaparkendebasitçebir
sonludurummakinesi(finite-statemachine)kullanır.
Diğ er yarışçıları kontrol eden sensö r ise ö ndeki ve arkadaki yarışçılarla
arasındaki mesafeye gö re hızını artırarak, ö rneğ in virajlara sert girme gibi
opsiyonlaralabilir.Bö ylelikleö ndekiyarışçıilefarkıkapatırkenarkadakiyarışçı
ilefarkıaçmayaçalışır.Ayrıca,geneldeyarışlardabiraracındiğ eraracaçarpması
durumlarındacezaverilebilir.Bununiçindeekstradiğ eryarışçılaraçarpmamayı
kontroledebilir.
Yarışoyunlarındakiyapayzekaaslındatrafikdurumlarıişiniçinegirdiğ indeartar.
Trafik zaten başlı başına otonom işleyen ve bir sonlu durum makinesi(finitestatemachine)ilekontroledilebilenbiryapıdır.Araçlarkendiyollarındagiderler
ve virajlara geldiklerinde rastgele mü mkü n olan yö nlere dö nerek ilerlemeye
devamederler,karşılarınabiraraççıkarsahızlarınıdü şü rerektakipmesafelerini
korurlar,çokhızlıgitmegibibirdertleriolmadığ ıiçinoptimumhızlardailerlerler.
Hatta trafik ışıkları bile bu bağ lamda akışa dahil edilebilir. Yarışçıların trafikle
28
olanirtibatlarıise,ö nceliklegidilecekenkısayoluhesaplamalarındadinamikbir
engel olarak modellenebilir. Bunun yanında yarışçılar trafiğ in az olduğ u karşı
şeritlere geçerek kuralları ihlal de edebilirler. Bunlar oyunun elverdiğ i ö lçü de
gerçekleştirilebilir.
Trafik içerisinde araç trafiğ i olabileceğ i gibi yaya trafiğ i de olabilir. Bunlar
genelde kaldırımlarda yü rü yen, çok nadir karşıdan karşıya geçme eğ ilimi
gö steren ö ğ elerdir. Oyunun tü rü ne gö re yayalarla ilgili bir kural seti
oluşturulabilir. Ancak genelde trafikteki diğ er arabaların yarışçılarla girdiğ i
etkileşimleaynıetkileşimegirerler.
Geneldeyarışoyunlarındabirdü şmanveyasavaşmoduolmaz.AncakDeathRace
(O‚ lü mcü l Yarış) gibi oyunlarda genellikle arabalar ile arabaların birbirlerini
yarışmanın yanında bir dü şman belirledikleri oyunlar da olabilir. Bu tarz
oyunlarda bir de dü şman yapay zekasına ihtiyaç duyulacaktır. Bunun yanında
arabalarınyayalarıdü şmanolarakbelirlediğ ioyunlardaolabilir.
Yarış oyunlarında kullanılan yapay zeka genellikle, parkur gö sterimi, diğ er
yarışçıların çizgilerini kontrol etme ve bulma, yapay zekalı karakterin yarış
aracını (motor, araba, uçak vb.) kontrolü olarak sınıflandırılabilir. Bunların
yanındayapayzekakontrollü arabamodifikasyonuveayarlamalarıilebualanda
yapılanyeniliklerdegö rü lmektedir.(Beirne,2007)
Yarış oyunlarında genellikle sonlu durum makineleri (finite-state machine)
kullanılır.Bununyanındayolbulma(path-finding)vedavranışağ açları(behavior
trees)dakullanılmaktadır.
3.5.HTML5VEWEBGL'İNGELİŞİMİ
HTML,kö klerineredeyseinternetedayanan1993yılındanbuyanakullanılanen
kö klü metinbiçimlendirmedillerindenbirisidir.HTML,1999'akadar2.0,3.0ve
4.0 sü rü mlerini geçirmiş ve 1999'da son olarak 4.0.1 sü rü mü ne ulaşmıştır.
HTML'ibusü rü mlerineWorldWideWebConsortium(W3C)kuruluşununHTML
29
Working Group adıyla anılan grubu getirmiştir. Daha sonra aynı yıllarda grup
HTML'i bırakarak bir başka web standardı olan XML ve buna bağ lı olarak da
XHTML'eyö nelmişlerdir.Dahasonrayenibirwebstandardıisteğ iiçerisindeolan
kü çü kbirgrupinsanWebHypertextApplicationWorkingGroup(WHATWG)adı
altında2004yılındatoplanarakHTML5'inşartnamesiniçıkarmışlardır.(Lubbers
vd.,2011)
HTML5ileilgilibuçalışmalarınardındanW3C2006'daçalışmalarabaşlamışve
2008'deilkçalışansü rü mü ortayaçıkarmıştır.HTML5genelolarakHTML5,CSS
veJavascript'inbirleşimiileoluşanyenibirstandartlarbü tü nü dü r.HTML5yeni
elementleriveetiketleriyle,CSSbuetiketveelementleringö rü nü mkısımlarıyla
ve Javascript ise tü m bu yapının içeriğ ini işlemek, kullanıcıların aksiyonlarına
cevap vermek ve yeni HTML5'in programmatik avantajlarını kullanmak için
kullanılmaktadır.(Freeman,2011)
HTML5ilebirliktebirsü rü yeniö zellikveAPIgü nyü zü neçıktı.BunlarHTML5'in
gü cü nü vepopü lerleşmesinisağ layanenbü yü ketkenlerarasındadır.Bunlardan
en ö nemlisi de herhangi bir eklenti olmadan HTML5'in yapabildikleriydi ve
insanları en çok heyecanlandıran noktalar arasında gö steriliyordu. HTML5 ile
gelenyeniö zellikleraşağ ıdakigibisıralanabilir:
•
Canvas (2D ve 3D): Grafik ve çizim programlama için gerekli altyapıdır.
Bundanö ncebuişlemiçinAdobeFlashbenzerieklentilerkullanılmaktaydı.
AncakoyungeliştirmevegrafikprogramlamadaHTML5'inenbü yü kyeniliğ i
kuşkusuzbuö zelliğ iolduveoyunsektö rü nü kö klerindensarstı.
•
Cross-DocumentMessaging:Farklıkaynaklardanvefarklıalanadlarından
veri transferi noktasında HTML5'in bir diğ er mü kemmel ö zelliğ idir. Bu
ö zelliklebirlikteHTML5ü zerindeherhangibirbaşkaback-endprogramlama
diline gerek kalmadan web servislerinden veya farklı kaynaklardan veri
çekmeveverigö ndermeişlemleriyapılabilirhalegelmiştir.
•
Geolocation: Kullanıcıların coğ rafik konumlarını alabilmek için gerekli
API'dır.Bunagö rekullanıcılarınhangienlemveboylamü zerindeoldukları
bilgisi yani koordinatları alınabilmekte ve bunun için herhangi bir eklenti
30
kurulumunagerekkalmamaktadır.
•
AudioveVideo:Şü phesizHTML5'inkullanıcılarü zerindereytingyapmasını
sağ layanenbü yü kö zelliklerdenbirisidesesvevideooynatımıiçinherhangi
bir eklenti yü klemeye gerek kalmadan işlemlerin gerçekleştirilebilmesidir.
Bunun en gü zel ö rneğ i için Youtube, 27 Ocak 2015'te yayınladığ ı bir blog
yazısı 1ile varsayılan olarak HTML5 destekli <video> etiketini kullanarak
videolarını gö stermeye başladığ ını duyurdu. Bir çok modern internet
tarayıcısı artık video ve ses oynatımı için Adobe Flash gibi bir eklentiye
ihtiyaçduymamaktadır.
•
Forms: HTML5, web ü zerinde form oluşturmak için de bir çok yenilik
getirmiştir. Placeholder, autofocus gibi ö zelliklerinin yanında basit giriş
işlemleri için kullanılan <input> etiketinde bir çok yeni ö zellik ekleyerek
programlamadillerindekibirçokkontrolü kullanmayaolanaksağ lamıştır.Bu
bağ lamda<input>elementinintipleriolarak(type)email,url,number,range,
date, datetime, month, week, time, search, color gibi bir çok element
sayesinde otomatik olarak bir email girişi, belli aralıklarda sayı girdirme,
tarihvezamanseçimaracı,aramaçubuğ u,renkseçimpaletigibiö zellikler
kolaycakullanılabilmektedir.2
•
Scalable Vector Graphics (SVG): HTML5'in Canvas tarafındaki gü cü yle
birliktevektö relgrafikçizdirmekonusundadabirçokö zellikgeliştirilmiştir.
<svg> etiketiyle sunulan SVG grafikleri çok geniş bir tarayıcı desteğ ine
sahiptir. Bu element içerisinde basit olarak <circle>, <rect>, <polygon>,
<ellipse>, <text> gibi bir çok etiketle tanımlanırlar. SVG bir grafiğ in XML
formatına dö nü ştü rü lmü ş halidir denilebilir. Bö ylelikle çö zü nü rlü kten
bağ ımsızdırlar. Bu gibi bazı ö zellikleriyle Canvas elementinden ayrışırlar.
Canvas, grafik yoğ unluğ u çok olan oyunlarda kullanılabilirken, SVG bu tü r
uygulamalariçinuygundeğ ildir.
•
WebSocketAPI:WebSocketAPIsayesindewebuygulamalarındaçifttaraflı
iletişimsağ lanarakoluşturulacakbirsocketsayesindesunucuileJavascript
tarafında iletişim kurulabilmesi sağ lanmıştır. Bu sayede HTML5 ve WebGL
tabanlı
1 2
oyunların
birbirleri
arasında
sunucu-istemci
bağ lantıları
http://youtube-eng.blogspot.jp/2015/01/youtube-now-defaults-to-html5_27.html
http://diveintohtml5.info/forms.html
31
kurabilmelerimü mkü nhalegelmektedir.
•
Local Storage: Lokal veri depolama, HTML5 uygulamalarının tarayıcılar
ü zerindeveridepolayabilmelerineolanaksağ lar.AynızamandaWebStorage
veya DOM Storage olarak da bilinir. Eskiden veriler lokal olarak yazılmak
istendiğ indecookiekullanılırdı.Ancaklokalveridepolamaçokdahagü venli
vebü yü kbiralanadepolamayapabilmeyisağ lar.Lokalveridepolamadomain
tabanlıdır. Aynı domain ü zerinden tü m sayfalar veri yazabilir ve veri
okuyabilir.Yanibusayedediğ ersiteleryazılanverileriokumaveyazmaiznine
sahipdeğ ildirler.
•
Offline Web Apps: Aslında HTML5 ile ilgili vaat edilen en ö nemli
gelişmelerden birisi de çevrimdışı çalışabilen web uygulamalarıdır. Bunun
içinbirCacheManifestFileoluşturulurvebudosyaü zerindenofflineolarak
uygulamaçalıştırılır.Bazıtarayıcılarbudosyalarasınırkoyabilmektedir.
•
Drag and Drop: Sü rü kle bırak ö zellliklerini standart haline getirerek tü m
nesnelerinbuö zellikleresahipolduğ ubiryapıdır.
•
WebWorkers:WebWorkers,Javascriptkodlarınınarkaplandaçalışmalarına
olanak sağ layan bir yapıdır. Bu sayede Javascript kodları arka planda
çalışarakmevcutsayfayıyormaz.Farklıbirthreadü zerindeişlemyapılması
gibigö rü lebilir.
•
Server-Sent Events: Server-Sent olayları, web sayfası sunucu tarafından
otomatik olarak bir gü ncelleme aldığ ı zaman fırlatılan olaylardır. Bu
kullanımlara Facebook ve Twitter gibi sitelerdeki sunucu tarafından gelen
gü ncellemeleresayfanınverdiğ icevaplarö rnekgö sterilebilir.
•
XMLHttpRequestLevel2:AJAXtabanlıveritransferiprotokolü nü nbirü st
sü rü mü dü r. Bu sü rü mde temel farklılık olarak, cross-origin istekler,
uploadingprogressolayıvebinaryverigö nderme/almagö sterilebilir.
HTML5'in bu temel ö zelliklerinin yanında her geçen gü n geliştirilmeye devam
eden bir çok API bulunmaktadır. Bunlar Microdata, Web Cryptography API,
MathML diye uzayıp gitmektedir. Ancak geliştirilen tü m API'ler her tarayıcı
tarafından desteklenmemektedir. Bu test için www.html5test.com sitesinden
kullanılan internet tarayıcının hangi ö zellikleri destekleyip hangilerini
desteklemediğ igö rü lebilir.Tarayıcıtarafındahangiö zelliklerinkullanılıphangi
32
ö zelliklerin kullanılamayacağ ını ö ğ renmeye olanak sağ layan Modernizr API
ismindebirAPIbulunmaktadır(Bk.http://modernizr.com/).BuAPIprojelerde
kullanılarak hangi ö zelliklerin desteklenip hangi ö zelliklerin desteklenmediğ i
ö ğ renilebilir.(Lubbersvd.2011)
HTML5'tebirçokAPIgeliştirilereksistemingü cü negü çkatılmıştır.Bunlardan
kuşkusuzengü zeliWebGLileü çboyutlugö rsellerintarayıcıtarafındaherhangi
bir eklenti kurmaya gerek kalmadan gö sterilmesi durumudur. WebGL aslında
OpenGL'inHTML5'euyarlanmışkısmıdır.YaniHTML5içerisindeherhangibaşka
bir programlama dili kullanmadan Javascript ile ü ç boyutlu nesneler
oluşturabilir ya da bir karakter modeli import ederek animasyon
gerçekleştirilebilir.
WebGL ile birlikte geliştiriciler, bir tarayıcı ü zerinden bilgisayarın tü m
donanımsal grafik işleme gü cü nü kullanabileceklerdir. WebGL'den ö nce
geliştiriciler,geliştirdikleriuygulamalarıyabireklentiyikullanıcılarayü kleterek
(Adobe Flash Player gibi) ya da kendi hazırladıkları işletim sistemine ö zgü (.exe,.app,.deb,.apkvb.)uygulamalarıkullanıcılarınbilgisayarlarınaindiripher
işletim sisteminin kendine ö zgü rutinlerle sisteme kurulmasını sağ lamaları
gerekmekteydi.(Parisi,2012)
WebGL ö ncelikli olarak masaü stü sistemlerde çalışması için tasarlandı. Ancak
mobilwebtarayıcılarınındagelişmesiilebirlikteartıkmobiltarayıcılarü zerinde
de 3D grafikler oluşturulması mü mkü n hale gelmiştir. WebGL, OpenGL ve
COLLADAgibibirçokü rü nü ngeliştiricisiKhronosGrouptarafındangeliştirilen
bir API olarak HTML5'in bir parçası haline gelmiş ve modern browserlar
tarafından desteklenmektedir. Çizelge 3.1’de WebGL destekleyen tarayıcı ve
sü rü mleribelirtilmektedir.
33
IE
Tarayı
cı
Firef
Chro
Safa
Ope
iOS
Ope
Andro
Chro
ox
me
ri
ra
Safa
ra
id
me
ri
Min
Brow
for
i
ser
Andr
Sürüm
ÖncekiSürümler
oid
Mevcut
Sürümler
Gelecek
Sürüm
8
9
31
10
42
11
38
43
7.1
7.1
Ed
39
44
8
30
40
45
9
41
46
42
47
4.1
4.3
4.4
4.4.4
42
8.4
8
40
42
31
9
32
ge
DesteklenenSürümler
KısmiDesteklenenSürümler
DesteklenmeyenSürümler
Çizelge3.1:WebGLDestekleyenTarayıcıveSürümleri
Çizelge3.1’egö reIE11vesonrası,Chrome31vesonrası,Safari8vesonrası,iOS
8.4 ve sonrası sü rü mler tamamiyle WebGL desteklemektedir. Firefox 38 ve
sonrası,Safari7.1,Opera30vesonrası,AndroidBrowser5.x(Chromium40)ve
Chrome for Android 42 sü rü mlerinin ise WEBGL’i kısmi olarak desteklediğ i
gö rü lmektedir. Masaü stü ortamlar için bir çok modern sistemde desteklenen
WebGL,mobilsistemleriiçiniOS8.4’tetamamenveAndroid5.0sü rü mlerinden
sonraisekısmendesteklenmeyebaşlanarakgü zelbirivmekazanmışdurumdadır.
Bu da şu demek oluyor ki iOS UIWebView ve Android WebView nesnelerinin
içerisinde çalıştırılan WebGL oyunlarını oynatılabilmektedir. Bö ylelikle hem
farklıbiroyunmotoru(Unity,UnrealEnginevb.)kullanmayahemdefarklıdiller
34
(iOS için Swift veya Obj-C, Android için C++ veya Java) kullanmaya gerek
kalmadan,JavascriptileWebGLü zerindenoyunlaryayınlanabilecektir.
KhronosGroupWebGL'iOpenGLES2.0ü zerindeinşaederektıpkıdiğ erHTML5
API'leri gibi geliştirmiş ve bu API sayesinde ü ç boyutlu grafik uygulamalarını
normal html elementleri ve alt seviye DOM arayü zü nde kullanılabilir hale
getirmiştir. Bununla birlikte WebGL ile ü st seviye bilgisayar oyunları
geliştirilebileceğ igibiü çboyutluwebuygulamalarıdaoluşturulabilecektir.
WebGL'inengü zelö zelliklerindenbiriside,birAPIolaraktasarlandığ ıiçindiğ er
tü mhtmlelementleriiçerisindekullanılabilirdir.Bö ylelikleHTML5içerisindeki
iki boyutlu çizim kü tü phanesi olan <canvas> elementi içerisine Javascript
programlamadiliyleü çboyutlugrafikprogramlamayapılabilmektedir.
WebGL'in OpenGL ES ü zerine entegre edilmesinin bir başka artısı ise OpenGL
ES'ingö mü lü sistemler(embededsystems)içinuyarlanmışolmasıvelidertü m
mobilişletimsistemlerindedoğ rukaynakyö netimi,dü şü kgü çtekicihazlardave
mobil platformlarda (iPhone, iPad, Android Cihazlar vb.) çalışabilmesidir.
Bununla birlikte tü m platformlar için çalışan, tamamen platform bağ ımsız
(cross-platform) olan ve sistem kaynaklarını kullanma noktasında daha alt
seviyesistemleriçinbilesorunsuzçalışmaü zerinekurulduğ uiçinWebGLtü m
tarayıcılardaçalışabilecekbiraltyapıdır.
SonolarakWebGLplatformbağ ımsızolaraktü mtarayıcıveişletimsistemlerinde
çalışabilen,dinamikwebuygulamalarıveoyunlarü retebilmekiçingeliştirilmiş
tamamenü cretsizvetelifsizolaraksunulanbirhizmettir.
Ancak WebGL, OpenGL gibi çok alt seviye (low-level) bir kü tü phanedir. Bu
kü tü phaneyi kullanmak da OpenGL kadar karmaşık ve uzmanlık isteyen bir
yapıdadır. Ancak bazı oyun motorları sayesinde WebGL'in de kullanımı daha
kolayhalegelmiştir.BunlarınarasındaWebGL'eexportseçenekleriolanUnityve
UnrealEnginedıştatutulduğ unda-kiçü nkü bunlardoğ al(native)olarakWebGL
35
geliştirilebilenmotorlardeğ ildir-birçokgelişmişoyunmotoruvearacınolduğ u
gö rü lü r.
3.6.HTML5OYUNMOTORLARI
HTML5 ile oyun geliştirme noktasında aslında iki seçenek bulunmaktadır.
Bunlardan ilki 2D oyunların geliştirilebildiğ i Canvas, diğ eri ise 3D oyunların
geliştirildiğ iWebGL’dir.Oyunmotorlarısayesindehem2Dhem3Doyunlarıaynı
platform altında geliştirilebileceğ i, gerekli programmatik ö ğ elerin ö nceden
kontroledildiğ ivebazıfonksiyonlarınkolaycayapılmasınısağ layanbiraraçlar
bü tü nü ne sahip olunur. Bu sayede oyun geliştirmek için sarfedilen çaba azalır,
ortayadahayaratıcıveiyiişlerçıkarılabilir.
Buradaki
HTML5
oyun
motorlarını
incelerken
aslında
DignityAI'ı
kullanabileceğ iniz oyun motorlarını da listelemiş olacağ ız. DignityAI oyun
motorlarından bağ ımsız olarak Javascript programlama dili kullanılarak
geliştirilmişbirkü tü phanedir.DahasonrakiaşamalardaUnityveUnrealEngine
gibioyunmotorlarınadauyarlanarakburalardadakullanılabilecektirancakşu
andaHTML5tabanlıoyunmotorlarındakullanılmayahazırhaldedir.
HTML5konusundaaslındapiyasayaçıkmışbirçokoyunmotorubulunmaktadır.
Geliştirilmesikolayvegereksinimleriazolduğ uiçinHTML5oyunmotorlarıçok
yaygın olarak geliştirilerek ü cretsiz olarak yayınlanmaktadır. Bunların yanında
ü cretli olan ve gelir paylaşımı modelini referans alan oyun motorları da
bulunmaktadır.
3.6.1.Construct2
Contruct Classic 2007 yılında bir grup ö ğ renci tarafından hobi olarak ortaya
çıkmışbiroyunmotoruprojesidir.Contruct2ise2011yılındaHTML5odağ ında
piyasayaçıkarılmışvebirçokkö klü değ işiklikyapılmışoyunmotorudur.Çoklu
platform desteğ i, kolay ö ğ renme ve gö rsel programlama gibi çok ö nemli
ö zellikleribü nyesindebarındırmaktadır.(Subagio,2014)
36
Construct2,HTML5oyunmotorlarıarasındaenpopü lerolanoyunmotorudur.
U‚ cretsiz kısıtlı bir sü rü mü vardır ve tü m ö zelliklerini kullanmak için ü cretli
modelleri de bulunmaktadır. Construct 2, iki boyutlu oyunlar geliştirmek için
tasarlanmış ve herhangi bir programlama bilgisi olmadan kullanıcıların oyun
geliştirebileceklerinisavunanbiroyunmotorudur.
Nesneleri sahneye sü rü kleyip bırakarak mevcut bir olay (event) sistemi
içerisinde bir Excel programı kullanırcasına oyun geliştirme yapılabilecek bir
editö rdü r.Bueditö rü nyanındabirdedavranış(behavior)editö rü bulunmaktadır.
Burada seçtiğ iniz nesnelere kolaylıkla fizik ö zelliğ i gibi ö zellikler verilebilir.
Anındagö rü ntü alınabilecekveö nizlemeyapılabilecekbirmodubulunmaktadır.
Ayrıca70adetWebGLtabanlıgö rselefektsunmaktadır.
Construct 2, 20'den fazla eklenti ve 70 WebGL tabanlı gö rsel efekt ile birlikte
sunulmaktadır.Eklentileriçerisindetextvespritegö rü ntü lemearaçları,videove
ses yü rü tme ö zellikleri, mouse ve klavye girişleri programlanabilen birimler,
Photoshopbenzeriefektler,partikü lefektlerigibibirsü rü eklentibulunmaktadır.
Construct 2 içerisinde DignityAI API kullanabilmek için Construct'un sunduğ u
SDK Template dosyası indirilmelidir. Bu template içerisine aktarılacak kodlar
sayesinde kolaylıkla oyun motoru içerisindeki ö ğ elere yapay zeka ö zellikleri
katmakmü mkü nolacaktır.
3.6.2.ImpactJS
ImpactJS, Dominic Szablewski taraından 2010 yılında geliştirilmeye başlanan
yine popü ler ve ü cretli oyun motorlarından birisidir. 99$ ü cretle satılmasına
rağ men çok popü ler bir oyun motorudur. Bu oyun motorunun en bü yü k
artılarından birisi Entity yapısına sahiptir. Motor içeirisnde .draw() metodu
ve.update()metoduilebağ lıbulunantü mEntityyapılarıiçerisindekiupdateve
drawmetotlarıçağ ırılarakbü tü neetkieder.
37
Weltmeisterismindebirleveleditö rü bulunmaktadır.Fizikö zellikleriiçinBox2D
kü tü phanesini kullanır. Ana yapısı dö rt bö lü mden oluştur. Core, modü l
tanımlamaları ve yü klemeleri, preload yö netimi, game loop çalıştırılması gibi
temel ö zellikleri yö netir. Logic, Entity, EntityPool, mause ve klavye girişleri,
çarpışma haritaları gibi oyunun içerisindeki mantıksal ve programmatik tü m
ö ğ eleri yö netir. Graphics, oyun içerisindeki grafik nesneleri, animasyonları,
fontları ve arkaplan haritalarını yö netir. Sound, kısmında ise oyundaki tü m
kullanılanmü zikvesesefektleriyö netilir.(CielenveMeysman,2013)
3.6.3PixiJS
PixiJS, Good Boy Digital oluşumu tarafından hazırlanan ve tamamen ü cretsiz
olarak Github ü zerinden dağ ıtılan bir oyun motorudur. Diğ er 2D oyun
motorlarınınaksinePixiJSeğ ertarayıcınınWebGLdesteğ ivarsaoyununuzudaha
performanslı olması için WebGL ile render eder. Ancak WebGL desteğ inin
olmadığ ıtarayıcılardanormalCanvasü zerindenişleminedevameder.
PixiJS, ImpactJS, Phaser, PandaJS gibi bir çok oyun motorunun da render
kısımlarında kullanılan bir araç olarak da gö sterilmektedir. 21 Nisan 2015
tarihinde yayınlanan 3. sü rü mü nde ö zellikle mimaride ve WebGL işleyicisine
bü yü kyeniliklerkatmıştır.
PixiJS,Node.jsü zerinekurulubirsistemdir.Oyunmotorunukullanabilmekiçin
Node.js'in bilgisayarınızda kurulu olması gerekmektedir. Node.js kurulduktan
sonrakolaylıklaPixiJSindirilerekü cretsizolarakkullanılabilir.
3.6.4PlayCanvas
PlayCanvas, diğ er oyun motorlarından farklı olarak web ü zerinde Cloud bir
hesapileoyungeliştirmeyeolanaktanımaktadır.Tamameninternetü zerinden
oluşturulan ve internet ü zerinde kodlarını, materyallerini oluşturarak ö rnek
projelerlevebasituygulamalarlabirkaçdokunuşlagü zeloyunlargeliştirilebilen
bir oyun motorudur. Motor ü zerinde eğ er ü cretsiz bir ü yelik bulunuyorsa
38
oluşturulanoyunlarherkeseaçık(public)olaraksergilenmektedir.O‚ zel(private)
projeleryapmakiçinisebirü yelikmodelineü yeolunmasıgerekmektedir.
Kodları,
PlayCanvas
Code
Editor
adındaki
bir
editö r
yardımıyla
dü zenlenebilmektedir.Ayrıca,hazırlananoyunlarGithubveBitbucketgibisosyal
kodpaylaşımsitelerinekolaylıklagö nderilebilmektedir.Ayrıca,PlayCanvas'ınen
gü zel ö zelliklerinden birisi de kendine has bir level editö rü nü n olmasıdır. Bu
editö r tıpkı bü yü k oyun motorları (Unity, Unreal Engine vb.) olduğ u gibi
tamamenü çboyutlusahnetasarımıyapmayavebusahneü zerindemateryalleri
dü zenlemeyeyardımetmektedir.
Şekil3.5:PlayCanvasOnline3DEditörü
Şekil3.5’degö rü ldü ğ ü gibisoltaraftasahnehiyerarşisininyeraldığ ı,ortadaü st
kısımdasahnenin,altkısımdaiseassetsklasö rü nü nbulunduğ u,sağ taraftaise
inspector aracının gö rü ndü ğ ü tıpkı Unity, Unreal gibi oyun motorlarının oyun
tasarımeditö rlerigibiWEBGLileçalışanonlinebireditö rsunulmaktadır.
PlayCanvas'ıdiğ erlerindenayıranö zellikise,bü tü nhalkaaçık(public)projeleri
kendi
proje
havuzunuz
içerisine
çatallayarak
(fork)
bu
projeler
kullanılabilmektedir.Buprojelerü zerindedeğ işiklikleryaparakyenitasarlanan
ekranlarlayepyenioyunlarü retilebilmektedir.
39
3.6.5Three.js
Three.js, WebGL ü zerine odaklanan ve WebGL ile ü ç boyutlu uygulamalar
geliştirmekonusundabelkideilkadımlarıatanveü cretsizolarakdağ ıtılanbir
oyunmotorudur.Buvesileylebirçokö rnekvebü yü kprojeThree.jsilebirlikte
yapılmıştır.Three.jsiçerisindeWebGL,Canvas,<svg>,CSS3D,DOMgibibirçok
rendererbulunur.Sahne,kamera,animasyon,ışık,materyal,shadergibibirçok
ö ğ eye izin verir. Three.js içerisinde kullanılacak olan ü ç boyutlu nesneler için
gerekli JSON formatı Blender, OBJ, FBX, CTM, 3D Max gibi formatlardan
dö nü ştü rü lebilir.
Three.js'inenbü yü kö zelliklerindenbirisiçokfazlaö rnekbulundurmasıdır.Bu
ö rnekler tamamen paylaşıldığ ı gibi istenilen projede de kullanılmasına izin
verilmektedir. Three.js 2010 yılında bir grup geliştirici tarafından tamamen
ü cretsiz ve açık kaynak kodlu olarak tasarlanan ve şu anda 100 geliştirici
tarafındangeliştirilmeyedevamedenbü yü kçaplıbirprojedir.
Şekil3.6:Three.jsOnline3DEditörü
PlayCanvas'daolduğ ugibiThree.js'dedeŞekil3.6’dakigibibireditö rçalışması
yapılmaktavetamamenü çboyutlusahneleringeliştirilenbueditö ryardımıyla
40
gerçekleştirilmesi planlanmaktadır. Geliştirilen bu editö r de PlayCanvas
editö rü ndeolduğ ugibitamamentarayıcıü zerindeçalışmaktaveWebGLuyumlu
tarayıcıdanbaşkaherhangibirö zellikistememektedir.
3.6.6Phaser
Phaser, ü cretsiz ve açık kaynak kodlu yayınlanan ve Github'da en popü ler
Javascript Game Engine listesinin başında yer alan oldukça geniş bir kitle
tarafından kullanılan HTML5 oyun motorudur. Yeni başlayanlar için oldukça
kolaybirö ğ renimvaatedenPhaser,2Doyungeliştirmetarafınaodaklanmıştır.
RendertarafındaPixiJSkullananPhaserWebGLveHTML5'edestekvererekü ç
boyutluuygulamalardayapmayaolanaksağ lamaktadır.Ayrıcakendiiçerisinde
bireklenti(plugin)sistemiolanPhaser'ınenö nemlieklentisiEasyStarismindeki
yolbulma(pathfinding)eklentisidir.
Phaser içerisinde Javascript kullanılabildiğ i gibi bir de Typescript
kullanılabilmektedir. Bunun için Visual Studio Plugin kullanılabileceğ i gibi
Node.js npm sistemi de kullanılarak bu yenilikçi dil sisteme entegre edilebilir.
Typescript, temelde Javascript'e derlenen ancak Javascript'i daha nesne
yö nelimlihalegetirmeyeyarayanyenibirü stkatmandır.
Phaser'ınenbü yü kartısıkolayö ğ renilebilirvekullanılabilirolmasıdır.Birçok
durumu geliştirici için otomatik olarak işletir. Preloader, fizik sistemi, sprite,
animation, particle, input, sound, tilemaps, cihaza gö re ö lçeklendirme, mobil
tarayıcıdesteğ igibibirçokö zelliğ ibü nyesindebarındırır.(Bibat,2015)
3.6.7Kiwi.js
HTML5 ü zerinde mobil ve masaü stü oyun geliştirmek için tasarlanmış ve açık
kaynakkodluolarakyayınlananbiroyunmotorudur.2Dve3Dçizimö zellikleri
içinWebGLdesteğ ibulunmaktadır.OyunlarıyayınlayabilmekiçiniseCocoonJS
platformunukullanır.CocoonJSsayesindehemmobilhemdemasaü stü ü zerinde
41
uygulamaoluşturmakmü mkü ndü r.Kiwi.jsiletasarlananbiroyun,CocoonJSile
platformbağ ımsızolaraktü mplatformlaraçıkarılabilir.(Kashyap,2015)
Motorunenbelirginö zelliğ igeliştiricilerinsü rekligü ncellemelerleaktifolarak
destekvermelerivetest-hataayıklamakonularındakibaşarısıdır.AyrıcaPhaser,
enchant.js gibi bir çok oyun motorunda olduğ u gibi eklenti (plugin) sistemini
desteklemektedir. Kiwi.js'nin çok aktif bir geliştirici topluluğ u (community)
olduğ uiçinbirçokeklentigeliştirilmiştir.
Achievement eklentisi sayesinde oyun içi kazanımları yö netebilme, Chipmunk
Phsysicssayesindeoyunlarafizikö ğ eleriekleme,DamagePipelineileRPG,RTS
oyunlardasıklıklakarşılaşılankaraktersağ lıkvegü çparametrelerisistemi,FGL
eklentisi ile HTML5 oyunlar için reklam, promosyon ve oyun içi satış
parametreleri, Fullscreen eklentisi ile oyunları tam ekranda gö rü ntü leme,
Gamepad sayesinde oyun konsolu butonları oluşturma, Inventory eklentisi ile
oyun içi envanter yö netimi, Leap Controller eklentisi ile Leap Motion desteğ i,
kayıtyö netimi,shader,WebGLpartikü lsistemigibibirçokeklentiyiiçerisinde
barındırmaktadır.
Bu eklentiler içerisinde AI Tree eklentisi ise Kiwi.js oyunlarına davranış ağ acı
(behavior tree) eklemeyi ve bu davranış ağ açlarını yö netmeyi sağ lamaktadır.
Çalışma kapsamında geliştirilen DignityAI kü tü phanesinin DignityMission
sınıfının fonksiyonlarına benzerlik gö steren bir işlevselliğ i vardır. Ancak
DignityAI çok daha fazla sistemi içerisinde barındırdığ ı için daha komple bir
kü tü phanedir.
3.6.8enchant.js
enchant.js, oldukça sade bir Javascript kü tü phanesidir. Oyun ve uygulama
geliştirmekiçinkullanılmaktadır.I„lkolarak2011yılında,Tokyo'dakiAkihabara
AraştırmaMerkezi'ndekiaraştırmacılartarafındangeliştirilmiştirveMITlisansı
ileaçıkkaynakkodluolarakpaylaşılmaktadır.Oyungeliştirmeninyanındasade
42
ve basit kullanılabilir bir framework olduğ u için uygulama geliştirmede de
sıklıklakullanılmaktadır.
enchant.js platform bağ ımsız olarak PC, Mac, iOS ve Android tarayıcılarda
çalışabilmektedir.Tü mö ğ eleritamamennesneyö nelimliolaraktasarlanmıştır.
AyrıcaWindows8desteğ idebulunmaktadır.Olaytabanlı(event-driven)olarak
çalışmaktadır. Canvas, DOM ve WebGL olmak ü zere tü m çizim metodlarını
destekler. Ayrıca en gü zel ö zelliklerinden birisi de enchant.js ile birlikte gelen
tü mgö rselvedö kü manlarticariolarakü cretsizkullanılabilmektedir.Phaserve
diğ erbirçokoyunmotorundaolduğ ugibieklenti(plugin)eklenebilmektedir.3D
ö zelliğ i bu eklentiler sayesinde eklenmiştir. Ayrıca ü nlü Japon oyun sitesi
9leap.net'edirekoyungö ndermegibiekö zellikleridebulunmaktadır.(McInnis
vd.,2013)
DahabirçokHTML5oyunmotoruhergü ngeliştirilmeyedevametmektevebu
listeye eklenmektedir. Babylon.js, GameMaker, Turbulenz, Cocos2d-X, Isogenic
Engine,Panda.js,Crafty,voxel.js,MelonJS,stage.jsgibidahabirçokoyunmotoru
HTML5ileoyungeliştirmekisteyenleriçintasarlanmıştır.Hergeçengü nyenibir
motor ve yeni bir başlangıç olmasının nedeni ise HTML5'in ve Javascript'in
esnekliğ i ve buna bağ lı olarak getirdiğ i kolaylıktır. Bunda kuşkusuz WebGL ve
HTML5'in de payı çok bü yü ktü r. Eskiden çok bü yü k boyutlu oyun motoru
dosyalarını, bir yığ ın yardımcı programı (DirectX, Windows SDK vb.) kurup
bilgisayarı oyun geliştirmeye hazır hale getirmek için uzun zaman harcanırdı.
AncakHTML5'inbudevrimiylebirliktetarayıcıü zerindenoyungeliştirmevetek
bir tıklamayla oyunu yayına hazır hale getirme gibi bir çok yenilik oyun
dü nyasınakatılmıştır.
BuoyunmotorlarınaveAPI'larabakıldığ ındagrafik,ses,video,fizikgibibirsü rü ö ğ enin dü şü nü lmü ş olduğ u ve halihazırda HTML5 tabanlı oyunlarda
kullanılabildiğ igö rü lmektedir.Ancak,yapayzekaileilgiliherhangibirkü tü phane
barındıran oyun motoru ya da bö yle bir dış API olmadığ ı gö rü lmektedir.
DignityAI tam da bu noktada eksik olan bu boşluğ u tamamlamak için
geliştirilmiştir.
43
4.ARAŞTIRMABULGULARIVETARTIŞMA
4.1.DIGNITYAIYAPAYZEKAKÜTÜPHANESİ
4.1.1.DignityAIGenelSınıfYapısı
DignityAIgenelsınıfyapısınabakıldığ ındaenü stteDignityObjectyeralmaktadır.
Tü mdiğ ersınıflartemeldebusınıftantü retilmiştir.Şekil4.1’deDignityAIGenel
Sınıf Tasarımı’nın yapısı bulunmaktadır. Ayrıca EK A’da detaylı sınıf diagramı
verilmiştir.
Şekil4.1:DignityAIGenelSınıfTasarımı
Yukarıdaki sınıf yapısında da gö rü ldü ğ ü gibi DignityObject tü m sınıfların
ü zerinde bir temel sınıf olarak yer almaktadır. Bu temel sınıflara gö z atılacak
olursa, genel anlamda tü m sınıfların nasıl bir işlevsellikleri olduğ u ve ne için
kullanıldıklarıdagö rü lmü şolur.
DignityPathsınıfısayesindeyolbulma(path-finding)ö zellikleriherbirnesneye
eklenebilmektedir. Bu sayede nesnelerin rastgele ya da belli bir noktaya yer
değ iştirebilmeleri için gerekli yol bulma algoritmaları çalıştırılmış olacaktır.
DignityPathtekbaşınabiranlamifadeetmesebileDignityAIBaseiçerisindecan
alıcıbirroloynayaraknesnelerinhareketetmelerineyardımcıolmaktadır.
DignityAction sınıfı, tü m nesnelerde bir sonuç stratejisi için kullanılmaktadır.
Yapayzekalınesnelerintü maksiyonlarınıyö netebildiklerisınıftır.Buö zellliğ iyle,
gö revlerinuygulayıcısıolarakgö rü lebilir.
44
DignityMissionsınıfı,aslındatü myapayzekasistemlerindegeneldekurgulanan
birgö revmantığ ınınolduğ unuö nesü rer.Bugö revmantığ ıiçerisindetü myapay
zekalı karakterlerin veya nesnelerin bir takım gö revleri bulunmaktadır. Bu
gö revlerışığ ındabazıdavranışlarıelealırlarvebusayedegö revlerinaksiyonlara
dö nü ştü rü lmesini ve işlem sırasına alınarak yerine getirilmesini sağ larlar. Bu
basitbirrobotdü şmanileö rneklendirebilir.O‚ rneğ in,birrobotdü şmaniçinilk
gö revrastgeleetraftadolaşmakyadabirmerkezikorumakolabilir.Bugö revini
asenkronolarakyerinegetirirkenbirdiğ ergö revolarakdadü şmanlarımenzile
girdiğ indeonlarakarşıgerekliaksiyonfonksiyonlarınıyerinegetirmesigerekir.
DignityAIBasesınıfı,hernekadarDignityObjectsınıfındantü retilmişbirsınıf
olsa da kendi içerisinde yapay zekalı sınıfların ana sınıfı olarak yer alır.
DignityAIBase içerisinde yapay zekalı nesnenin izleyeceğ i yollar, sahip olduğ u
silahlar,gö revler,temelalgılamaoperasyonlarıiletoplananvealınannesnelerin
barındırılmasıgibibirdoluö zellikiçerir.Yapayzekalıdiğ ersınıfvenesnelerin
ortak ö zellikleri bu sınıf içerisinde yer almaktadır. Bu temel sınıf baz alınarak
bazısınıflarDignityAIiçerisindeö ncedentanımlanmıştır.Ancakbusınıflarında
ö tesindeistenildiğ igibifarklısınıflarö zelleştirilerektü retilebilir.
DignityStructure sınıfı sayesinde RTS tü rü ndeki oyunlarda ve bazı oyun
tü rlerindeyapılarü zerineyapayzekaeklemeihtiyacıoluşmaktadır.Buihtiyaçile
yapılarbellimiktarlardadepolamayapabilecekvebudepoladıklarımateryallari
istenilenzamanlardaçıktıolarakü retimoluşturabileceklerdir.Ayrıcayapıların
birdeyıkımparametreleribulunmaktadır.Bununlabirliktediğ erDignityAIBase
tabanlınesnelergibialgılamavegö revyö netimigibiö ğ eleriiçerebilirler.
DignityVehiclesınıfı,yapayzekalıaraçlarınoyunlariçerisineeklenebilmesive
temel yapay zeka fonksiyonlarının yanı sıra araçlar için ö zelleşmiş bir takım
farklıkapasite,yakıtseviyesi,torkgibibirdizifarklıö zelliğ iiçerir.
DignityHuman sınıfı, yapay zekalı insan karakterleri oluşturmak için
kullanılmalıdır.Busınıfiçerisindedü şmankorkuseviyesi,saklanacakyerbulma
ö zelliğ ivekarakterindikkatealacağ ıengellerlistelenir.Busayedezatenmevcut
45
tü m DignityAIBase sınıfı ö zelliklerini kullanabildiğ i için sadece insani
karakterlereö zgü ö zelliklerlistelenmişolacaktır.
DignityAnimal sınıfı, yapay zekalı hayvanlar oluşturmak için kullanılır. Bu
hayvanlar sayesinde hayvanların tü rleri, insanlara saldırma olasılıkları, kendi
tü rü nesaldırmaolasılıklarıvetoplulukhalindemiyoksayalnızmıyaşadıkları
gibitemelhayvanfarklılıklarıyeralmaktadır.
Bu sayede genel olarak tü m yapay zekalı nesneler için geniş çaplı bir sistem
dü şü nü lmü ş ve tü m bu nesneler aynı model içerisinde kurgulanarak sistem
içerisine dahil edilebilecek seviyeye getirilebilmişlerdir. Burada ö zel olarak
kurgulandığ ı halde yeniden farklı bir sınıfa ihtiyaç duyulması halinde
DignityAIBasesınıfındanmevcutnesnetü retilerekfarklılıklarıileyenibirsınıf
oluşturulabilir.
DignityAI tasarlanırken tamamen nesne yö nelimli bir altyapı oluşturulmuştur.
Bunun için Javascript’in nesne yö nelimli yapısı ve tü m nesnelerin tü retildiğ i
temelsınıfolanObjectsınıfıkullanılmıştır.DignityAI'ıntü msınıfyapısıbunun
ü zerine inşa edilmiştir. Bu sayede istendiğ inde farklı oyun motorlarına da
entegreedilmesikolayolacaktır.O‚ rnekkullanımıiseaşağ ıdakigibidir.
varPerson=function(firstName){
this.firstName=firstName;
};
Person.prototype.develop=function(){
console.log("Iamdeveloping!");
};
Person.prototype.sayHello=function(){
console.log("Hello,I'm"+this.firstName);
};
Yukarıda Person isimli basit bir sınıf oluşturulmuş ve ilk metot kullanımı ile
birlikte genel nesne yö nelimli dillerden bilinen kullanımıyla Yapıcı Metot
(ConstructorMetod)tanımlanmıştır.AyrıcawalkvesayHelloisimlimetotlar
46
tanımlanarakkonsolabasitbazıifadeleryazdırılmıştır.BuPersonsınıfındanyeni
birnesnetü retilmekistendiğ indeiseaşağ ıdakigibibirkullanımsö zkonusudur.
functionStudent(firstName,subject){
Person.call(this,firstName);
this.subject=subject;
}
Student.prototype=Object.create(Person.prototype);
Student.prototype.constructor=Student;
Student.prototype.sayHello=function(){
console.log("Hello,I'm"+this.firstName+".I'mdeveloping"+this.subject+".");
};
Student.prototype.sayGoodBye=function(){
console.log("Goodbye!");
};
YukarıdabirStudentsınıfıoluşturulmuşveStudentsınıfınınyapıcı(constructor)
metodu tanımlanarak, metot içerisinde Person sınıfının yapıcı metodu .call()
kullanılarak çağ ırılmıştır. Ardından, Student sınıfına ö zgü ö zellik (property)
tanımlanmıştır. Sınıfın prototype ö zelliğ ine ise Object.create() metodu ile
tü retileceğ i Person sınıfının prototype ö zelliğ i verilmiştir. Bu kullanımdan
sonraStudentsınıfıPersonsınıfındantü retilmişolur.Buradazorunluolanbir
durum da bu şekilde bir kalıtım yapıldıktan sonra tü retilen sınıfın (Student)
yapıcı metodu (constructor) mutlaka constructor isimli ö zellik (property) ile
tanımlanmalıdır.Kalıtımilebirsınıftandiğ erbirsınıftü retildiktensonraStudent
isimli sınıfa ö zel sayHello metodu tekrar tanımlanarak yeni eklenen subject
ö zelliğ i (property) metot içerisine eklenmiştir. Daha sonra Person sınıfında
olmayan sayGoodBye isimli yeni bir metot tanımlanmıştır. Nesne yö nelimli
programlamakurallarınagö reStudentsınıfınıntanımlanmamışolsabilePerson
47
sınıfından gelen bir walk metodu da bulunmaktadır. Bu tanımlamalar
kullanıldığ ındaisegerekliçıktılaraşağ ıdakigibidir.
varstudent1=newStudent("BerkanUSLU","DignityAI");
student1.sayHello();//"Hello,I'mBerkanUSLU.I'mdevelopingDignityAI."
student1.develop();//"Iamdeveloping!"
student1.sayGoodBye();//"Goodbye!"
Yukarıda da gö rü ldü ğ ü gibi yeni bir Student nesnesi yapıcı metoduyla
(constructor) oluşturuluyor. Burada firstName ö zelliğ ine (property) Berkan,
subjectö zelliğ ine(property)deJavascriptOOPdeğ erleriatanmıştır.Bunagö re
PersonsınıfındaolanveStudentiçerisindehiçtanımlanmayanwalkmetoduda
kullanılabilmektedir.
4.1.2.DignityAIKullananÖrnekBirModelinÇalışmaMantığı
DignityAIkullarakbirmodelgeliştirmedenö ncebusisteminnasılişlediğ ineve
nasılçalıştığ ınabirgö zatmakgerekmektedir.Ziraçalışanmodelokadaresnek
ve tutarlı olmalıdır ki yapay zeka ile alakasız ve daha ö nceden yapay zekalı
olmadığ ına inandığ ımız herhangi bir nesneye bile DignityAI ile yapay zeka
ö zelliğ ieklenebilmelidir.
Bununiçinengü zelö rnekolarakelektriksüpürgesimodelalınmıştır.Elektrik
sü pü rgesi hali hazırda yapay zekası olan bir model değ ildir. Ancak DignityAI
modelindebiryapayzekaileprogramlandığ ındamevcutelektriksü pü rgesizeki
durumageçecektir.
O‚ ncelikle dü şman tanımlaması yapılması gerekmektedir. DignityAIBase
içerisinde dü şman ve dost tanımlamaları her nesne için yapılmalıdır. Elektrik
sü pü rgesi modelinde dü şman “etraftaki tozlar” olarak tanımlanabilir.
DignityAIBaseiçerisindebulunanalgılamaaralığ ıvealgılamatetiklemezamanı
parametreleri bulunmaktadır. Algılama aralığ ı olarak 100 cm ve algılama
tetiklemezamanıolarak10snverilmiştir.
48
Bunoktadansonraö rnekmodelegö revtanımlamasıyapılmasıgerekmektedir.
Buradaasılunsurteorikolarakyapayzekalıbirelektriksü pü rgesininnegibibir
gö revi olacağ ının iyi belirlenmesidir. O‚ ncelikli olarak odayı rastgele olarak
dolaşma gö revi verilmelidir. Elektrik sü pü rgesi odayı belirli yol bulma
algoritmasıilebirliktedolaşmalıvebugö revdeherhangibirsilahkullanmadan
sü rekliolarakasenkronbirşekildebugö reviniyerinegetirmelidir.Şuaşamada
elektriksü pü rgesinerastgeledolaşmagö reviverilipherhangibirşekildetozları
algılamasıveyaonlarlailgilibiraksiyongö reviverilmemiştir.
Bununiçindeelektriksü pü rgesinebiralgılamagö revigirilmelidir.Bugö revde
iseodaiçerisindedolaşması(move)aksiyonununyanısıramevcutsilahlarından
hangisinikullanacağ ıbelirtilir.Bununlabirlikteyinealgılamagö revideasenkron
çalışmasıgerekenbirgö revdir.“Vakumluhortum”silahınıkullanmasıistendikten
sonraartıkelektriksü pü rgesiniodanıniçerisinderastgelehareketettiriponun
tozları algılamasını ve algıladığ ında vakumlu hortum silahını kullanması
belirtilmektedir.
Vakumlu hortum silahı içerisinde de ü ç tip temel aksiyondan sadece toplama
aksiyonubulunmaktadır.Diğ eraksiyonlaryoketmeveoluşturmaaksiyonlarıdır.
Aynızamandavakumluhortumsilahınındaherhangibirmermiyeihtiyacıyoktur.
Yukarıdaki gibi herhangi bir şekilde yapay zeka ö zelliklerine sahip olmayan
durağ an bir elektrik sü pü rgesine yapay zeka ö zellikleri eklenmiştir. Bu sayede
elektrik sü pü rgesi oda içerisinde dolaşarak, 100 cm de bir 10 saniyelik
periyotlarlaodadakitozlarıalgılayıponlarıvakumluhortumsilahıiletoplayacak
ve bu işlemi sü pü rgenin kapasitesi dolana kadar ya da hiç bir toz parçası
kalmayanakadartekrarettirerekodayıtemizlemişolacaktır.
Bunun gibi yapay zeka içermeyen durağ an tü m nesneler, DignityAI modeli
içerisindekurgulanarakyapayzekalıhalegetirilebilirler.
49
4.1.3.DignityPathSınıfıileYönBulma
DignityPathsınıfıtemelyö nbulmafonksiyonlarınıelealanbirsınıftır.O‚ zellikle
tasarlanırken hem iki boyutlu hem de ü ç boyutlu oyunlar için yö n bulma
fonksiyonlarınıkapsayacakşekildetasarlanmıştır.
Her bir DignityAIBase tipinden tü retilmiş nesnede bir paths isminde
DignityPath dizisi bulunur. Bu, yapay zekalı karakterin gö revleri ile bağ lantılı
olarak izleyeceğ i yolları belirler. Gö revler içerisinde birden fazla yol
tanımlanabilir.DignityPathsınıfınınDignityAIBaseiçerisindetanımlanmasıise,
DignityMission ü zerinde herhangi bir gö rev ü zerinden ö nceki yollara
ulaşılabilmesinisağ lamaktadır.Busayedeherhangibirgö rev,tü myollistesine
ulaşarakdahaesnekbiryapıyadö nü şecektir.
Yapı bu şekilde esnek tasarlanarak geliştirilmiştir. DignityPath sınıfı içerisinde
verilen yol için başlangıç ve bitiş konumları ile birlikte o başlangıç ve bitiş
konumlarınailerlerkengidilecekolandiğ eraltyollardatanımlanabilmektedir.
Ayrıcaverilenyolunsondanbaşatekraredipetmeyeceğ iniverastgelebirkonum
ü zerindeilerleyipilerlemeyeceğ iyineaynısınıfü zerindenbelirlenebilmektedir.
varDignityPath=function(){
DignityObject.call(this);
this.from=[];
this.subPaths=[];
this.to=[];
this.isPong=false;
this.randomable=false;
this.randomRange=0;
this.map=[[]];
this.movementPath=[];
this.movementPathCurrent=0;
50
};
DignityPath.prototype=Object.create(DignityObject.prototype);
DignityPath.prototype.constructor=DignityPath;
DignityPath.prototype.findPath=function()
{
/*ilerideaçıklanacaktır*/
};
DignityPathsınıfınabakıldığ ındayukarıdakigibibirtanımlamaiçermektedir.Bu
sınıfiletanımlananifadeleraslındaDignityAIBasesınıfıvebusınıftantü retilmiş
sınıflar için bir move() metodu tarafından kullanılmaktadır. Bu metot yapay
zekalı nesnenin ü zerindeki yolları okuyarak gö rev tanımlamasında belirtilen
gö revdekiyoluizlemekiçinnesneninhareketegeçmesinisağ lar.Buradatemelde
bitiş noktasının belirlenmesi ve doldurulması zorunludur ve bitiş noktasına
doğ ru nesne hareket ettirilir. Ancak, nesnenin gideceğ i yolu hesaplaması ve
yoldakiengelleregö rekendinebirrotaçizmesiişlemindebazıtemelalgoritmalar
kullanılmaktadır.Bualgoritmalariçerisinde,A*,IDA*,MA*,Breadth-First-Search,
Best-First-Search, Dijkstra, Jump Point Search gibi daha bir çok farklı arama
algoritmalarıbulunmaktadır.DignityAI,buaramaalgoritmalarıiçerisindeençok
kullanılan ve en yaygın olan A* algoritması kullanmaktadır. Ancak diğ er tü m
algoritmalar ya da bu tü m algoritmaları içeren bir HTML5 kü tü phanesi olan
Pathfinding.js gibi bir kü tü phane de kolaylıkla DignityAI içerisine entegre
edilebilir.
A*algoritması,klasikolarakgeliştirildiktensonrabirçokgeliştirmeyeuğ ramış
veIterativeDeepeningA*,LearningReal-TimeA*,Time-BoundedA*,kNearest
NeigborsLRTA*gibibirçokformubulunanenpopü leralgoritmalardanbirisidir.
(Bulitkovd.,2011)
A*algoritmasıtemelolarakbaşlangıçsnoktasıvebitişgnoktasıarasındakien
dü şü kmaliyetliyoluhesaplar.Maliyethesaplamaişlemindef(n)=g(s,n)+h(n,g)
51
formü lü kullanılır.Buradag(s,n)değ erisnoktasındanherhangibirnnoktasına
bulunmuşolanenkısayolmesafesiniifadeeder.h(n,g)değ eriisebulunanbun
noktasından g noktasına kadar gidilecek mesafenin sezgisel tahminidir.
Algoritma arama işlemini izlemek için iki liste kullanır. Açık liste, henü z
genişletilmemişnoktaları,kapalılisteisegenişletilmişnoktalarıtutar.Algoritma
genişletilmemişnoktalardanendü şü kmaliyetliolanınıseçerveonugenişleterek
altnoktalarınaerişirvebuişlemitekrarlayarakdevamettirir.Bö ylelikleheralt
noktadan hedef noktaya giden en kısa noktayı hesaplamaya çalışır. Bir alt
noktanınaçıklisteyegirebilmesiiçinhalihazırdakapalılistedeolmamasıveaçık
listede daha dü şü k maliyetli bir nokta olmaması gerekir. Nokta daha ö nceden
genişletilmişse kapalı listeye taşınır. Kapalı listenin rolü hem yeniden
genişlemeleri ö nlemek hem de g noktası bulunduğ unda çö zü m yolunu tekrar
oluşturabilmektir.Buişlemgnoktasıaçıklistedensilininceyekadardevameder
vekapalılistedençö zü myolutekraroluşturulur.(Bulitkovd.,2011)
Busezgisel(heuristic)yö ntemleherbirnoktaarasındakienkısamesafeninnasıl
bulunacağ ınaisebazıhesaplamametotlarıilekararverilir.Bunlardanbaşlıcaları
Manhattan, Diagonal ve Euclidean gibi uzaklık hesaplama yö ntemleridir. Bu
yö ntemlerlehesaplamaenbasithaliyleaşağ ıdakigibiyapılabilir.
functionManhattanDistance(Point,Goal)
{
returnabs(Point.x-Goal.x)+abs(Point.y-Goal.y);
}
functionDiagonalDistance(Point,Goal)
{
returnmax(abs(Point.x-Goal.x),abs(Point.y-Goal.y));
}
functionEuclideanDistance(Point,Goal)
{
returnsqrt(pow(Point.x-Goal.x,2)+pow(Point.y-Goal.y,2));
52
}
DignityPath sınıfı tanımlamasında içeriğ i belirtilmeyen kısımda ise asıl işlemi
gerçekleştiren ve harita verisi ile verilen koordinatlar arasındaki en kısa yolu
hesaplayanbirfindPathmetodubulunmaktadır.Bumetodaşağ ıdakigibidir.
DignityPath.prototype.findPath=function()
{
varworld=this.map;
varworldWidth=world[0].length;
varworldHeight=world.length;
varworldSize=
worldWidth*worldHeight;
varpathStart=this.from;
varpathEnd=this.to;
if(this.randomable){
var
randomX
=
Math.floor((Math.random()
*(worldWidth-2-
this.randomRange))+1);
var
randomY
=
Math.floor((Math.random()
*
(worldHeight-2-
this.randomRange))+1);
varusageInfo=this.map[randomX][randomY];
while(usageInfo===1){
randomX=Math.floor((Math.random()*(worldWidth-2))+1);
randomY=Math.floor((Math.random()*(worldHeight-2))+1);
usageInfo=this.map[randomX][randomY];
}
pathEnd=[randomX,randomY];
}
53
var
abs=Math.abs;
var
max=Math.max;
var
pow=Math.pow;
var
sqrt=Math.sqrt;
varmaxWalkableTileNum=0;
//
vardistanceFunction=ManhattanDistance;
//
varfindNeighbours=function(){};//empty
//
alternateheuristics,dependingonyourgame:
//
diagonalsallowedbutnosqeezingthroughcracks:
vardistanceFunction=DiagonalDistance;
varfindNeighbours=DiagonalNeighbours;
//
diagonalsandsqueezingthroughcracksallowed:
//
vardistanceFunction=DiagonalDistance;
//
varfindNeighbours=DiagonalNeighboursFree;
//
//
euclideanbutnosqueezingthroughcracks:
//
vardistanceFunction=EuclideanDistance;
//
varfindNeighbours=DiagonalNeighbours;
//
//
euclideanandsqueezingthroughcracksallowed:
//
vardistanceFunction=EuclideanDistance;
//
varfindNeighbours=DiagonalNeighboursFree;
functionManhattanDistance(Point,Goal)
{
}
returnabs(Point.x-Goal.x)+abs(Point.y-Goal.y);
54
functionDiagonalDistance(Point,Goal)
{
}
returnmax(abs(Point.x-Goal.x),abs(Point.y-Goal.y));
functionEuclideanDistance(Point,Goal)
{
}
returnsqrt(pow(Point.x-Goal.x,2)+pow(Point.y-Goal.y,2));
functionNeighbours(x,y)
{
var
S=y+1,
E=x+1,
W=x-1,
myN=N>-1&&canWalkHere(x,N),
myS=S<worldHeight&&canWalkHere(x,S),
myE=E<worldWidth&&canWalkHere(E,y),
myW=W>-1&&canWalkHere(W,y),
result=[];
if(myN)
result.push({x:x,y:N});
if(myE)
result.push({x:E,y:y});
if(myS)
result.push({x:x,y:S});
if(myW)
result.push({x:W,y:y});
findNeighbours(myN,myS,myE,myW,N,S,E,W,result);
returnresult;
}
N=y-1,
55
functionDiagonalNeighbours(myN,myS,myE,myW,N,S,E,W,result)
{
if(myN)
{
if(myE&&canWalkHere(E,N))
result.push({x:E,y:N});
if(myW&&canWalkHere(W,N))
result.push({x:W,y:N});
}
if(myS)
{
if(myE&&canWalkHere(E,S))
result.push({x:E,y:S});
if(myW&&canWalkHere(W,S))
result.push({x:W,y:S});
}
}
functionDiagonalNeighboursFree(myN,myS,myE,myW,N,S,E,W,result)
{
myN=N>-1;
myS=S<worldHeight;
myE=E<worldWidth;
myW=W>-1;
if(myE)
{
if(myN&&canWalkHere(E,N))
result.push({x:E,y:N});
if(myS&&canWalkHere(E,S))
result.push({x:E,y:S});
}
if(myW)
56
{
if(myN&&canWalkHere(W,N))
result.push({x:W,y:N});
if(myS&&canWalkHere(W,S))
result.push({x:W,y:S});
}
}
functioncanWalkHere(x,y)
{
return((world[x]!=null)&&
(world[x][y]!=null)&&
(world[x][y]<=maxWalkableTileNum));
};
functionNode(Parent,Point)
{
varnewNode={
Parent:Parent,
value:Point.x+(Point.y*worldWidth),
x:Point.x,
y:Point.y,
f:0,
g:0
};
returnnewNode;
}
functioncalculatePath()
{
var
varmypathEnd=Node(null,{x:pathEnd[0],y:pathEnd[1]});
mypathStart=Node(null,{x:pathStart[0],y:pathStart[1]});
57
varAStar=newArray(worldSize);
varOpen=[mypathStart];
varClosed=[];
varresult=[];
varmyNeighbours;
varmyNode;
varmyPath;
varlength,max,min,i,j;
while(length=Open.length)
{
max=worldSize;
min=-1;
for(i=0;i<length;i++)
{
if(Open[i].f<max)
{
max=Open[i].f;
min=i;
}
}
myNode=Open.splice(min,1)[0];
if(myNode.value===mypathEnd.value)
{
myPath=Closed[Closed.push(myNode)-1];
do
{
}
while(myPath=myPath.Parent);
AStar=Closed=Open=[];
result.reverse();
}
else
result.push([myPath.x,myPath.y]);
58
{
myNeighbours=Neighbours(myNode.x,myNode.y);
for(i=0,j=myNeighbours.length;i<j;i++)
{
myPath=Node(myNode,myNeighbours[i]);
if(!AStar[myPath.value])
{
myPath.g
=
myNode.g
+
=
myPath.g
+
distanceFunction(myNeighbours[i],myNode);
myPath.f
distanceFunction(myNeighbours[i],mypathEnd);
Open.push(myPath);
AStar[myPath.value]=true;
}
}
Closed.push(myNode);
}
}
returnresult;
}
this.movementPath=calculatePath();
this.movementPathCurrent=0;
};
Yukarıdaki metot içerisindeki işlemlere bakıldığ ında ö ncelikli olarak abs, pow,
maxvesqrtgibimatematikformü llerinindahahızlıhesaplamaiçintanımlandığ ı
gö rü lmektedir. Daha sonra arama yapılacak haritanın ö zellikleri (genişlik,
yü kseklik, bü yü klü k vb.) hesaplanmaktadır. Uzaklık hesaplamalarında
kullanılmakü zereManhattanmetoduseçilmiştir.Manhattanü zerindeherhangi
birkomşulukhesaplamasıyapılmadığ ıiçinilgilideğ işkenboşolarakatanmıştır.
Buraya diğ er metotları tanımlamak ve ilgili komşuluk hesaplama
formü lizasyonlarınıdayapmakmü mkü ndü r.
59
Nodeileisimlendirilenfonksiyoniseyenibirdü ğ ü moluşturmaktavebudü ğ ü m
ü zerinde işlemleri gerçekleştirmekte kullanılmaktadır. Bu fonksiyonun temel
gö revi yeni bir dü ğ ü m oluşturma, ana ve alt dü ğ ü mleri atama, gerekli değ er
formü lizasyonunuhesaplamavedeğ eratama,x,ykoordinatlarınıbelirlemeve
hesaplamalardakullanılanfvegfonksiyonlarınındeğ erlerinibelirlemektir.
En son olarak calculatePath() isimli fonksiyon sayesinde az ö nce anlatılan
hesaplamalar ve açık/kapalı liste işlemleri yapılarak en kısa yol bulunup
DignityPathsınıfınınmovementPathö zelliğ ineeşitlenir.AyrıcacalculatePath()
metodunun ilk başında randomable ö zelliğ i true olarak verildiğ inde harita
ü zerindenrastgelebirnoktaseçilerekilerlemesidurumudatanımlanmıştır.
4.1.4.DignityActionSınıfıveAksiyonYönetimi
DignityAction sınıfı aslında DignityAI kü tü phanesinin işlem ayağ ıdır. Tü m
aksiyonlarDignityActioniçerisindetanımlanır.DignityActionsınıfıiçerisindeşu
ana fonksiyonlar bulunur: move(), sense(), destroy(), create(),upgrade() ve
custom()fonksiyonlarıdır.
•
move() : Bu fonksiyon sayesinde DignityAIBase içerisinde
tanımlanan pathList listesinin elemanının DignityPath sınıfının
nesnesindetanımlıolanyoluizlemesisağ lanır.Buişlemiçinenkısa
yolu bularak bir hareket oluşturulur. Burada temel durum
DignityAction sınıfında tanımlı moveObj ö zelliğ ine verilen hareket
ettirilecek olan nesnenin DignityAIBase içerisinde tanımlı move
metodunutetiklemesinisağ lamaktır.
•
sense() : Bu fonksiyon sayesinde DignityAIBase içerisinde tanımlı
dü şman(enemyList)vedost(friendList)listelerinegö realgılamave
bu algılamalara gö re yapılması gereken ana işlemler gerçekleştirilir.
BumetotdasenseObjö zelliğ ineverilenalgılamayapılacaknesnenin
DignityAIBase içerisinde tanımlı sense metodunu tetiklemesini
sağ lamaktadır.
60
•
destroy():BufonksiyonsayesindedestroyObjö zelliğ iiletanımlanan
DignityAIBase sınıfından ya da ondan tü retilmiş başka bir sınıftan
hedef olarak gö sterilen nesneye zarar verdirilir. Bu zarar
DignityAIBase sınıfından tü retilmiş nesneler için life ö zelliğ ini
destroyLeveldeğ erikadardü şü rü r.
•
create() : Bu fonksiyon sayesinde createObj ö zelliğ i ile tanımlanan
herhangi bir nesne sahnede oluşturulur. Ayrıca yine DignityAction
içerisinde tanımlanan createObjPos isimli ö zellik ile nesnenin
oluşturulacağ ıpozisyonverilmişolur.
•
upgrade()
: Bu fonksiyon upgradeObj ö zelliğ i ile tanımlanan
nesnenin tü m değ erlerini yü kseltmek için kullanılır. Herhangi bir
şekilde seviye yü kseltme, can artırma gibi işlemler bu fonksiyon
sayesinde yapılır. Bunun için upgradeObjPropName ö zelliğ inde
gü ncellenecek
olan
değ erin
ismi
String
olarak
verilir.
upgradeObjIncVal ö zelliğ i ile nesnenin o değ erinin artırma değ eri
verilir. Bu sayede o değ erin ü zerine verilen artırma değ eri eklenir.
Buradanegatifbirdeğ erverilirsedeoparametredeğ eridü şü rü lmü ş
olur. Ancak herhangi bir şekilde değ işkene değ er artırma/azaltma
şeklinde değ il de direk değ er ataması yapılmak istendiğ inde
upgradeObjIncVal ö zelliğ i 0 (sıfır) verilerek upgradeObjNewVal
ö zelliğ ine değ işkenin yeni değ eri verilir. Bu sayede de direk bir
nesneninbirdeğ erinedeğ eratamasıyapılabilir.
•
custom()
: Bu fonksiyon temelde DignityAction sınıfı
içerisinde tanımlı olmayan tü m nesnelerin istenilen fonksiyonlarını
aksiyonolarakçalıştırmayayarar.Yaniö ntanımlıolarakverilenmove,
sense, destroy, create ve upgrade aksiyonlarının dışında bir aksiyon
çalıştırmakistendiğ indecustom()fonksiyonukullanılır.Bufonksiyon
customActionObj ile verilen nesnenin customActionObjName ile
verilenmetodunuaksiyonolarakçağ ırır.
Yukarıdadagörüldüğügibi,DignityActionsınıfıanafonksiyonlarıyaaslındaçok
geniş bir yazılım mimarisini içerisinde barındırmaktadır. Bir nesneyi
oluşturmak, yok etmek ve nesnenin her parametresine erişerek onu
61
güncelleyebilmek aslında tüm bu mantığın genele uyarlanması anlamına
gelmektedir. Bu noktada her yapay zekalı nesne için farklı bir DignityAction
tanımlamasıözelleştirilebilir.
Örneğin bir RTS oyunda, altın toplayan bir karakterin yapay zekası
programlanmak istendiğinde tanımlanan bir aksiyon modeli yardımıyla
karakterin altınları alıp altın deposuna getirmesi gibi basit bir görev tanımı
yapılarak,
DignityAIBase
üzerindeki
collectedObjects
parametresinin
güncellenmesi sağlanabilir. Bunun için basit dört görev tanımlaması yapılır.
BunlardanilkikarakterinDignityPathsınıfıilealtınmadeninegitmesini,ikincisi
tanımlanan aksiyon modeli ile upgrade() metodu içerisinde gerekli
collectedObjects parametresini güncellemesi, üçüncüsü madenden depoya
dönmesivesonolarakdadeponungereklimetodunuçağıraraktopladığıaltınları
depoyabırakmasışeklindeolacaktır.Busayedebasitbirkarakterinhareketleri,
görevtanımlamasıveişigerçekleştirmekiçingerekliaksiyonyapısıkurgulanmış
olur.Bunutümyapayzekalıöğeleriçingerçekleştirmekmümkündür.
Dahaiyikurgulanabilmesiiçinçokbilindikbirörnekleaçıklamakgerekirse,bir
FPSoyundakarakterinbellibiralanıkoruyarakalgıladığıdüşmanlarıöldürmesi
durumuelealındığında,karakteröncelikleDignityPathsınıfıyardımıylabellibir
alaniçerisindedevriyegörevinegönderilir.Dahasonradüşmanalgılamaalanı
belirlenirvedüşmanlistesitanımlanır.SonolarakisebirDignityActionnesnesi
tanımlanarak destroy() metodu ile algılanan tüm düşmanları yok etmesi
sağlanır.
DignityActionsınıfıtanımlamasıaşağıdakigibidir.
varDignityAction=function(){
DignityObject.call(this);
this.createObj=null;
this.createObjPos=null;
62
this.destroyObj=newDignityAIBase;
this.destroyLevel=0;
this.upgradeObj=null;
this.upgradeObjPropName="";
this.upgradeObjIncVal=0;
this.upgradeObjNewVal=0;
this.moveObj=newDignityAIBase;
this.moveFollowObj=null;
this.senseObj=newDignityAIBase;
this.senseRadius=0;
this.senseTriggerTime=0;
this.customActionObj=null;
this.customActionName="";
this.ammo=0;
this.fireSpeed=0;
this.maxTurnAngle=0;
};
DignityAction.prototype=Object.create(DignityObject.prototype);
DignityAction.prototype.constructor=DignityAction;
DignityAction.prototype.create=function(){
var_createdObject=this.createObj.clone();
_createdObject.setPosition(this.createObjPos);
};
DignityAction.prototype.destroy=function(){
this.destroyObj.life-=this.destroyLevel;
63
};
DignityAction.prototype.upgrade=function(){
if(this.upgradeObj.hasOwnProperty(this.upgradeObjPropName)){
if(this.upgradeObjIncVal>0){
this.upgradeObj[this.upgradeObjPropName]+=this.upgradeObjIncVal;
}elseif(this.upgradeObjNewVal>0){
this.upgradeObj[this.upgradeObjPropName]=this.upgradeObjNewVal;
}
}
};
DignityAction.prototype.move=function(){
if(this.moveObj!=null){
this.moveObj.moveStart=true;
this.moveObj.moveEnd=false;
}
};
DignityAction.prototype.sense=function(){
if(this.senseObj!=null){
this.senseObj.senseRadius=this.senseRadius;
this.senseObj.senseStart=true;
this.senseObj.senseEnd=false;
}
};
DignityAction.prototype.custom=function(){
this.customActionObj[this.customActionName]();
};
64
4.1.5.DignityMissionSınıfıveGörevYönetimi
DignityMissionsınıfı,DignityAIü zerindekigö revyö netiminisağ layanveherbir
yapayzekalıkarakteregö revatamasıyapılabilenbirsınıftır.Basitolaraklisteler
halinde gö revlerin tanımlanabildiğ i gö revler için aksiyonların DignityAction
tarafından tanımlanabildiğ i ve tanımlanan bu aksiyonları senkron ya da
asenkronolarakçalıştırılabildiğ ibiryapıiçermektedir.
DignityMission temelde bir description ve action tanımlamalarından oluşur.
Açıklama gö revin kullanıcılara gö sterileceğ i durumlar için tanımlanmıştır.
Aksiyon tanımlaması ise DignityAction sınıfı tü rü nden bir nesne ataması ile
yapılır. Bunun için DignityMission sınıfı içerisinde actionStart, actionEnd ve
actionTimeö zellikleritanımlanmıştır.Buö zelliklersayesindegö revtanımlaması
içerisinde bir başlangıç aksiyonu, bitiş aksiyonu ve herhangi bir zamanda
çalıştırılacak bir zamanlama aksiyonu tanımlanabilir. Aksiyonların hangi
metotlarının kullanılacağ ına ise actionStartName, actionEndName ve
actionTimeNameisimliö zelliklerdebelirtilenDignityActionsınıfımetotisimleri
(move(), sense(), create(), destroy(), upgrade() ve custom()) yer alır. Ayrıca
async isimli ö zellik sayesinde gö revin asenkron mu yoksa senkron mu
çalıştırılacağ ıbelirtilebilir.
DignityMissioniçerisindegö revinbitmesininkontrolü finishTimedeğ işkeniile
sağ lanır. finishTime değ işkeni 0 (sıfır) verildiğ inde gö rev geçişi aksiyonlar
tarafındansağ lanacakdemektir.Eğ erbudeğ işkeneherhangibirdeğ ergirilirse
saniye cinsinden gö revin bir yaşama sü reci olur. Bu sü re sonunda actionEnd
aksiyonu işletilir ve bir sonraki gö reve geçilir. Gö rev geçişlerinin bir diğ er
parametresi ise async değ işkenidir. Bu boolean değ işken sayesinde gö revin
asenkron veya senkron olması durumu belirlenir. Asenkron olan tü m gö revler
aynıandaçalıştırılır.Ancak,ilkgö revsenkronveikinci,ü çü ncü gö revlerasenkron
iseilkgö revçalıştırılır,bugö revbittiktensonraikinciveü çü ncü gö revleraynı
andaçalıştırılır.
65
Bu sayede yapay zekalı karakterin tü m davranışları gö rev listesinden
oluşturulabilmektedir. Ayrıca komut verici bir yapay zeka oluşturulmak
istendiğ indeyanibirRTSoyundakomutanolarakdiğ eraskerleregö revverecek
bir karakter için DignityAction nesnesi oluşturularak belli periyot ve
değ işkenlere gö re karakterlere gö rev eklemesi yapması sağ lanabilir. Burada
belirliperiyotlarlaaskertü retmegibirutinbazıoyundinamiklerigerekecektir.
Bunungibidurumlariçindebelliperiyotlarhalindeçalıştırılmasıistenenaksiyon
actionTime olarak belirlenir. DignityMission içerisindeki time ö zelliğ i 0’dan
bü yü k bir değ er olarak verildiğ inde continuous ö zelliğ inin true/false değ erine
bakılır.Eğ ertekraredenbiraksiyonçalıştırmakistenirsecontinuousö zelliğ itrue
verilerekaksiyonuntimeileverilensü redebirçalıştırılmasısağ lanır.Tekrareden
bir gö rev tanımlaması yapılmadığ ı taktirde ise sadece time değ eri kadar
bekletildiktensonraaksiyontekseferlikçalıştırılır.
DignityMission bu açıdan DignityAI içerisinde kilit bir ö nem taşımaktadır.
Bö ylece DignityMission içerisinde bir DignityAction nesnesi ile aksiyonlar
tanımlanabilirveaksiyonlaryardımıylaDignityObjectsınıfındakitü mnesnelerin
parametrelerineerişilebilir.DignityMissionsınıfıtanımlamasıaşağ ıdakigibidir.
varDignityMission=function(){
DignityObject.call(this);
this.desc="";
this.actionStart=newDignityAction;//executeactionwhenstartmission
this.actionStartName="";//methodnameforactionstart
this.actionEnd=newDignityAction;//executeactionwhenendmission
this.actionEndName="";//methodnameforactionend
this.actionTime=newDignityAction;//executeactionwhentimingmission
this.actionTimeName="";//methodnameforactiontime
this.finishTime=0;//runendactionforafterfinishTime
this.time=0;//timemilisecondforactionTime
66
this.continuous = false; //if true actionTime works continuously, execute each
timeinterval
this.async=false;//actionsstartsametime
this.end=false;//learnformissionendtoexecuteactionEnd
};
DignityMission.prototype=Object.create(DignityObject.prototype);
DignityMission.prototype.constructor=DignityMission;
DignityMission.prototype.executeAction=function(_dignityObject,_name){
_dignityObject[_name]();
};
DignityMission.prototype.executeEndAction=function(){
if(this.actionEndName!=="")
this.actionEnd[this.actionEndName]();
};
DignityMission.prototype.execute=function(){
if(this.finishTime>0){
this.executeAction(this.actionStart,this.actionStartName);
window.setTimeout(this.executeAction,
this.finishTime,
this.actionEndName);
}elseif(this.time<=0){
if(this.end){
this.executeAction(this.actionEnd,this.actionEndName);
}
else{
this.executeAction(this.actionStart,this.actionStartName);
}
}
if(this.time>0){
67
this.actionEnd,
if(this.continuous){
window.setInterval(this.executeAction,
this.time,
this.actionTime,
this.time,
this.actionTime,
this.actionTimeName);//runeverytimeseconds
}else{
window.setTimeout(this.executeAction,
this.actionTimeName);//runonceaftertimeseconds
}
}
};
4.1.6.DignityAIBaseSınıfıveTemelYapayZekaFonksiyonları
DignityAIBase sınıfı yapay zekalı nesnelerin temel sınıfıdır. Tüm yapay zekalı
karakterler
bu
sınıftan
türetilmiş
karakterlerdir.
DignityStructure,
DigntiyHuman, DignityVehicle ve DignityAnimal gibi sınıflar DignityAIBase
üzerine özelleştirilmiş ve bu sınıftan türetilmiş yapay zekalı karakterler için
kullanılacak sınıflardır. Ayrıca istenildiği kadar DignityAIBase sınıfından
türetilmişnesneeklenereközelleştirmeleryapılabilir.
Bundan önceki tüm sınıflar DignityAI temel mekaniklerini ilerletmek ve
DignityAIBase sınıfı içerisinde kullanılacak temel özellikleri geliştirmek için
kullanılmışolansınıflardır.BusınıflarıntemelkullanımalanıDignityAIBaseve
ondan türetilmiş sınıflardır. DignityAIBase sınıfına bakıldığında aşağıdaki bir
yapıbulunmaktadır.
varDignityAIBase=function(){
DignityObject.call(this);
this.parentObject=null;
this.bullets=null;
this.life=100;
this.value=0;
68
this.level=0;
//movespeed
this.speed=1;
this.missionList=[];
this.missionIndex=0;
//forsense
this.friendList=[];
this.enemyList=[];
this.obstacleList=[];
this.collectableList=[];
this.ignoreList=[];
this.pathList=[];
this.pathIndex=0;
this.moveStart=false;
this.moveEnd=false;
this.senseRadius=1;
this.senseStart=false;
this.senseEnd=false;
//ifithasacollectedobject
this.collectedObjects=[];
};
DignityAIBase.prototype=Object.create(DignityObject.prototype);
DignityAIBase.prototype.constructor=DignityAIBase;
DignityAIBase.prototype.start=function(){
69
//runasyncmissonsfirst
for(vari=0;i<this.missionList.length;i++){
if(this.missionList[i].async){
this.missionList[i].execute();
}
}
if(!this.missionList[this.missionIndex].async)
this.missionList[this.missionIndex].execute();
};
DignityAIBase.prototype.executeMission=function(){
this.missionList[this.missionIndex].execute();
};
DignityAIBase.prototype.nextMission=function(){
if(this.missionList.length>0&&this.missionIndex<this.missionList.length){
this.missionIndex++;
}else{
this.missionIndex=0;
}
};
DignityAIBase.prototype.prevMission=function(){
if(this.missionList.length>0&&this.missionIndex>0){
this.missionIndex--;
}else{
this.missionIndex=0;
}
};
DignityAIBase.prototype.nextPath=function(){
if(this.pathList.length>0&&this.pathIndex<this.pathList.length){
70
this.pathIndex++;
}else{
this.pathIndex=0;
}
};
DignityAIBase.prototype.prevPath=function(){
if(this.pathList.length>0&&this.pathIndex>0){
this.pathIndex--;
}else{
this.pathIndex=0;
}
};
DignityAIBase.prototype.move=function(obj){
if(this.moveStart&&!this.moveEnd){
if(this.pathList.length>0&&this.pathIndex<this.pathList.length){
varpath=this.pathList[this.pathIndex];
varpathLength=path.movementPath.length;
if(pathLength>0&&path.movementPathCurrent<pathLength){
varx=0.5+(path.movementPath[path.movementPathCurrent][1]*1);
varz=47.5-(path.movementPath[path.movementPathCurrent][0]*1);
obj.movePoint=newpc.Vec3(x,0,z);
varpos=obj.entity.getPosition();
vartmpVec=newpc.Vec3();
tmpVec.lerp(pos,obj.movePoint,0.05*this.speed);
obj.entity.setPosition(tmpVec);
if(pos.x.toFixed(1)>(x.toFixed(1)-1)&&pos.z.toFixed(1)>(z.toFixed(1)1)){
path.movementPathCurrent++;
console.log('currentmovePath:'+path.movementPathCurrent);
71
}
if(path.movementPathCurrent===path.movementPath.length){
this.nextPath();
this.moveEnd=true;
this.moveStart=false;
varcurrentMission=this.missionList[this.missionIndex];
if(currentMission.actionEnd!=null){
currentMission.end=true;
currentMission.executeEndAction();
this.nextMission();
}
}
}
}
}
};
DignityAIBase.prototype.sense=function(obj,context){
if(this.senseStart&&!this.senseEnd){
varcurrentPos=obj.entity.getPosition();
currentPos.x=Math.floor(currentPos.x);
currentPos.z=Math.floor(currentPos.z);
currentPos.y=0.0;
varray1=currentPos.clone(),
ray2=currentPos.clone(),
ray3=currentPos.clone(),
ray4=currentPos.clone(),
ray5=currentPos.clone();
var_facing="front";
varrayRadius1=this.senseRadius*6;
varrayRadius2=this.senseRadius*2;
72
varrayRadius3=this.senseRadius*1;
switch(_facing){
case"left":
ray1.x-=rayRadius1;
ray2.x-=rayRadius1;
ray3.x-=rayRadius1;
ray4.x-=rayRadius1;
ray5.x-=rayRadius1;
ray2.z+=rayRadius2;
ray3.z-=rayRadius2;
ray4.z+=rayRadius3;
ray5.z-=rayRadius3;
break;
case"right":
ray1.x+=rayRadius1;
ray2.x+=rayRadius1;
ray3.x+=rayRadius1;
ray4.x+=rayRadius1;
ray5.x+=rayRadius1;
ray2.z+=rayRadius2;
ray3.z-=rayRadius2;
ray4.z+=rayRadius3;
ray5.z-=rayRadius3;
break;
case"front":
ray1.z+=rayRadius1;
ray2.z+=rayRadius1;
ray3.z+=rayRadius1;
ray4.z+=rayRadius1;
73
ray5.z+=rayRadius1;
ray2.x+=rayRadius2;
ray3.x-=rayRadius2;
ray4.x+=rayRadius3;
ray5.x-=rayRadius3;
break;
case"back":
ray1.z-=rayRadius1;
ray2.z-=rayRadius1;
ray3.z-=rayRadius1;
ray4.z-=rayRadius1;
ray5.z-=rayRadius1;
ray2.x+=rayRadius2;
ray3.x-=rayRadius2;
ray4.x+=rayRadius3;
ray5.x-=rayRadius3;
break;
}
this.cast(context,obj,ray1.x,ray1.y,ray1.z);
this.cast(context,obj,ray2.x,ray2.y,ray2.z);
this.cast(context,obj,ray3.x,ray3.y,ray3.z);
this.cast(context,obj,ray4.x,ray4.y,ray4.z);
this.cast(context,obj,ray5.x,ray5.y,ray5.z);
}
};
DignityAIBase.prototype.cast=function(context,obj,x,y,z){
if(this.senseStart&&!this.senseEnd){
varrayStart=newpc.Vec3();
varrayEnd=newpc.Vec3(x,y,z);
74
rayStart.copy(obj.entity.getPosition());
rayStart.y=0.0;
context.systems.rigidbody.raycastFirst(rayStart,
rayEnd,
this.findHit.bind(this));
}
};
DignityAIBase.prototype.findHit=function(result){
if(this.senseStart&&!this.senseEnd){
//splitforfirst_characterinresultobjectifitdoesn'thaveitreturnfullname
varname=result.entity.getName().split("_")[0];
varotherDetected=true;
if(this.ignoreList.indexOf(name)<0){
if(this.friendList.indexOf(name)>=0){
console.log('detectedfriend:'+name);
this.detectedFriend(result.entity);
otherDetected=false;
}
if(this.enemyList.indexOf(name)>=0&&){
console.log('detectedenemy:'+name);
this.detectedEnemy(result.entity);
otherDetected=false;
}
if(this.collectableList.indexOf(name)>=0){
console.log('detectedcollectable:'+name);
this.detectedCollectable(result.entity);
otherDetected=false;
}
75
if(this.obstacleList.indexOf(name)>=0){
console.log('detectedobstacle:'+name);
this.detectedObstacle(result.entity);
otherDetected=false;
}
if(otherDetected){
console.log('detectedobject:'+name);
this.detectedOther(result.entity);
}
}
}
};
DignityAIBase.prototype.stopSense=function(){
this.senseEnd=true;
this.senseStart=false;
varcurrentMission=this.missionList[this.missionIndex];
if(currentMission.actionEnd!=null){
currentMission.end=true;
currentMission.executeEndAction();
this.nextMission();
}
};
DignityAIBase.prototype.detectedFriend=function(entity){
console.log('detectedFriendactionbase');
};
DignityAIBase.prototype.detectedEnemy=function(entity){
console.log('detectedEnemyactionbase');
};
76
DignityAIBase.prototype.detectedCollectable=function(entity){
console.log('detectedCollectableactionbase');
};
DignityAIBase.prototype.detectedObstacle=function(entity){
console.log('detectedObstacleactionbase');
};
DignityAIBase.prototype.detectedOther=function(entity){
console.log('detectedOtheractionbase');
};
DignityAIBase.prototype.shoot=function(bullets,entity){
console.log('shootactionbase');
bullets.new({
id:newDate().getTime(),
from:this.parentObject,
tx:entity.getPosition().x,
ty:entity.getPosition().z,
sp:1
});
};
YukarıdakikodbloğundagöründüğügibiDignityAIBasesınıfıiçerisinde,speed,
life,valuevelevelismindeözelliklertanımlanmıştır.Buözelliklertümyapay
zekalı nesnelerde olan ortak özelliklerdendir. Bunların yanında yapay zekalı
nesnelerde mutlaka bir görev listesi (missionList) olmalıdır. Bu görev listesi
sırayla (asenkron olanlar aynı anda) çalışmaya başlayarak tanımlanan görev
listesiniçalıştırır.Herhangibirşekildesenkronbirgörevegelindiğindeisediğer
asenkrongörevlerçalıştırılmadansenkrongörevinbitmesibeklenir.
Ayrıca friendList, enemyList, obstacleList ve collectableList isminde
özelliklerdebulunmaktadır.BuözelliklersayesindeDignityActionsınıfınınana
77
metotlarındanolansense()metoduiçerisindekialgılamaişlemlerininyapılması
sağlanır.sense()fonksiyonubulistelerebakarakkullanıcınınbelirlenenalgılama
işlemlerini gerçekleştirir ve sonuç olarak algılama işlemi sonucunda
detectedFriend(),
detectedEnemy(),
detectedCollectable()
ve
detectedObstacle()metotlarıçağırılır.BununyanındabirdeignoreListözelliği
ile algılanması istenmeyen nesneler belirlenebilir. Herhangi bir şekilde
ignoreListiçerisindeolannesnealgılamaişleminetabitutulmaz.
Yine DignityAIBase sınıfında bulunan pathList dizisi, DignityPath türünde
nesneleritutarakgörevleriçerisindebuyollarınkullanılmasınısağlar.Buyapay
zekalıkaraktereeklenmişherhangibiryollistesiyoksasistemüzerindenyeni
eklenenbirkonumahareketettirilmemesinisağlar.Busayede,tümdiğersınıflar
üzerindentekbirkaynağaerişimsağlanır.
DignityAIBase içerisinde mevcut görevi herhangi bir anda çalıştırmak için
executeMission() metodu tanımlanmıştır. Ayrıca görevler arasında gezinme
işlemiiçinnextMission()veprevMission()metotlarıtanımlanmıştır.Bumetotlar
sayesindemevcutgörevitamamlandığıvebirsonrakigörevegeçilmesiişlemleri
yürütülür. Aynı şekilde move() metodu içerisinde kullanılmak üzere pathList
özelliğinde gezinme işlemleri için ise nextPath() ve prevPath değerleri
bulunmaktadır.
Yapay zekalı nesnelerin hareket ettirilmesi konusunda DignityPath sınıfını
kullanan ve nesnenin mevcut gideceği yol içerisindeki koordinat noktalarına
hareketinin düzenlenmesini sağlamak için DignityAIBase içerisinde move()
metodubulunmaktadır.Bumetothesaplananenkısayolverisininiçerisindeki
tümnoktalardasırasıylanesneninhareketettirilmesinivehareketişlemisona
erdiğinde(ensonnoktayaulaştığında)aksiyonunsonaerdirilmesiniveyavarsa
birsonrakinoktayailerlenmesinisağlar.
Yapay zekalı nesnelerin algılama işlemleri için ise sense() metodu
tanımlanmıştır.BumetotiçerisindeklasikRayCastmetodukullanılaraktemelde
nesnenin bulunduğu pozisyondan tarama alanındaki pozisyonlara ışınlar
78
gönderilir. Işın gönderme işlemi için cast() metodu tanımlanmıştır. Bu ışına
çarpan (bu çarpma işlemini nesnenin algılayabilmesi için nesnenin collision
component’ineihtiyacıvardır)nesnelersonuçolarakfindHit()metoduiçerisine
düşerler.BumetotiçerisindeisebulunannesneninignoreListözelliğiiçerisinde
olmadığıvefriendList,enemyList,obstacleListvecollectableListgibiözelliklerin
içerisindebulunannesneninolupolmadığınabakılarakilgilialgılamametotlarını
tetiklenir.
Ayrıca DignityAIBase sınıfından türetilmiş diğer nesnelerin algılama
durumlarını farklı şekilde yorumlayabilmeleri için, yukarıdaki listelerin
herhangi birine girmeyen bir nesne algılandığında, bu nesnelere de
ulaşılabilmesinivealgılamanoktasındaesnekbiryapıkurulabilmesiaçısından
detectedOther()metodutanımlanmıştır.BumetotalgılanannesneignoreList
içerisinde değilse ve diğer listeler içerisine de girmiyorsa çağırılır. Bu metodu
kendiiçerisindeoverrideedenDignityAIBasesınıfındantüretilmişnesneleriçin
istenilen özelleştirme yapılabilir. Bunun örneği DignityHuman sınıfı içerisinde
verilmiştir.
Son olarak tanımlanan metot ise shoot() metodudur. Algılama sonucuna göre
istenilen nesnelere ateş edilebilir. Burada ateş edilecek nesne (kurşun, top,
bomba,okvb.)bullets.jsisimliscripttesaklanmaktadır.Hernesneyegörefarklı
silahlarbelirlenebilir.
4.1.7. DignityStructure, DignityVehicle, DignityHuman ve DignityAnimal
SınıflarıileYapayZekalıNesneler
DignityAIBase sınıfı oluşturulup, yapay zeka yö netim sınıfları (DignityPath,
DignityMission,DignityAction)hazırlandıktansonrasırayapayzekalınesnelere
gö re ö zelleştirilmiş sınıflara gelmektedir. Burada temelde bina, araç, insan ve
hayvan olmak ü zere dö rt ana kategori içerisinde ö zelleştirilmiş sınıflar
bulunmaktadır. Sınıflar istenildiğ i gibi ö zelleştirilerek bu sınıflardan da yeni
sınıflartü retilipfarklınitelikteyapayzekanesnelerioluşturulabilir.
79
DignityStructure, DignityAIBase sınıfından tü retilmiş ve bina, yapı gibi sabit
nesnelereyapayzekaö zelliklerikatmakiçintasarlanmıştır.Busınıfsayesindebir
yapıyayinegö revveaksiyonverilebilmektedir.Normaldebirbina,yapıgibisabit
nesnelerhareketetmezler,ancakburadayinedemove()aksiyonukullanılarak
buyapılarhareketeettirilebilirbiryapıileesnekbırakılmıştır.Sonuçtaoyunların
“hayal gü cü nü n dışa aktarımı” niteliğ indeki programlar olduğ u varsayılırsa bu
hayal gü cü dü nyasında hareket edebilen binalar kurgulamak çok da imkansız
gö rü nmemektedir.
DignityStructure içerisinde bazı ö zelleştirilmiş ö zellikler bulunmaktadır. Bu
ö zelliklerin ilki yapının yıkılabilir, yok edilebilir olduğ unu belirler. I„kinci bir
ö zellik ise yapının kapasitesidir. Bu kapasite içerisinde barındırabileceğ i,
saklayabileceğ i nesne kapasitesini belirtir. Bu kapasite istenirse DignityAIBase
sınıfındakilevelö zelliğ iileçarpılarakartırılabilir.Yapılariçinenö nemliö zellik
isebelirlibirsü reiçerisindebirçıktıü retebilenmekanizmayasahipolmalarıdır.
Busayedebellisü relerdebelirlenennesneleriü reterek,istendiğ indeçıktılarıda
saklayabilirler.DignityStructuresınıfınıntanımlamasıaşağ ıdakigibidir.
varDignityStructure=function(){
DignityAIBase.call(this);
this.destroyable=true;
this.storeCapacity=0;
this.storeObjects=[];
this.outputObject=null;
this.outputObjects=[];
this.outputTime=0;
};
DignityStructure.prototype=Object.create(DignityAIBase.prototype);
DignityStructure.prototype.constructor=DignityStructure;
80
DignityStructure.prototype.destroy=function(){
if(this.destroyable){
this.storeCapacity=0;
this.storeObjects=[];
this.outputObjects=[];
this.outputTime=0;
}
};
DignityStructure.prototype.store=function(_dignityObject){
if(this.storeCapacity>0&&this.storeCapacity<this.storeObjects.length){
this.storeObjects.push(_dignityObject);
}
};
DignityStructure.prototype.generate=function(isStoreObject){
if(this.outputTime>0){
window.setTimeout(this.pushOutput,this.outputTime,isStoreObject);
}else{
this.pushOutput(isStoreObject);
}
};
DignityStructure.prototype.pushOutput=function(isStoreObject){
this.outputObjects.push(this.outputObject);
if(isStoreObject){
this.store(this.outputObject);
}
};
DignityVehicle,yapayzekalıbiraraçmodelioluşturmakiçingeliştirilmiştir.Bu
sınıf içerisinde DignityAction sınıfının move aksiyonunu kullanan ancak sınıfa
81
özgü hareket durumlarını yöneten bir drive() fonksiyonu bulunmaktadır. Bu
metotsayesindearacınmotordurumuilesürüşhızıverilerihesaplanarakhızı
bulunur. Aracın motor durumu kötüye gittiğinde hızı da otomatik düşürülür.
AraçherhangibirşekildebaşkaaraçlaçarpıştığındaengineLifeözelliğiçarpışma
şiddeti kadar düşürülür ve buna göre hız tekrar hesaplanır. Bu çarpışma
durumunucrashVehicle()metodukontroletmektedir.Herhangibironarımkiti
gibibirnesnealdığındaengineLifedeğerininiyileştirilmesiiçinrepairEngine()
metodu bulunmaktadır. Son olarak ise istenildiğinde aracı durdurmak için bir
stopEngine() metodu bulunmaktadır. DignityVehicle sınıfının ana yapısı ise
aşağıdakigibidir.
varDignityVehicle=function(){
DignityAIBase.call(this);
this.engineLife=100;
this.driveSpeed=1;
this.onAir=false;
this.onSea=false;
this.onRail=false;
this.onRoad=false;
this.updateSpeed();
};
DignityVehicle.prototype=Object.create(DignityAIBase.prototype);
DignityVehicle.prototype.constructor=DignityVehicle;
DignityVehicle.prototype.updateSpeed=function(){
this.speed=this.driveSpeed*(this.engineLife/100);
};
//callforcrashothervehicles
82
DignityVehicle.prototype.crashVehicle=function(damage){
if(damage>0){
this.engineLife-=damage;
this.updateSpeed();
}
if(this.engineLife<=0){
this.stopEngine();
}
};
DignityVehicle.prototype.stopEngine=function(){
this.speed=0;
};
DignityVehicle.prototype.repairEngine=function(repairValue){
if(repairValue>0){
this.engineLife+=repairValue;
this.updateSpeed();
}
};
DignityVehicle.prototype.detectedFriend=function(entity){
console.log('vehicledetectedFriendaction');
};
DignityVehicle.prototype.detectedEnemy=function(entity){
console.log('vehicledetectedEnemyaction');
this.bullets=this.appContext.root.getChildren()[0].script.bullets;
this.shoot(this.bullets,entity);
};
83
DignityHuman,yapayzekalıbirinsanmodelioluşturmakiçintanımlanmıştır.
Ekolarakdüşmanıalgılamahızı,savaşçıkarakterleriçinsaklanmayeriaramave
bu yere doğru ilerleme özelliği, düşmanlardan korkma seviyesi gibi özellikler
barındırır.BuözellikleriiçerenDignityHumansınıfıaşağıdakigibidir.
varDignityHuman=function(){
DignityAIBase.call(this);
this.senseEnemySpeed=0;
this.isFindCover=false;
this.fearEnemyLevel=0;
};
DignityHuman.prototype=Object.create(DignityAIBase.prototype);
DignityHuman.prototype.constructor=DignityHuman;
DignityHuman.prototype.detectedFriend=function(entity){
console.log('humandetectedFriendaction');
};
DignityHuman.prototype.detectedEnemy=function(entity){
console.log('humandetectedEnemyaction');
this.bullets=this.appContext.root.getChildren()[0].script.bullets;
this.shoot(this.bullets,entity);
};
DignityHuman.prototype.detectedOther=function(entity){
console.log('detectedOtheractionbase');
varname=result.entity.getName();
if(this.isFindCover){
if(name.indexOf('cover')>=0){
84
this.coverObject(entity);
}
}
};
DignityHuman.prototype.coverObject=function(entity){
console.log("humancoverobject");
this.speed=0;
};
BuradaDignityAIBasesınıfıtanımlanırkenanlatılan detectedOther()sınıfının
bir kullanımı görülmektedir. Bu kullanımla birlikte karakterin arkasına
saklanabileceğinesnelerialgılamasıvealgılamasonucubasitolarakdurmasıele
alarakdiğernesnelerinyakalanmasıişlemininözelleştirilmesielealınmıştır.
DignityAnimal, tıpkı DignityHuman gibi tasarlanmış ve hayvansal özelliklere
göre özelleştirilmiş olan ve yapay zekalı hayvan nesneleri oluşturulabilen bir
sınıftır. DignityAnimal sınıfında ekstra olarak hayvan türleri, insanları avlayıp
avlamayacağı,kenditürleriniavlayıpavlamayacağıvetoplulukhalindeyaşayıp
yaşamadıkları bilgileri de sınıf içerisinde bulunmaktadır. Bu bilgiler ışığında
insanlarıalgılamasıveavlaması,kenditürlerinialgılamasıveavlamasıveyine
kendi türlerini algılayarak yanlarına gitmesi durumları kurgulanmıştır.
DignityAnimalsınıfınınyapısıaşağıdakigibidir.
varDignityAnimal=function(){
DignityAIBase.call(this);
this.type="";
this.isHuntHuman=false;
this.isHuntSameType=false;
this.isLiveCrowd=false;
};
85
DignityAnimal.prototype=Object.create(DignityAIBase.prototype);
DignityAnimal.prototype.constructor=DignityAnimal;
DignityAnimal.prototype.detectedFriend=function(entity){
console.log('humandetectedFriendaction');
if(this.isHuntHuman){
if(entity.getName().indexOf('human')>=0){
this.huntHuman(entity);
}
}
if(this.isHuntSameType){
if(entity.getName().indexOf('animal')>=0){
this.huntAnimal(entity);
}
}
};
DignityAnimal.prototype.detectedEnemy=function(entity){
console.log('humandetectedEnemyaction');
this.bullets=this.appContext.root.getChildren()[0].script.bullets;
this.shoot(this.bullets,entity);
};
DignityAnimal.prototype.huntHuman=function(entity){
console.log('humanhunting');
this.bullets=this.appContext.root.getChildren()[0].script.bullets;
this.shoot(this.bullets,entity);
};
DignityAnimal.prototype.huntAnimal=function(entity){
86
console.log('animalhunting');
this.bullets=this.appContext.root.getChildren()[0].script.bullets;
this.shoot(this.bullets,entity);
};
87
4.2.DIGNITYAIKULLANANÖRNEKOYUNMODELİ
DignityAIkullananö rnekbiroyunprogramlanırkengö rselolarakçokhazırve
prodü ksiyona yö nelik bir sunumdan ziyade, DignityAI’ın temel mekaniklerini,
DignityAIBase ve bundan tü retilmiş ve ö zelleştirilmiş DignityHuman,
DignityAnimal, DignityStructure ve DignityVehicle sınıflarını kullanılarak basit
birharitaü zerindegirilengö revleriyerinegetirenvegerekliaksiyonlarıistenilen
şekilde işleten bir yapı ortaya çıkarılmıştır. Ayrıca, ö rnek oyun geliştirilmesi
sırasındaDignityAIyapayzekakü tü phanesininsınırlarıvegeliştirilebilecekolan
ekstra ö zellikleri ele alınarak bir sonraki geliştirme sü rü mlerinde eklenmek
ü zerebelirlenmiştir.
Geliştirilecekolanoyuntemelolarakheraçılıştarastgeleoluşturulan48x48bir
grid harita ü zerinde yol ve engelleri tanımlamalıdır. Daha sonra basit bir tank
modeli DignityVehicle sınıfı ile yö netilmekte ve yol bulma, algılama, gö rev
yö netimi,aksiyonyö netimigibitü mö zelliklerelealınmaktadır.Bununyanında
harita ü zerine rastgele konumlara toplanabilen nesneler yerleştiren
RandomModelCreator isminde bir DignityStructure nesnesi bulunmaktadır.
SonolarakiseKırmızıveMavitakımü reticisiolmakü zereyineDignityStructure
nesnesiolanRedCreatorveBlueCreatornesneleribulunmaktadır.Bunesneler
belirli periyotlarla sahnede tank oluşturmakta ve bunlara rastgele harita
ü zerinde koordinatlar atayarak tankların belirlenen yolu izlemelerini ve bu
esnada algıladıkları dü şman ve toplanabilir nesnelere karşı farklı aksiyonlar
sergilemelerinisağ lamaktadır.
O‚ ncelikli olarak oyunun geçeceğ i harita hazırlanmalıdır. Bunun için 48x48 bir
gridü zerindebasitbirdü zlem(plane)nesnesiyardımıylayolveengelmodelleri
oluşturulmaktadır. Burada grid oluşturulurken engellerin geleceğ i yerler 1,
tanklarınhareketedebileceğ iyerlerise0olarakbelirlenmiştir.Buharitauzayı
oluşturulduktansonrayolbulma(pathfinding)işlemleriharitauzayıü zerinden
gerçekleştirilir. Bu işlemlere gö re harita nesnesi rastgele bir şekilde aşağ ıdaki
gibioluşturulur.
88
Şekil 4.2: Rastgele Oluşturulan Harita Örneği 1. Görüntü
OyunheraçılışındaŞekil4.2’dekigibirastgeleolarakharitaoluşturulurveharita
ü zerinde elementler eklenir. Oyun tekrar açıldığ ında ise yine rastgele harita
oluşturularakŞekil4.3’dekigibibirgö rü ntü ortayaçıkmaktadır.
Şekil 4.3: Rastgele Oluşturulan Harita Örneği 2. Görüntü
pc.script.create('createmap',function(app){
//CreatesanewCreatemapinstance
89
varCreatemap=function(entity){
this.entity=entity;
this.map=[[]];
this.berkan="berkanuslu";
};
Createmap.prototype={
initialize:function(){
this.floorModel=app.root.findByName('map0_0');
this.wallModel=app.root.findByName('wall0_0');
this.mapParent=app.root.findByName('map');
this.initializeMap(48,48);
},
update:function(dt){
},
initializeMap:function(_worldWidth,_worldHeight){
for(varx=0;x<_worldWidth;x++)
{
this.map[x]=[];
for(vary=0;y<_worldHeight;y++)
{
this.map[x][y]=0;
varfloor=this.floorModel.clone();
varpos=floor.getPosition();
this.mapParent.addChild(floor);
floor.setPosition(newpc.Vec3(pos.x+(y*1),pos.y,pos.z-(x*1)));
console.log("yoleklendi");
}
}
for(varx1=0;x1<_worldWidth;x1++)
90
{
for(vary1=0;y1<_worldHeight;y1++)
{
if (Math.random() > 0.95 || (y1 === 0) || (x1 === 0) || (x1 ==
_worldWidth-1)||(y1==_worldHeight-1)){
this.map[x1][y1]=1;
varwall=this.wallModel.clone();
wall.name="wall_"+x1+"_"+y1;
varpos1=wall.getPosition();
this.mapParent.addChild(wall);
wall.setPosition(newpc.Vec3(pos1.x+(y1*1),pos1.y,pos1.z-(x1*1)));
console.log("duvareklendi");
}
}
}
this.onInitCompeted();
},
onInitCompeted:function(){
app.root.getChildren()[0].script.mySample.addRandomModelCreator();
}
};
returnCreatemap;
});
Haritayı oluşturduktan sonra haritanın rastgele konumlarına toplanabilen
nesneleroluşturmakiçinRandomModelCreatorismindekinesneyioluşturupilk
aksiyon ve görev tanımları yapılır. Bunun için aşağıdaki metotlar
kullanılmaktadır.
addRandomModelCreator:function(){
//createrandommodelcreator
var_action=newDignityAction();
91
_action.customActionObj=this;
_action.customActionName='createRandomModel';
var_mission=newDignityMission();
_mission.async=true;
_mission.continuous=true;
_mission.actionTime=_action;
_mission.actionTimeName='custom';
_mission.time=10000;//createevery10seconds
var_creator=newDignityStructure();
_creator.missionList.push(_mission);
_creator.start();
},
createRandomModel:function(){
varmodel=this.getRandomModel();
model.setPosition(this.getRandomPosition());
},
addRandomModelCreator() metodu sayesinde ilk olarak bir DignityAction
nesnesi tanımlanmıştır. Bu nesnenin customActionObj ve customActionName
özelliklerineyineaynıscriptiçerisindeyeralancreateRandomModel()metodu
tanımlanmıştır. Aksiyon tanımlamasından sonra, bu aksiyonun nasıl
çalıştırılacağını yöneten bir DignityMission nesnesi oluşturulur. Bu nesne
asenkronçalışan,süreklidevamedenzamanlıbirgöreviçerir.Her10saniyede
birDignityActionnesnesinincustom()metodunuçağırır.Bumetotdayukarıda
verilen DignityAction tanımlamasındaki ilgili metodu çağırır ve model rastgele
birnoktadaoluşturulmuşolur.Şekil4.4’deharitaüzerinderastgeleoluşturulan
modellerbulunmaktadır.
92
Şekil 4.4: Harita Üzerinde Rastgele Oluşturulan Modeller
Buradaki getRandomModel() ve getRandomPosition() metotları ise yardımcı
metotlardır.Aşağıdabumetotlarındetaylarıbulunmaktadır.
getRandomPosition:function(){
varworldWidth=this.map.script.createmap.map[0].length;
varworldHeight=this.map.script.createmap.map.length;
varrandomX=Math.floor((Math.random()*(worldWidth-2))+1);
varrandomY=Math.floor((Math.random()*(worldHeight-2))+1);
if(isNaN(randomX)||isNaN(randomY)){
this.getRandomPosition();
return;
}
varusageInfo=this.map.script.createmap.map[randomX][randomY];
if(usageInfo===1){
this.getRandomPosition();
return;
93
}
varx1=0.5+(randomY*1);
varz1=47.5-(randomX*1);
return(newpc.Vec3(x1,0,z1));
},
getRandomModel:function(){
varrandomModel=Math.floor((Math.random()*4)+1);
varmodel=null;
switch(randomModel){
case1:
varrepair=this.repairModel.clone();
repair.name='repair_'+newDate().getTime();
this.pickParent.addChild(repair);
repair.addComponent('collision', { type: 'box', halfExtents: new
pc.Vec3(0.5,0.5,0.5)});
console.log(repair.name);
model=repair;
break;
case2:
varshield=this.shieldModel.clone();
shield.name='shield_'+newDate().getTime();
this.pickParent.addChild(shield);
shield.addComponent('collision', { type: 'box', halfExtents: new
pc.Vec3(0.5,0.5,0.5)});
console.log(shield.name);
model=shield;
break;
case3:
vardamage=this.damageModel.clone();
damage.name='damage_'+newDate().getTime();
this.pickParent.addChild(damage);
94
damage.addComponent('collision', { type: 'box', halfExtents: new
pc.Vec3(0.5,0.5,0.5)});
console.log(damage.name);
model=damage;
break;
default:
varpickDefault=this.pickDefaultModel.clone();
pickDefault.name='default_'+newDate().getTime();
this.pickParent.addChild(pickDefault);
pickDefault.addComponent('collision', { type: 'box', halfExtents: new
pc.Vec3(0.5,0.5,0.5)});
console.log(pickDefault.name);
model=pickDefault;
}
returnmodel;
},
Burada dikkat edilmesi gereken unsur ise, oluşturulan rastgele modellerin
collisionismindebirbileşen(component)sahibiolmalarıdır.Bubileşen,ileride
algılama (sense) işlemi için nesnenin algılanmasını sağlamak için
kullanılabileceğinibelirtmektedir.
Bununlabirlikteharitaüzerineher10saniyedebirrastgeledörtmodeldenbirisi
eklenecektir.Haritaüzerindeburastgeleoluşumlarıdabitirdiktensonrakırmızı
vemavitakımiçinbirertankoluşturmayaveyapayzekalınesnelerleişlevlerini
tanımlamayadevamedilir.Kırmızıtakımiçinbirtankoluşturmaişlemiaşağıdaki
gibidir.
addRedTankCreator:function(){
//createredtankcreator
var_action=newDignityAction();
_action.customActionObj=this;
_action.customActionName='createRedTankModel';
95
var_mission=newDignityMission();
_mission.async=true;
_mission.continuous=false;
_mission.actionTime=_action;
_mission.actionTimeName='custom';
_mission.time=10000;//createevery10seconds
var_creator=newDignityStructure();
_creator.missionList.push(_mission);
_creator.start();
},
createRedTankModel:function(){
vartankName='tank_'+newDate().getTime();
varnewTank=this.tank.clone();
newTank.setName(tankName);
newTank.enabled=true;
newTank.setPosition(this.getRandomPositionRange(2, 10, 2, 10)); //left
bottom
newTank.addComponent('collision', { type: 'box', halfExtents: new
pc.Vec3(0.5,0.5,0.5)});
this.tanks.addChild(newTank);
varourPath=newDignityPath();
ourPath.map=this.map.script.createmap.map;
varmapX=Math.round((47.5-newTank.getPosition().z)/1.0);
varmapY=Math.round((newTank.getPosition().x-0.5)/1.0);
while(ourPath.movementPath.length==0){
ourPath.from=[mapX,mapY];
ourPath.randomable=true;
96
ourPath.findPath();
}
console.log('redpath:'+ourPath.movementPath);
varvehicle=newDignityVehicle();
vehicle.appContext=app;
vehicle.enemyList.push('tank');
vehicle.enemyList.push('damage');
vehicle.enemyList.push('repair');
vehicle.enemyList.push('shield');
vehicle.enemyList.push('default');
vehicle.ignoreList.push('wall');
vehicle.pathList.push(ourPath);
vehicle.parentObject=newTank;
newTank.script.tank.setHP(10);
newTank.script.tank.ai=vehicle;
newTank.script.tank.hidden(false);
newTank.script.tank.setTankName('red1');
varfirstAction=newDignityAction();
firstAction.moveObj=vehicle;
varfirstMission=newDignityMission();
firstMission.async=true;
firstMission.actionStart=firstAction;
firstMission.actionStartName='move';
varsecondAction=newDignityAction();
secondAction.senseObj=vehicle;
secondAction.senseRadius=10;
97
varsecondMission=newDignityMission();
secondMission.async=true;
secondMission.actionStart=secondAction;
secondMission.actionStartName='sense';
vehicle.missionList.push(firstMission);
vehicle.missionList.push(secondMission);
vehicle.start();
},
addBlueTankCreator:function(){
//createbluetankcreator
var_action=newDignityAction();
_action.customActionObj=this;
_action.customActionName='createBlueTankModel';
var_mission=newDignityMission();
_mission.async=true;
_mission.continuous=false;
_mission.actionTime=_action;
_mission.actionTimeName='custom';
_mission.time=10000;//createevery10seconds
var_creator=newDignityStructure();
_creator.missionList.push(_mission);
_creator.start();
},
createBlueTankModel:function(){
vartankName='tank_'+newDate().getTime();
varnewTank=this.tank.clone();
newTank.setName(tankName);
newTank.enabled=true;
98
newTank.setPosition(this.getRandomPositionRange(37, 45, 2, 10)); //right
top
newTank.addComponent('collision', { type: 'box', halfExtents: new
pc.Vec3(0.5,0.5,0.5)});
this.tanks.addChild(newTank);
varourPath=newDignityPath();
ourPath.map=this.map.script.createmap.map;
varmapX=Math.round((47.5-newTank.script.tank.entity.getPosition().z)/
1.0);
varmapY=Math.round((newTank.script.tank.entity.getPosition().x-0.5)/
1.0);
while(ourPath.movementPath.length==0){
ourPath.from=[mapX,mapY];
ourPath.randomable=true;
ourPath.findPath();
}
console.log('bluepath:'+ourPath.movementPath);
varvehicle=newDignityVehicle();
vehicle.appContext=app;
vehicle.enemyList.push('tank');
vehicle.enemyList.push('damage');
vehicle.enemyList.push('repair');
vehicle.enemyList.push('shield');
vehicle.enemyList.push('default');
vehicle.ignoreList.push('wall');
vehicle.pathList.push(ourPath);
vehicle.parentObject=newTank;
99
newTank.script.tank.setHP(10);
newTank.script.tank.ai=vehicle;
newTank.script.tank.hidden(false);
newTank.script.tank.setTankName('blue1');
varfirstAction=newDignityAction();
firstAction.moveObj=vehicle;
varfirstMission=newDignityMission();
firstMission.async=true;
firstMission.actionStart=firstAction;
firstMission.actionStartName='move';
varsecondAction=newDignityAction();
secondAction.senseObj=vehicle;
secondAction.senseRadius=10;
varsecondMission=newDignityMission();
secondMission.async=true;
secondMission.actionStart=secondAction;
secondMission.actionStartName='sense';
vehicle.missionList.push(firstMission);
vehicle.missionList.push(secondMission);
vehicle.start();
},
Yukarıdaki işlem bloğuna bakıldığında, öncelikli olarak yine bir DignityAction,
DignityMission
tanımlamasının
yapıldığı
addRedTankCreator()
ve
addBlueTankCreator()metodlarıgörülmektedir.Burada,yinebircustomAction
tanımlaması yapılmış, DignityMission nesnesi ile de 10 sn sonra çalıştırılacak
ancak tekrar etmeyecek bir görev tanımlaması yapılmıştır. Açılışta 10 sn
100
beklediktensonracreateRedTankModel()metoduçağırılırveyapayzekalıtank
karakteriŞekil4.5’dekigibisahneyeeklenir.
Şekil 4.5: Oluşturulan Mavi ve Kırmızı Takım Tank Modelleri
createRedTankModel() metoduna bakıldığında öncelikle tank modeli klonlama
işlemiyapılır.Tankmodeliiçindecollisionbileşenitanımlanmıştır.Dahasonra,
tankınizleyeceğiyoliçinDignityPathnesnesioluşturulur.Bunesne,oluşturulan
haritaileilişkilendirilerekmovementPathözelliğifindPath()metoduyardımıyla
oluşturulur.
Tank modeline yapay zeka özellikleri verebilmek için, DignityVehicle sınıfı
kullanılmıştır. Bu sınıf yardımıyla Tank’ın düşman (enemyList) ve dost
(friendList) listeleri tanımlanır. Burada, bir de duvarları algılamaması için
ignoreListiçerisineduvarmodelieklenmiştir.DahasonrapathListdeğerinede
daha önce oluşturulan DignityPath nesnesi verilir. Burada, parentObject ve
appContext özellikleri oyun motorunun kaynaklarına erişmek için kullanılan
özelliklerdir.
101
Oyunmotoruiçerisindeoluşturulanveyapayzekaözelliğiolmayantankmodeli
klonlandıktan sonra, bu nesne içerisindeki ai özelliği sayesinde, oluşturulan
DignityVehiclenesnesioyunmotorufonksiyonlarınıkullanabilmektedir.
Tankiçinikiaksiyonveikigörevtanımlamasıyapılmıştır.Bunlardanilkimove
aksiyonudur. Bu aksiyon başlangıçta, asenkron olarak çalışacak şekilde
ayarlanmıştır. İkinci aksiyon ise, algılama aksiyonudur. Burada, bir de
senseRadiusverilerek10birimlikbiralandatankıntaramayapmasısağlanmıştır.
Tüm bu görevler DignityVehicle nesnesinin missionList özelliğine eklenerek,
DignityVehicle nesnesinin start() metodu çağırılmıştır. Bu metot görevleri
çalıştırarakyapayzekanındevreyegirmesinisağlar.
Tümbuişlemlerinardından,ikifarklıtakımdanikitankmodelirastgeleolarak
verilen yollarda ilerlerken tanımlanan düşmanları algılayıp, Şekil 4.6 ve Şekil
4.7’dekigibishoot()metoduilebuhedeflereateşetmektedirler.
Şekil 4.6: Oluşturulan Tankların Birbirlerini Algılayıp Ateş Etmeleri 1. Görüntü
102
Şekil 4.7: Oluşturulan Tankların Birbirlerini Algılayıp Ateş Etmeleri 2. Görüntü
103
5.SONUÇVEÖNERİLER
Geliştirilen yapay zeka kütüphanesi, temelde HTML5 oyun motorlarında
kullanılabilecek bir nesne yönelimli yapıya sahip olmakla birlikte, görev
yönetimi,aksiyonyönetimiveyolbulmaişlevleriylebirlikteHTML5tabanlıbir
yapayzekakütüphanesindegerekliöğeleriiçerisindebarındırmaktadır.
DignityMission sınıfı, esnek bir yapıyla birlikte görev yönetimi, görevler
arasındaki geçiler ve görevlerin işletilmesini sorunsuz bir şekilde
gerçekleştirmektedir.
DignityAction sınıfı, move(), sense(), create(), destroy() ve upgrade()
metotlarıyla temel aksiyonları yönetebilirken custom() metodu sayesinde
özelleştirilebilir ve bu beş temel aksiyonunun dışında tanımlanabilecek
aksiyonlaradestekverereksisteminesnekçalışmasınısağlamaktadır.
DignityPathsınıfı,A*algoritmasıveüçtemeluzaklıkhesaplamayöntemiolan
Manhattan, Diagonal ve Euclidean metotları ile özellikle küçük ve orta ölçekli
haritalardamevcutyöntemleriçerisindeenbasitveentutarlıçalışanıdır.Ancak
DignityPathsınıfıhemdiğeralgoritmalarınhemdefarklıhesaplamametotlarının
eklenmesiyledahadagüçlühalegelebilecektir.
DignityAIBasesınıfı,temelyapayzekafonksiyonlarıyönettiğigibiözelleştirilmiş
sınıfların da temel sınıfı olma özelliği taşımaktadır. Bu yönüyle sistemin
omurgasındayeralır.DignityAIBase’dentüretilenDignityVehicle,DignityHuman,
DignityAnimal ve DignityStructure sınıfları ise kendi içlerinde özelleştirildikçe
dahadagüçlüvekapsayıcıbirhalalacaktır.
AyrıcaDignityAI’ınaçıkkaynakkodluolmasıvediğerpopüleroyunmotorlarına
dauyarlanmasıylabirliktegelişimidahadahızlıdevamedecektir.HTML5tabanlı
oyunlar içerisinde durum yönetiminden, yol bulmaya, görev yönetiminden
aksiyon yönetimine tüm işlevleri yerine getirebilen tam bir yapay zeka
kütüphanesiolarakliteratürdekiyerinialacaktır.
104
Bu bağlamda öncelikli olarak PlayCanvas oyun motoru üzerinde geliştirme
yapılmıştır. PlayCanvas oyun motorunun seçilmesindeki en önemli sebep ise
oyun geliştirmeye başlama sürecinin çok kısa olması ve oyun motorunun
altyapısını gerçekten çok güçlü yapısıdır. Ayrıca PlayCanvas’ın online editörü
yardımıyla üç boyutlu bir oyun tasarımı ve sahne tasarımı kolaylıkla
gerçekleştirilebilmektedir.TümbunlarındayanındaPlayCanvasiçerisindehazır
oyunmodelleriveaçıkkaynaklıoyunlarbulunmaktadır.Buaçıkkaynaklıoyunlar
istenildiği gibi ana projeden çatallanarak (fork) geliştirilmeye kendi tarafında
devam edilebilmektedir. Bu sayede oyun motorunun ve oyunun bileşenleri ile
uğraşmak yerine DignityAI’ın kendi iç dinamiklerine ve güçlü yapısına vakit
ayırılmıştır.
DignityAI’ınbundansonrakisürecindehedeflenentümyapayzekadinamiklerine
ve HTML5 oyun motorlarına uyarlanmış, HTML5’in de sınırlarını aşarak hatta
HTML5’in de gelişimine katkıda bulunarak farklı dillerde daha global oyun
motorları olan Unity, Unreal Engine ve CryEngine gibi oyun motorlarına
uyarlanarak sistemin geliştirilmesidir. Bunun için DignityAI tamamen açık
kaynakkodluolarakGithubsosyalkodpaylaşımsitesiüzerindenyayınlanmıştır.
(Uslu, 2015a) Ayrıca DignityAI ile hazırlanan örnek uygulama da yine Github
üzerindenpaylaşılmıştır.(Uslu,2015b)
DignityAI’ın bir üst modeli ise kendi kendine düşünebilen, kendi görevlerini
kendiekleyerekkendiaksiyonlarınıseçebilenveöğrenebilenbirmodelolması
öngörülmektedir.
105
KAYNAKLAR
Bibat,B.,2015.HTML5Shoot’emUpinanAfternoon:Learn(orteach)thebasics
ofGameProgrammingwiththisfreePhasertutorial.Leanpub.95s.
Buckland,M.,2005.ProgramminggameAIbyexample.Jones&BartlettLearning.
521s.
Cielen,D.,Meysman,A.,2013.HTML5GameDevelopmentwithImpactJS:Astepby-stepguidetodevelopingyourown2Dgames.PacktPublishing.304s.
Freeman,A.,2011.TheDefinitiveGuidetoHTML5.Apress.1053s.
Lubbers,P.,Albers,B.,Salim,F.,&Pye,T.,2011.ProHTML5programming(pp.
107-133).NewYork,NY,USA::Apress.345s.
McInnis,B.,Shimizu,R.,Furukawa,H.,Fushimi,R.,Tanaka,R.,Kratzer,K.,2013.
HTML5GameProgrammingwithenchant.js.Apress.208s.
Parisi,T.,2012.WebGL:upandrunning.O'ReillyMedia,Inc..231s.
Rabin,S.,2002.AIGameProgrammingWisdom.CharlesRiverMedia.672s.
Schwab,B.,2009.AIgameengineprogramming.CengageLearning.741s.
Subagio,A.,2014.LearningConstruct2:Designandcreateyourownengaging,
extensibleandaddictivegameusingConstruct2.PacktPublishing.234s.
Beirne, D., 2007. Racing Game AI: An Investigation into AI Techniques for
MotorsportSimulationGames.UniversityofAbertayDundee.(pp.1-20).
BulitkoV.,Bjö rnssonY.,SturtevantN.R.,LawrenceR.,2011.Real-TimeHeuristic
Search for Pathfinding in Video Games. In Artificial Intelligence for
ComputerGames(pp.1-30).
Compton,K.,Mateas,M.,2006.ProceduralLevelDesignforPlatformGames.In
AIIDE(pp.109-111).
Kashyap,P.,2015.InvestigationintotheuseofHTML5gameenginestocreatea
responsive social educational game for children (Doctoral dissertation,
CharlesDarwinUniversity).
Autodesk
Inc.
2013.
Erişim
Tarihi:
01.06.2015.
http://gameware.autodesk.com/kynapse
Cowart,J.,2012.jsexmachina-finitestatemachinesinJavaScript.Github
Repository.ErişimTarihi:06.02.2015.
https://github.com/ifandelse/machina.js
106
CyntientInc.2015.ErişimTarihi:01.06.2015.http://www.cyntient.com/
ElSayad,S.Z.,Saad,Z.,2007.TherelationbetweentheAItechniqueand
ComputerGameAIsApplications.ErişimTarihi:10.10.2015.
https://www.academia.edu/165760/The_relation_between_the_AI_tech
nique_and_Computer_Game_AIs_Applications
Gordon,J.,2011.Afinitestatemachinejavascriptmicroframework.Github
Repository.ErişimTarihi:04.02.2015.
https://github.com/jakesgordon/javascript-state-machine
HavokInc.1998.ErişimTarihi:01.06.2015.http://www.havok.com/ai/
MasaGroup.2014.ErişimTarihi:01.06.2015.http://masagroup.biz/products/life/
Middleton,Z.,2002.CaseHistory:TheEvolutionofArtificialIntelligencein
ComputerGames.ErişimTarihi:20.05.2015.
http://web.stanford.edu/group/htgg/sts145papers/zmiddleton_2002_1.
pdf
MoonColliderLtd.2014.ErişimTarihi:01.06.2015.http://kythera.ai/
PathEngineInc.2004.ErişimTarihi:01.06.2015.http://www.pathengine.com/
RivalTheoryInc.2015.ErişimTarihi:01.06.2015.http://rivaltheory.com/rain/
Stall,M.,2006.Mybaby,thefinitestatemachine.ErişimTarihi:01.06.2015.
http://blogs.msdn.com/b/jmstall/archive/2006/09/13/baby-statemachine.aspx
Uslu,B.,2015a.DignityAI-AILibraryforHTML5Games.GithubRepository.
ErişimTarihi:01.10.2015.https://github.com/berkanuslu/dignityai
Uslu,B.,2015b.DignityAIDemo1:TanxAI.GithubRepository.ErişimTarihi:
01.10.2015.https://github.com/berkanuslu/dignity_tank
Wexler,J.,2002.ArtificialIntelligenceinGames:Alookatthesmartsbehind
LionheadStudio’s“BlackandWhite”andwhereitcanandwillgointhe
future.ErişimTarihi:10.05.2015.
http://www.cs.rochester.edu/~brown/242/assts/termprojs/games.pdf
Xu,X.,2011.Acomprehensivepath-findinglibraryforgridbasedgames.Github
Repository.ErişimTarihi:01.01.2015.
https://github.com/qiao/PathFinding.js
107
EKLER
EKA.DignityAIDetaylıSınıfDiagramı
108
EKA.DignityAIDetaylıSınıfDiagramı
109
ÖZGEÇMİŞ
AdıSoyadı
:BerkanUSLU
DoğumYeriveYılı :Senirkent,1987
MedeniHali
:Evli
YabancıDili
:İngilizce
E-posta
:[email protected]
EğitimDurumu
Lise
:IspartaAnadoluTeknikLisesi,BilgisayarYazılım,2005
Lisans
:SDÜ,TeknikEğitimFakültesi,Bilg.Sist.Öğretmenliği
MeslekiDeneyim
MicrosoftInnovationCenter
2009-2010
KodgrafOyunStüdyosu
2010-2012
SisoftSağlıkBilgiSistemleri
2012-2013
EskişehirOsmangaziÜniversitesi 2012-2013
BilgiTeknolojileriLtd.
2013-2014
InfolineBilgiTeknolojileri 2014-.......(halen)
Yayınları
Uslu, B., 2013. Android Tabanlı Mobil Uygulama Geliştirme. Kodlab Yayınevi,
Ankara.328s.
110
Download