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 :berkanuslu@gmail.com 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