• Sonuç bulunamadı

ROL YAPMA OYUNLARINDA BÖLÜMLERİN İŞLEMSEL ÜRETİMİ İÇİN TASARIM DESENLERİNİN UYGULANMASI

N/A
N/A
Protected

Academic year: 2022

Share "ROL YAPMA OYUNLARINDA BÖLÜMLERİN İŞLEMSEL ÜRETİMİ İÇİN TASARIM DESENLERİNİN UYGULANMASI"

Copied!
40
0
0

Yükleniyor.... (view fulltext now)

Tam metin

(1)

EGE ÜNİVERSİTESİ FEN BİLİMLERİ ENSTİTÜSÜ

(YÜKSEK LİSANS DÖNEM PROJESİ)

ROL YAPMA OYUNLARINDA BÖLÜMLERİN İŞLEMSEL ÜRETİMİ İÇİN TASARIM

DESENLERİNİN UYGULANMASI

Gökmen BALKAN

Proje Danışmanı: Doç. Dr. Geylani KARDAŞ

Uluslararası Bilgisayar Anabilim Dalı

Sunuş Tarihi: 22.01.2018

Bornova-İZMİR 2018

(2)
(3)

Gökmen BALKAN tarafından dönem projesi olarak sunulan “Rol Yapma Oyunlarında Bölümlerin İşlemsel Üretimi için Tasarım Desenlerinin Uygulanması” başlıklı bu çalışma E.Ü. Lisansüstü Eğitim ve Öğretim Yönetmeliği ile E.Ü. Fen Bilimleri Enstitüsü Eğitim ve Öğretim Yönergesi’nin ilgili hükümleri uyarınca tarafımızdan değerlendirilerek savunmaya değer bulunmuş ve 22 / 01 /2018 tarihinde yapılan proje savunma sınavında aday oybirliği ile başarılı bulunmuştur.

Jüri Üyeleri: İmza

Jüri Başkanı : Doç. Dr. Geylani KARDAŞ Raportör Üye : Doç. Dr. Müge SAYIT Üye : Yrd. Doç. Dr. Kaya OĞUZ

(4)
(5)

EGE ÜNİVERSİTESİ FEN BİLİMLERİ ENSTİTÜSÜ

ETİK KURALLARA UYGUNLUK BEYANI

EÜ Lisansüstü Eğitim ve Öğretim Yönetmeliğinin ilgili hükümleri uyarınca Tezsiz Yüksek Lisans Dönem Projesi olarak sunduğum “Rol Yapma Oyunlarında Bölümlerin İşlemsel Üretimi için Tasarım Desenlerinin Uygulanması” başlıklı bu tezin kendi çalışmam olduğunu, sunduğum tüm sonuç, doküman, bilgi ve belgeleri bizzat ve bu tez çalışması kapsamında elde ettiğimi, bu tez çalışmasıyla elde edilmeyen bütün bilgi ve yorumlara atıf yaptığımı ve bunları kaynaklar listesinde usulüne uygun olarak verdiğimi, tez çalışması ve yazımı sırasında patent ve telif haklarını ihlal edici bir davranışımın olmadığını, bu tezin herhangi bir bölümünü bu üniversite veya diğer bir üniversitede başka bir tez çalışması içinde sunmadığımı, bu tezin planlanmasından yazımına kadar bütün safhalarda bilimsel etik kurallarına uygun olarak davrandığımı ve aksinin ortaya çıkması durumunda her türlü yasal sonucu kabul edeceğimi beyan ederim.

22 / 01 / 2018

İmzası

Gökmen BALKAN

(6)
(7)

ÖZET

ROL YAPMA OYUNLARINDA BÖLÜMLERİN İŞLEMSEL ÜRETİMİ İÇİN TASARIM DESENLERİNİN UYGULANMASI

BALKAN, Gökmen

Yüksek Lisans Dönem Projesi, Uluslararası Bilgisayar Anabilim Dalı (TEZSİZ) Danışmanı: Doç. Dr. Geylani KARDAŞ

Ocak 2018, 24 Sayfa

Günümüzde video oyunlarına olan ilginin artmasıyla birlikte, farklı zevklere sahip oyuncular da artmış ve çok çeşitli oyunlar türemiştir. Ayrıca oyuncular daha uzun süreli ve kendilerine daha çok içerik sunan oyunlar talep etmektedir. Fakat oluşan bu arzın giderilebilmesi için içerik geliştirilmesi oldukça maliyetli ve yavaş bir süreçtir. İçerik üreten algoritmalar kullanılarak oyun içeriğinin otomatik oluşturulması ile daha uzun oynanış süreleri sunulabilmesi ve oyunların yeniden oynanabilirliğinin arttırılması sağlanabilmektedir. Bu algoritmaların yazılım tasarım desenlerini kullanması, yönetimlerini ve geliştirilmelerini daha rahat hale getirecektir.

Bu projede tasarım desenleri kullanılarak, işlemsel bölüm üretimi ile bölümlerin oluşturulduğu bir rol yapma oyunu geliştirilmiştir. Bu sayede geliştirilen oyun, kod düzenlemesine açık ve yeni içerik eklenmesine direnç göstermeyen bir yapıya sahip olmuştur.

Anahtar Kelimeler: Rol Yapma Oyunları, Tasarım Desenleri, İşlemsel İçerik Üretimi

(8)
(9)

ABSTRACT

APPLYING DESIGN PATTERNS TO PROCEDURAL GENERATION OF LEVELS IN ROLE PLAYING GAMES

BALKAN, Gökmen

MSc in Computer Engineering Supervisor: Prof. Dr. Geylani KARDAŞ

January 2018, 24 Pages

Nowadays, with the increasing interest in video games, the number of gamers with different tastes have also increased, and a wide range of video games have emerged. Furthermore, gamers expect video games to be longer by providing more content. However, generating content to meet these expectations is a costly and slow process. With content generating algorithms, longer play times can be offered and reusability of the games can be increased by automatically generating game content. If these algorithms use software design patterns, their manageability and development will be more easy.

In this project, a role playing game, in which levels are generated by procedural content generation, was developed using software desing patterns. In this way, the developed game has a structure that is open to refactoring and to addition of new content.

Keywords: Role Playing Games, Design Patterns, Procedural Content Generation

(10)
(11)

TEŞEKKÜR

Bu çalışmada, bilgi ve deneyimlerini benimle paylaşan proje danışmanım Doç. Dr. Geylani Kardaş’a, çalışmam boyunca her türlü destek ve yardımlarıyla her zaman yanımda olan Yrd. Doç. Dr. Kaya Oğuz’a, eğitim hayatım boyunca her zaman yanımda olan ve büyük bir özveride bulunarak desteğini esirgemeyen anneme çok teşekkür ederim.

(12)
(13)

İÇİNDEKİLER

Sayfa

ÖZET ... vii

ABSTRACT ... ix

TEŞEKKÜR ... xi

İÇİNDEKİLER ... xiii

ŞEKİLLER DİZİNİ ... xv

1. GİRİŞ ... 1

2. ALTYAPI ... 4

2.1 İlgili Çalışmalar ... 4

2.2 İşlemsel Bölüm Üretimi ... 6

2.2.1 Alan bölümlendirme ... 6

2.2.2 Etmen tabanlı harita üretimi ... 7

2.2.3 Cellular automata ... 8

2.2.4 Gramer tabanlı harita üretimi... 9

2.3 Tasarım Desenleri ... 10

2.3.1 Komut deseni ... 10

2.3.2 Fabrika deseni ... 11

2.3.3 Kompozit deseni ... 11

2.3.4 Durum deseni ... 12

2.4 Java Swing ve 2 Boyutlu Grafik Kütüphaneleri ... 13

3. SİSTEM MİMARİSİ ... 14

3.1 Alan Bölümlendirme Algoritması ... 14

3.2 Oyuncunun Karakteri ve Kontrolü ... 16

3.3 Düşmanlar ve Hareketleri ... 17

4. UYGULAMA ... 19

5. SONUÇ ... 21

KAYNAKLAR DİZİNİ ... 22

ÖZGEÇMİŞ ... 24

(14)

xiv

(15)

ŞEKİLLER

DİZİNİ

Şekil Sayfa

1.1 Warzone 2100 oyununun bölüm tasarlama aracı ... 2

2.1 Lavender’in algoritması ile üretilen görev çizgesi ve harita ... 5

2.2 Alan bölümlendirme yönteminin bölümleri oluşturması ... 6

2.3 Alan bölümlendirme yönteminin haritayı oluşturması ... 7

2.4 Etmen tabanlı harita üretimi ... 8

2.5 “Cellular automata” başlangıç durumu ve sonuç ... 8

2.6 Gramer çizgesi ve karşılık geldiği harita ... 9

2.7 Komut deseninin yapısı ... 10

2.8 Fabrika deseninin yapısı ... 11

2.9 Kompozit deseninin yapısı ... 12

2.10 Durum deseninin yapısı ... 12

3.1 Alan bölümlendirme sisteminin yapısı ... 16

3.2 Oyuncunun karakteri ve komut sınıfları ... 17

3.3 Düşman ve durum sınıfları ... 18

4.1 Oyunun başlangıcı ... 19

4.2 Oyundan bir sahne ... 20

(16)
(17)

1. GİRİŞ

Koster (2004), video oyunlarını “Oyunculara zamanla öğrendikleri ve nihayetinde ustalaştıkları, zorluğu gittikçe artan düzen dizeleri sunan, interaktif deneyimler” olarak tanımlamıştır. Video oyunları 1970’lerde Pong ve Space Invaders gibi basit sayılabilecek örneklerle popülerlik kazanmaya başlamıştır.

Zaman geçtikçe ve popülerlikleri arttıkça, video oyunları çok büyük bir gelişim göstermiştir. Oyunların sayısı arttıkça, oyunlarda sunulan özellikler ve bunların sunuluş biçimlerinde farklılaşmalar oluşmuştur. Bu farklılaşmalar sonrasında, oyunlar benzerliklerine göre gruplandırılmıştır. Bu gruplandırma da oyun türü kavramını doğurmuştur.

Fakat oyun türlerindeki bu değişikliklere rağmen, oyunların geliştirilmesi sırasında benzer adımlar kullanılmaktadır (Morrison, 2003). Bunlar şu şekilde özetlenebilir; temel fikrin oluşturulması, oyunun konseptinin kesinleştirilmesi, hikayenin oluşturulması, oyun mekaniklerinin programlanması, görsellerin tasarlanması, seslerin tasarlanması ve bölümlerin tasarlanması.

Video oyunları, zorlayıcı görevler içeren, bir grup bileşenden oluşan sistemlerdir. Oyun geliştirilmesinin temelinde programlama bulunmaktadır. Oyun kontrol mekanizmasının oluşturulması, ses ve görüntü öğelerinin sunulması, oyun mekaniklerinin kodlanması, kısacası oyun geliştirilmesinin neredeyse her adımında programlama gerekmektedir. Bir diğer önemli unsur görselliktir.

Özellikle son dönemlerde büyük bir önem kazanmıştır. Yeni çıkan oyunlarda, oyun görselleri ile gerçek dünya resimlerini ayırmak bazen mümkün olmamaktadır. Bu görsellerin oluşturulması da, oyunda yavaşlık hissettirmeden ekrana çizdirecek yöntemlerin kodlanması da zor görevlerdir. Oyuncu olmayan karakterleri yönetecek yapay zekanın inandırıcı olacak şekilde tasarlanması, oyun kontrollerinin kullanıcı dostu tasarlanması, müziklerin oluşturulup, sahneye uygun duyguyu yaratacak müziklerin kullanılması gibi pek çok zorlu görevler bulunmaktadır. Oyun geliştirilirken birçok alanı kapsayan ve beceri isteyen problemlerle uğraşılmaktadır. Bu nedenle de üst seviye oyunların çıkartılması için farklı konularda uzman birçok insanın bulunduğu gruplara ihtiyaç duyulmaktadır.

(18)

2

Bölüm tasarımının önemi, oyunun süresini ve oyuncuya sunulacak içerik miktarını doğrudan etkilemesinden kaynaklanmaktadır. Oyuncuları tatmin edecek içerik miktarının oluşturulması, geleneksel yöntemler kullanılarak yapılırsa, oldukça fazla iş gücü ve kaynağa ihtiyaç duyacaktır. Şekil 1.1’de, Warzone 2100 isimli strateji oyununda kullanılan bölüm tasarlama aracı görülmektedir. Bu tarz araçlar ile bölüm tasarlanması için, bölüm tasarımcılarının oyunda kullanılan her bir objeyi yerine koyması gerekmektedir. Bu yöntemin bir dezavantajı da, geliştirilme aşamasında hazırlanıp, oyuna eklenen içerik, oyunun boyutunun artmasına da sebep olacaktır.

Şekil 1.1 Warzone 2100 oyununun bölüm tasarlama aracı (Wikipedia 1, 2017)

Bu nedenle bölümlerin otomatik oluşturulması için çalışmalar yapılmaktadır. Bu sistemler sayesinde, bölümler oynama esnasında kurgulanarak oyuncuya sınırsız içerik sunulabilmektedir. İçeriğin her oyunda rastlantısal olarak üretilmesi, oyunların tekrar oynanabilirliğini de büyük ölçüde arttırmaktadır.

Ayrıca oyuncunun oynama şekline uyum sağlayıp, zorluk seviyesini oyuncuya göre ayarlayan yapılarla, oyunun eğlence faktörünün arttırılması mümkündür

(19)

(Yannakakis, 2011). İşlemsel bölüm üretimi sistemlerinin faydalarını anlayan birçok oyun geliştiricis şimdiden oyunlarında bu algoritmalardan yararlanmıştır (Linden et al., 2014).

Hazırlanan projede, bölümlerin işlemsel üretildiği bir rol yapma oyunu geliştirilmiştir. İşlemsel üretim algoritmasının oluşturulmasında ve oyunun genel tasarımında, tasarım desenleri (Gamma et al., 1994) kullanılarak, kodun yönetilmesini kolaylaştıracak ve sonradan yapılacak yeni geliştirmelerde direnç göstermeyecek bir yapı oluşturulmuştur.

Raporun ikinci bölümünde önceki çalışmalardan bahsedilmiştir. Ayrıca bölümlerin işlemsel üretilmesi için kullanılan teknikler ve geliştirilen oyunda kullanılan tasarım desenleri anlatılmıştır. Üçüncü bölümde hazırlanan oyuna ait yazılımın analiz ve tasarımı yer almaktadır. Dördüncü bölümde ise projenin tasarımının, koda dönüştürülme süreci anlatılmıştır. Son bölümde sonuçlar sunulmuştur.

(20)

4

2. ALTYAPI

Bu bölümde, ilk olarak oyun bölümlerinin işlemsel üretimi hakkında önceden yapılmış çalışmalardan bahsedilecektir. Ayrıca rol yapma oyunlarında kullanılan işlemsel üretim algoritmalarından ve projenin gerçeklenmesi sürecinde kullanılan tasarım desenlerinden bahsedilecektir. Son olarak geliştirilen oyunda kullanılan Swing arayüz tasarım bileşenlerinden ve Java dilinin standart 2 boyutlu grafik kütüphanesinden bahsedilecektir.

2.1 İlgili Çalışmalar

Adams (2002), çalışmasında “graph grammar” tekniğini kullanarak bölümlerin otomatik üretilmesini sağlayan bir algoritma geliştirmiştir. “Graph grammar” tekniğinde, harita bir çizge olarak ifade edilir. Önceden belirlenmiş dönüşüm kuralları bulunmaktadır. Bu kurallara göre dönüşümler uygulanarak, başlangıçta verilen çizgeden yeni bir çizge elde edilir. Bu çizgeye göre de harita oluşturulur. Geliştirilen algoritma ile üretilecek bölümün boyut ve zorluk seviyesi algoritmaya parametre olarak verilebilmektedir.

Johnson et al. (2010), yaptıkları çalışmada “cellular automata” tekniğini kullanarak, Diablo oyunundakine (Wikipedia 2, 2017) benzer, mağara görünümünde bölümler üreten bir algoritma geliştirmişlerdir. “Cellular automata”

yönteminde, başlangıç durumu ve önceden tanımlı kurallar gerekmektedir.

Algoritma her turda kurallara bakarak harita hücrelerinin alacağı duruma karar verir. Belli bir süre çalıştıktan sonra mağara görünümünde harita elde edilir.

Dormans (2010), aksiyon-macera türü oyunların bölüm tasarımını yapabilen bir işlemsel bölüm üretimi algoritması geliştirmiştir. Geliştirilen algoritma ilk olarak bölümde gerçekleştirilecek görevlerin çizgesini oluşturur. Bu çizgenin oluşturulması için “generative grammar” tekniği kullanılır. Daha sonrasında bu bilgiden bölümün haritası oluşturulmaktdır.

Togelius et al. (2012), çeşitli işlemsel bölüm üretimi algoritmalarını incelemişlerdir. Çalışma sonucunda hepsinin iyi ve kötü yönlerinin bulunduğu

(21)

belirtilmiştir ve birden çok algoritmadan faydalanan hibrid sistemler üretilerek, olumsuz özelliklerin azaltılabileceği savunulmuştur.

Lavender (2015), “generative grammars” tekniğini kullanarak aksiyon- macera oyunları için bölüm üreten bir algoritma geliştirmiştir. Çalışmanın bir çıktısı olarak, bu algoritmanın sonucunu kullanan Zelda (Wikipedia 3, 2017) benzeri bir oyun geliştirilmiştir. Şekil 2.1’de Lavender’in algoritması ile oluşturulan görev çizgesi ve buna karşılık üretilecek oyun haritası görülmektedir.

Yapılan çalışmada, yukarıda bahsedilen çalışmalardan farklı olarak, işlemsel bölüm üretimi için “alan bölümlendirme” tekniği kullanılmıştır. Eski çalışmaların birçoğu, oyun geliştirilmesi kısmını göz ardı edip, bölüm üretimine odaklanmışlardır. Bu çalışmada, geliştirilen algoritmayı kullanan rol yapma oyunu geliştirilmiştir. “Alan bölümlendirme” tekniğinin, zindan temelli rol yapma oyunları için, bölüm üretilmesine uygun olduğu gösterilmiştir.

Şekil 2.1 Lavender’in algoritması ile üretilen görev çizgesi ve harita (Lavender, 2015)

(22)

6

2.2 İşlemsel Bölüm Üretimi

İşlemsel bölüm üretimi, bilgisayar oyunlarında, oyunun içeriğinin otomatik olarak üretilmesini belirtir. İşlemsel bölüm üretimi için, bazıları üretilecek oyun türüne bağlı olan, çeşitli yöntemler kullanılmaktadır. Bu bölümde Rogue-benzeri rol yapma oyunları için kullanılabilen en yaygın algoritmalardan bahsedilecektir.

2.2.1 Alan bölümlendirme

Bu yöntem, adından da anlaşılacağı üzere haritayı bölümlere ayırarak çalışır. Oyun alanı, özyinelemeli olarak, her adımda daha ufak parçalara bölünerek, arzu edilen büyüklükteki bölümler oluşturulur. Bu işlemler sonucunda oluşan bölümler bir ağaç yapısı oluşturur. Bu ağacın her bir yaprağı için, oda boyutu ve içereceği objeler oluşturulur. Son olarak ta odalar arasında koridorlar eklenerek tüm haritanın birleştirilmesi sağlanır.

Şekil 2.2 Alan bölümlendirme yönteminin bölümleri oluşturması (Shaker et al., 2016)

(23)

Şekil 2.2 ve Şekil 2.3’te alanın bölümlendirilmesi ve haritanın oluşturulması gösterilmiştir.

Şekil 2.3 Alan bölümlendirme yönteminin haritayı oluşturması (Shaker et al., 2016)

2.2.2 Etmen tabanlı harita üretimi

Bu yöntem, insan yapımı gibi duran zindanlar üreten, alan bölümlendirme yönteminin aksine daha doğal, mağara görünümlü alanlar üretmektedir. Oluşan harita, büyük oranda etmenin (ing. agent) davranışının nasıl kodlandığına bağlı olacaktır. Anlık karar alan bir etmen ile oldukça karmaşık, işlevsel olmayan haritalar üretilebilebilir. Önceki adımlarını ve birkaç adım sonrasını göz önünde bulunduran etmen ile daha düzenli bir harita oluşturulabilir. Şekil 2.4’te basit bir etmen tabanlı harita oluşturulması görülmektedir.

(24)

8

Şekil 2.4 Etmen tabanlı harita üretimi (Shaker et al., 2016)

2.2.3 Cellular automata

Bu yöntem, iki boyutlu matrisler üzerinde çalışmaya daha uygundur.

Başlangıç durumu ayarlanıp algoritma başlatıldıktan sonra, kodlanan dönüşüm kurallarına göre hücrelerin durumları belirlenir. Hücre değişimleri durduktan sonra veya algoritmanın arzu edilen sayıda tur çalışması sağlandıktan sonra, mağara benzeri harita elde edilir. Şekil 2.5’te “cellular automata” algoritmasında kullanılan haritanın başlangıç durumu ve çalışma sonucunda ortaya çıkan harita görülmektedir.

Şekil 2.5 “Cellular automata” başlangıç durumu ve sonuç (Johnson et al., 2010)

(25)

2.2.4 Gramer tabanlı harita üretimi

Gramer çizgeleri aslında dil işlemede kullanılan algoritmalardır.

Tanımlanan kuralları kullanarak, küçük yapılardan daha büyük yapıların oluşturulmasını sağlar. İlk olarak, oluşacak bölümde bulunmasını istediğimiz elemanları içeren basit bir çizge oluşturulur. Algoritma bu çizge üzerinde çalışarak, hangi elemanların neye dönüşeceğini kontrol ederek, bu dönüşümleri yapar. Arzu edilen bir bölüm oluşunca veya belli bir süre sonra algoritmanın çalışması sonlandırılarak bölümün çizgesi elde edilir. Son olarak bu çizgeden oyunda kullanılacak haritanın oluşturulması gerekir. Şekil 2.6’da oluşturulması tamamlanmış bir çizge ve buna karşılık gelen oyun haritası görülebilir. Şekildeki çizge sadece Start ve End elemanlarını içeren oldukça basit bir çizge olarak başlayıp, kurallarda belirtilen değişimler sonucunda resimde görülen halini almış olabilir.

Şekil 2.6 Gramer çizgesi ve karşılık geldiği harita (Linden et al., 2014)

(26)

10

2.3 Tasarım Desenleri

Tasarım desenleri (Gamma et al., 1994), yazılım geliştirilmesi sırasında sıklıkla karşılaşılan sorunlara çözüm üretmesi amacıyla oluşturulmuş yapılardır.

Nesne tabanlı programlama prensiplerine uygundurlar. Kodun tekrar kullanılabilirliğini arttırırlar. Çeşitli sorunlara çözüm üreten birçok tasarım deseni bulunmaktadır. Aşağıda bu projenin geliştirilmesi sırasında kullanılan bazı desenler anlatılmıştır.

2.3.1 Komut deseni

Bu desen, yapılacak işlemleri nesne olarak temsil etmeyi sağlar. Bu sayede işlemler sıraya alınıp, istenildiği zamanda çalıştırılması sağlanabilir. Hatta, uygun şekilde tasarlanırsa, işlemleri geri alınabilir halde tanımlamak bile mümkün olabilir. İçerisinde “execute method”’u dışında birşey bulunmayan soyut, komut sınıfı yaratılır. Bu sınıftan somut bir sınıf türetilip, “execute method”’u içerisinde o komutun gerçekleştireceği işlem yapılır. Daha sonra işlem yapılacağı sırada somut komut sınıfından bir nesne türetilip, alıcıya gönderilmesi yeterlidir. Şekil 2.7’de komut deseninin yapısı görülmektedir.

Şekil 2.7 Komut deseninin yapısı (Gamma et al., 1994)

(27)

2.3.2 Fabrika deseni

Bu desen ile objenin oluşturulması işlemi bir sınıfa yüklenir. Nesne üretiminden sorumlu sınıfta, nesneleri üretecek bir metod bulunur. Buraya gönderilen parametre ile ne üretilmesi istendiği belirtilir. Nesneyi ürettikten sonra, ürünlerin ortak ana sınıfı tipinde dönüş yapar. Bir diğer çalışma şekli de, nesne üreten birden fazla sınıf yaratarak, metoda parametre göndermek yerine istenen nesneye özgü fabrika sınıf yaratılır. Bu fabrikadan da sadece tek tip nesne üretimi gerçekleşebilir. Şekil 2.8’de fabrika deseninin yapısı görülmektedir.

Şekil 2.8 Fabrika deseninin yapısı (Gamma et al., 1994)

2.3.3 Kompozit deseni

Bu desen, nesneleri ağaç yapısında oluşturarak parça bütün ilişkisini kurmak için geliştirilmiştir. Ayrıca bu deseni kullanarak tek başına duran objeler ve birden fazla objeden oluşmuş kompozit objelerin beraber yönetilmesi kolaylaştırılmıştır. En yaygın kullanımı program arayüzlerinde görülmektedir.

Tek başına bulunan metin editörü, onay kutusu benzeri objelerin bulunduğu gibi, bu parçaları içeren panel benzeri kompozit objeler yaratılıp, beraber yönetilebilir.

Şekil 2.9’da kompozit deseninin yapısı görülmektedir.

(28)

12

Şekil 2.9 Kompozit deseninin yapısı (Gamma et al., 1994)

2.3.4 Durum deseni

Bu desen, nesnelerin çalışma şeklinin, bulundukları duruma göre değişmesini sağlamak için geliştirilmiştir. Bir kapıyı nesne olarak ele alırsak; kapı açık durumdayken onunla yapılabilecek bir takım işlemler bulunmaktadır.

Kapıdan geçilebilir, diğer tarafta ne var diye bakılabilir veya kapı kapatılarak kapalı durumuna geçmesi sağlanır. Kapalı durumdayken bu işlemler yapılamaz, onun yerine kapı çalınabilir veya açılabilir. Anlatılan bu duruma benzer koşullarda, durum deseni kullanılması gereklidir. Şekil 2.10’da durum deseninin yapısı görülmektedir.

Şekil 2.10 Durum deseninin yapısı (Gamma et al., 1994)

(29)

2.4 Java Swing ve 2 Boyutlu Grafik Kütüphaneleri

Java Swing (Wikipedia 4, 2017) kütüphanesi kullanıcı arayüzü tasarlanması için geliştirilmiş bir kütüphanedir. İçerisinde düğmelerden, panellere, seçim kutularından, metin editörlerine, Java programlarında görülen birçok çeşit bileşen içerir. Bu projede en çok kullanılan bileşen diğer bileşenleri gruplaması için kullanılan JPanel bileşenidir. JPanel bileşeni özelleştirilerek, haritalar ve kontrol paneli bölümleri oluşturulmuştur. JPanel’in çizim metodu değiştirilmiş ve Java’nın 2 boyutlu grafik kütüphanesi kullanılarak, haritaların çizimi sağlanmıştır.

Java 2 boyutlu grafik kütüphanesi, adından da anlaşılacağı üzere 2 boyutlu çizim yapmak için kullanılır. Kütüphanenin içinde basit grafik şekillerini çizmek için metodlar bulunur. Ayrıca resim çizme ve resim üzerinde basit düzenleme işlemleri yapılması da mümkündür. Java Swing arayüzü de arka planda bu kütüpheneyi kullanarak bileşenleri ekrana çizdirir. Projede bu kütüphanede bulunan “drawRect” ve “drawImage” metodları kullanılarak, haritayı oluşturan panellerin görünümü değiştirilmiştir.

Swing kütüphanesinde, “Listener” olarak isimlendirilen, arayüz bileşeninde oluşan belli durumları dinleyen sınıflar bulunmaktadır. Bu sınıflar kullanılarak metin editöründeki değer değiştirildiğinde, uygulamada odaklanılan bileşen istediğimiz bir bileşen olduğunda, bir bileşenin üzerine tıklanıldığında ve daha pek çok farklı durumdan haberdar olunup, karşılık olarak belli bir kod bloğu çalıştırılabilmektedir. Bunun için yapılması gereken, takip edilecek olayı dinlemek için istenen türde bir “Listener” nesnesi yaratılır. Bu nesne dinlemek istenilen bileşenin takipçisi olarak kaydedilir. Geliştirilen oyunda, kullanıcı kontrol düğmelerinde de bu yapı kullanılmıştır. Düğmelere, tıklanma olayını algılayabilecek “ActionListener” nesneleri bağlanıp, düğmeler tıklandığında tetiklenen “ActionListener” içerisinde, ilgili düğmeye bağlı komut nesnesi çalıştırılmıştır.

(30)

14

3. SİSTEM MİMARİSİ

Projede, tasarım desenlerinden faydalanılarak, alan bölümlendirme algoritması ile bölümlerin oluşturulduğu bir rol yapma oyunu geliştirilmiştir.

Geliştirilen oyunda, karakter canavarların olduğu bir zindandan kurtulmaya çalışmaktadır. Bölüm başında, harita ve düşmanlar rastlantısal olarak yaratılır.

Oyuncu, düşmanları öldürerek veya onlardan kaçarak, bir sonraki bölüme geçişi sağlayan merdivenleri bulmaya çalışır. Ölmeden, son bölümden kaçılırsa oyun sonlanmaktadır. Oyunun geliştirilmesi sırasında tasarlanan önemli yapılar aşağıda anlatılmıştır.

3.1 Alan Bölümlendirme Algoritması

Alan bölümlendirme algoritmasının tasarlanması aşamasında kompozit tasarım deseninden faydalanılmıştır. Alan bölümlendirme yönteminde, harita özyinelemeli olarak daha küçük parçalara bölünmektedir. Bu bölümlerin ağaç yapısında oluşması ve birbirleri arasında parça bütün ilişkisi içermeleri, kompozit deseninin kullanılmasına olanak tanımaktadır. Algoritma tasarlanırken kompozit deseninin gerektirdiği 3 sınıf yaratılmıştır.

Kompozit ve yaprak nesnelerin türeyeceği “Area” sınıfı tanımlanmıştır. Bu sınıf, haritada ister tek bir oda olsun, isterse birden fazla odayı barındıran bir küme olsun, tüm harita bölümlerinin sahip olması gereken özellikleri içermektedir. Ayrıca kompozit ve yaprak nesnelerinin özelleştirmeleri için bazı soyut metodlar içermektedir. İçerdiği özellikler başlangıç koordinatları ve alanın boyutlarını belirten genişlik ve yükseklik değerleridir. Kendisinden türeyen sınıfların özelleştirmesi için de “generateDungeon”, “fillMap” ve

“getClosestPoint” metodlarını içerir.

Kompozit deseninin yaprak sınıfı olarak, “Room” sınıfı yaratılmıştır. Bu sınıf “Area” sınıfından türemektedir. Bu nedenle belli bir başlangıç koordinatına, genişlik ve yükseklik değerlerine sahiptir. “Area” sınıfından gelen

“generateDungeon” metodunu özelleştirerek, kendi kapladığı alana sığabilecek

(31)

boyutta, rastlantısal bir oda oluşturur. “FillMap” metodu özelleştirilerek, odanın içerisinde bulunacak giriş merdiveni, çıkış merdiveni, düşmanlar ve ödüller gibi objeler oluşturulur. Bunların eklenip, eklenmeyeceği veya ne kadar çok olacakları rastlantısal olarak belirlenir. Ekranın çizim aşamasında kolaylık sağlaması için yarattığı nesneler harita bilgisinin tutulduğu iki boyutlu matrise aktarılır. Son metodu olan “getClosestPoint” metodu içersinde, parametre olarak verilen koordinatlara en yakın nokta bulunup, geriye uzaklık değeri ile döndürülür.

Sistemi karmaşıklaştırmamak için en yakın noktanın merkez noktası olduğu varsayılmaktadır. Bu nedenle geriye odanın merkez koordinatlarını ve merkezinin, parametre olarak gelen koordinata olan uzaklığı döndürülür.

Kompozit sınıf olarak tasarlanan “Dungeon” sınıfı, kendi barındırdığı alanların listesini tutmaktadır. “Area” sınıfından gelen “generateDungeon”

sınıfında kendisini yatay veya dikey eksende ikiye böler. Eğer oluşan parçalar aranan kriterlere uyuyorsa bu alanları kendisinin alt alanları olarak kaydeder.

Daha sonrasında bu alt alanların “generateDungeon” metodları çağırılarak, haritanın tamamen oluşması sağlanır. Son olarak, oluşan bu alt alanların birbirlerine en yakın noktalarını bularak, bu alanları koridorlar ile birleştirir.

“FillMap” metodunda, sadece kendi alt alanları için “fillMap” metodlarını çağırır.

Bu işlem özyinelemeli olarak en alt seviyeye kadar iner ve tüm odaların doldurulması sağlanmış olur. “GetClosestPoint” metodu içerisinde, parametre olarak gelen koordinatları bütün çocuklarına göndererek, en yakın mesafelerini hesaplamaları istenir. Mesafesi en kısa olan koordinat bilgisi, verilen koordinata en yakın olarak alınır.

Şekil 3.1’de alan bölümlendirmesi için oluşturulan kompozit yapının sınıf diyagramı görülmektedir.

(32)

16

Şekil 3.1 Alan bölümlendirme sisteminin yapısı

3.2 Oyuncunun Karakteri ve Kontrolü

Geliştirilen oyundaki düşmalar ve oyuncu karakteri “Character” isimli soyut sınıftan türemektedir. Bu sınıftaki bir değişkende nesnenin konumu tutulur.

Ayrıca kontrol komutlarının kullanacağı, dört temel yönde yürüme metodları bulunmaktadır. Bu metodlar, nesnenin konumunu ilgili yönde ilerletir. Oyuncu karakteri, “Character” sınıfından türetilen “Player” sınıfıdır.

Oyuncu karakterinin yönetilmesi için, ekrana kontrol paneli eklenmiştir.

Bu panelin geliştirilmesi sırasında Java Swing ve 2 boytlu grafik kütüphaneleri kullanılmıştır. Bu panelde karakteri yürütmek için dört yön tuşu bulunmaktadır.

Bu düğmelere bağlanan hareket komutları, ilgili düğmelerin tıklanması anında tetiklenir.

(33)

Hareket komutları, komut deseni ile tasarlanmıştır. Bütün komutlar

“Command interface”’ini implemente etmektedir. Düğmelere bağlanan hareket komutları, yapıcı metodlarına geçilen karakter nesnesini belirtilen doğrultuda ilerletir. Şekil 3.2’de player sınıfı ve kullanılan komut sınıflarının diyagramı görülmektedir.

Şekil 3.2 Oyuncunun karakteri ve komut sınıfları

3.3 Düşmanlar ve Hareketleri

Düşmanlar, oyuncu karakteri gibi, “Character” sınıfından türemektedir.

Böylece, bu sınıfta tanımlı, konum değişkenine ve hareket metodlarına sahip olurlar. Ayrıca harita üzerinde yürümelerini sağlamak için oyuncu karakterinde kullandığımız komutları kullanabiliriz. Düşmanları temsil eden “Enemy”

sınıfında, oyuncuyu ne kadar uzaktan tespit edebildiklerini belirleyen,

“senseDistance” değişkeni bulunmaktadır. Ek olarak, düşmanın durumunu tutan

“currentState” değişkeni vardır.

Oyunda iki farklı tipte düşman bulunmaktadır. Basit seviyedeki düşman tipi olan “Snake” ve koku duyusu keskin olduğu için, oyuncuyu daha uzaktan hissedebilen “Wolf” sınıfları vardır. Odaların doldurulması aşamasında, her bir

(34)

18

odaya kaç düşman eklenceği rastlantısal olarak belirlenir. “EnemyFactory”

sınıfındaki “createEnemy” metodu ile bir düşman yaratılarak geri döndürülür.

Düşmanların hareketleri durum deseni ile kontrol edilir. Bu yapı için, içinde sadece boş “update” metodu bulunan, soyut “State” sınıfı tanımlanmıştır.

Bu sınıftan türeyen iki farklı durum sınıfı bulunmaktadır. Bunlardan ilki, düşmanın haritada gezinmesi durumunu yöneten “WanderState” sınıfıdır. Bu durum, “update” metodu içerisinde, her turun başında yön değiştirilip, değiştirilmeyeceğini kontrol eder ve rastlantısal bir yön belirler. Düşmanın seçilen doğrultuda ilerlemesi için komut verir. Son olarak ta oyuncu karakteri ile mesafesine bakar. Eğer hissedebileceği mesafenin içindeyse, düşmanın durumu

“AttackState”’ine geçirilir. “AttackState”’i, “update” metodu içerisinde, oyuncunun konumuna bakar ve ona doğru ilerler. Oyuncuya yaklaştığında saldırı yapar. Eğer hissedebileceği mesafenin üzerine çıkılırsa, düşmanın durumu

“WanderState”’e geri çekilir. Şekil 3.3’te düşman sınıfı ve durum sınıflarının yapısı görülmektedir.

Şekil 3.3 Düşman ve durum sınıfları

(35)

4. UYGULAMA

Tasarlanan oyun Java Swing kütüphanesini kullanan, bir form uygulaması olarak geliştirilmiştir. Uygulama ilk başlatıldığında, şimdiki bölüm hakkında bilgileri tutan “CurrentLevel” sınıfından bir örnek (ing. instance) almaktadır. Bu sınıfın, “generateNewLevel” metodu çağırılmakta; bu metotta, bölüm sıfırlanıp,

“Dungeon” sınıfından nesne yaratılmaktadır. Sonrasında bu nesnenin

“generateDungeon” ve “fillMap” metodları çağırılarak yeni bölüm oluşturulması tamamlanmaktadır.

Yeni bölüm yaratıldıktan sonra, ekranda gözükecek bileşenler hazırlanır ve arayüze eklenir. Ana harita ve ekranın sağ üst köşesindeki ufak harita, JPanel bileşeninden türetilmiştir. “PaintComponent” metodu özelleştirilerek, iki boyutlu grafik kütüphanesi ile “CurrentLevel” nesnesindeki bilgiler ekrana çizilir. Şekil 4.1’de oyunun başlangıç durumundaki hali görülmektedir.

Şekil 4.1 Oyunun başlangıcı

(36)

20

Oyun döngüsünü basit tutmak ve iş parçacıklarının (ing. thread) bekletilmesi veya boşa çalışması sorunlarıyla uğraşmamak için farklı bir yapı kurulmuştur. Sağ panelde bulunan kontrol tuşları ile karaktere ilerleme komutları iletilir. Bu düğmelere tıklandığında, arayüze oyuncunun hamlesini tamamladığı sinyali gönderilir. Arayüz, “CurrentLevel” nesnesinin “gameLoop” metodunu çağırarak, o turda gerçekleşmesi gereken diğer olaylar çağırılır. “GameLoop”

metodu içerisinde oyuncunun bir sonraki seviyeye geçen merdivenlere ulaşıp, ulaşamadığı kontrol edilir. Eğer merdivenlere varıldıysa, yeni bölüm oluşturulur.

Bu kontrolden sonra düşman nesneleri dönülerek, mevcut durumlarına göre davranışları gerçekleştirilir. Son olarak, ekran yenilenerek, bölümün son durumu ekrana çizilir. Şekil 4.2’de oyundan bir sahne görülmektedir.

Şekil 4.2 Oyundan bir sahne

(37)

5. SONUÇ

Yapılan çalışmada, profesyonel iş dünyasında, büyük oyun stüdyolarının da oyunlarında kullandığı işlemsel bölüm üretimi algoritmaları araştırılmıştır.

Yaygın kullanılan bölüm üretimi algoritmaları incelenmiş ve nasıl gerçekleştirildikleri ve ne tür bölüm çıktıları verebildikleri raporlanmıştır.

Projenin başında amaçlanan, işlemsel bölüm üretimi algoritması ve bu algoritmayı kullanan oyun başarıyla gerçeklenmiştir.

Algoritma ve oyunun geliştirilmesi aşamasında, uygulama tasarım desenleri kullanılmıştır. Bu sayede, oyun kod düzenlemesine ve geliştirilmeye açık bir yapıda kodlanmıştır. Örneğin, düşmanların etrafta dolanma şekli değiştirilmek istenirse, sadece “WanderState” sınıfının, “update” metodu değiştirilerek, sistemin yapısına zarar verilmeden yeni bir gezinme algoritması uygulanabilir. Ya da kurtların, yılanlardan farklı davranış sergilemesi istenirse, değiştirmek istenilen durum sınıfından bir sınıf türeterek davranış çeşitlendirilmesi yapılabilir. Hatta gezinme ve saldırı durumları dışında farklı bir durum yapılması gerekirse dahi, yeni bir sınıf yaratıp, birkaç satırlık kod değişikliğiyle bu sağlanabilir.

Projenin bir diğer sonucu, oyunun geliştirilmesi sırasında farklı tasarım desenlerinin, alan bölümlendirilmeli işlemsel bölüm üretimi algoritmasının ve Java iki boyutlu grafik kütüphanesinin bir arada kullanılması ve deneyimlenmesidir. Kazanılan bu bilgi, dönem projesi raporu olarak ve https://github.com/gokova/dungeon_crawler adresinde açık kaynaklı uygulama olarak alanla ilgilenen ve daha sonra bu konular üzerinde çalışacak insanların kullanımına sunulmaktadır.

Bu projenin devamında, Yannakakis’in (2011) yöntemi kullanılarak, oyuncunun davranışlarına göre bölümlerin üretilmesi ve bu sayede oyundan alınan eğlence faktörünün arttırılması sağlanabilir. Oyuncu karakteri ve düşmanlara, güç, esneklik, dayanıklılık, vb. özellikler eklenerek, oyuna taktiksel derinlik eklenebilir. Oyuncuyu zorlayacak, tüm yeteneklerini kullanmasını gerektirecek, bölüm sonu canavarları eklenebilir.

(38)

22

KAYNAKLAR DİZİNİ

Adams, D., 2002, Automatic Generation of Dungeons for Computer Games, BSc Thesis, University of Sheffield, 60p.

Dormans, J., 2010, Adventures in Level Design: Generating Missions and Spaces for Action Adventure Games, PCGames ’10, 1:1-8pp.

Gamma, E., Vlissides, J., Johnson, R. and Helm, R., 1994, Design Patterns:

Elements of Reusable Object-Oriented Software, Pearson Education, New York, 395p.

Johnson, L., Yannakakis, G. N. and Togelius, J., 2010, Cellular Automata for Real-time Generation of Infinite Cave Levels, PCGames ’10, 10:1-4pp.

Koster, R., 2005, Theory of Fun for Game Design, O’Reilly Media, Inc, New York, 300p.

Lavender, B., 2015, The Zelda Dungeon Generator: Adopting Generative Grammars to Create Levels for Action-Adventure Games, BSc Thesis, University of Derby, 101p.

Linden, R. van der, Lopes, R. and Bidarra, R., 2014, Procedural Generation of Dungeons, IEEE Transactions on Computational Intelligence and AI in Games, 78-89pp.

Morrison, M., 2003, Sams Teach Yourself Game Programming in 24 Hours, Sams Publishing, New York, 512p.

Shaker, N., Liapis, A., Togelius, J., Lopes, R. and Bidarra, R., 2016, Constructive generation methods for dungeons and levels, 31-55, Procedural Content Generation in Games, Shaker, N., Togelius, J. and Nelson, M.J., New York, 237p.

Togelius, J., Justinussen, T. and Hartzen, A., 2012, Compositional Procedural Content Generation, PCG’12, 16:1-4pp.

Yannakakis, G. N. and Togelius, J., 2011, Experience-Driven Procedural Content Generation, IEEE Transactions on Affective Computing, 147- 161pp.

Wikipedia 1, “Level Design”, https://en.wikipedia.org/wiki/Level_design (Erişim tarihi: 25 Aralık 2017).

Wikipedia 2, “Diablo”, https://en.wikipedia.org/wiki/Diablo_(video_game) (Erişim tarihi: 25 Aralık 2017).

(39)

KAYNAKLAR DİZİNİ (devam)

Wikipedia 3, “The Legend of Zelda”,

https://en.wikipedia.org/wiki/The_Legend_of_Zelda (Erişim tarihi: 29 Aralık 2017).

Wikipedia 4, “Swing”, https://en.wikipedia.org/wiki/Swing_(Java) (Erişim tarihi: 02 Ocak 2018).

(40)

24

ÖZGEÇMİŞ

Gökmen BALKAN 1989 yılında İzmir’ de doğdu. 2006 yılında İzmir Sıdıka Rodop Lisesini bitirdi. 2014 yılında Süleyman Demirel Üniversitesi Bilgisayar Sistemleri Öğretmenliği bölümünden mezun oldu. 2015 yılında başladığı Ege Üniversitesi Uluslararası Bilgisayar Enstitüsü’ndeki 2. Öğretim tezsiz yüksek lisans eğitimine bu proje yazıldığı tarihte devam etmektedir.

Referanslar

Benzer Belgeler

ÖĞRENCİLER DAHA SONRA 6 (ALTI) ADET DERS SEÇTİKTEN SONRA ÖĞRENCİ NUMARALARI İLE HARÇ YATIRDIKTAN SONRA KESİNLEŞTERMİ İŞLEM YAPACAKLARDIR. YEDEK ADAYLAR, KESİN

4- Askerlik durum belgesini, (erkek adaylar için) 5-Kayıt bildirim formu (aşağıdaki matbu form) 6-Otomasyon kayıt formu (aşağıdaki matbu form).. 7-Yerleşim yeri ve adres

Ders kapsamında ayrıca, enerji ticaretinin yapıldığı piyasalar ve elektrik piyasalarının yanı sıra karbon piyasalarında portföy ve risk yönetimi prensipleri ve

1 Lisans düzeyi yeterliliklerine dayalı olarak, temel matematik, ekonomi, finans ve istatistik kuramları ve uygulamalarına ilişkin bilgilerini uzmanlık düzeyinde geliştirmek,.

9 Finansal Matematik alanlarında yaygın olarak kullanılan yazılımlara aşina olmak ve ez az birini etkin şekilde kullanabilmek,. 10 Dahil olduğu tüm proje ve

Okul Yöneticiliği ve Eğitim Deneticiliği İkinci öğretim Tezsiz Yüksek Lisans programına başvuracak adaylar için Hizmet belgesi (1 adet).. ALES belgesi (Sıralama

Bütünleşik Doktora ve Yüksek Lisans başvuruları için Lisans; Doktora başvuruları için Lisans ve Yüksek Lisans derecesi için alınan derslerin notlarını ve mezuniyet

İş parçasına markalama çizgilerine göre kavela veya zıvana işlemi yaptınız