17 Mayıs 2016 Salı

Temel Cocos2d-x kavramları

  Ahmet Şimşek       17 Mayıs 2016 Salı

Bu yazıda temel cocos2d-x araçlarını,bunları nasıl kullanacağımızı ve göreceğiz.

Cocos2d-x de oyun geliştirme için gerekli olan sahne,ses,görüntü ve geçişler gibi birçok farklı konu için gerekli olan nesneler vardır.

Bir cocos2d-x projesi temel olarak Scene,Node,Sprite ve Action gibi nesnelerden oluşur.
















Yukarıdaki görselde cocos2d-x ile geliştirilen örnek bir projede kullanılan nesneler gösterilmiş. Oyunda karakterleri,görselleri Sprite ile,start ve restart gibi butonları Menu ile,skor ve oyun adı gibi text içeren kısımları Label ile ve oyunun geçtiği sahneyi Scene ile koda dahil ediyoruz.

Temel nesneler

Director

Director Türkçe karşılığı olan yönetmenden anlaşılacağı üzere oyun sahneleri yani Scene leri yöneten nesnedir.







Yukarıdaki görselde bir oyunun sahne akışı gösteriliyor. İlk olarak intro sahnesi yani oyuna giriş yaptığımız sahne karşımıza çıkar. Sonrasında start butonunun olduğu en yüksek skorun gösterildiği sahne olan menü sahnesine geçiliyor. Start diyerek level 1 sahnesine geçiyoruz level i geçip geçememize göre farklı cutscene yani animasyonlar karşımıza çıkıyor ve sonraında sahneden çıkıp en yüksek skor kayıt altına alınarak menü sahnesine geri dönüyoruz.

İşte bu sahneler arası geçişlerdeki ilişkiyi yöneten kütüphane Director nesnesi.

Scene

Scene nesnesi oyundaki sahneleri oluşturmamızı sağlıyor. Bir oyuna girdiğinizde karşınıza çıkan menü ekranı bir sahnedir sonrasında oyunun başladığı ekran bir sahnedir oyun bittikten sonra aldığımız skoru gördüğümüz ekranda bir sahnedir. Sahneleri yani Scene nesnelerini Director nesnesine eklediğimizden yukarıda bahsetmiştik. Scene nesnesine ise sahneye eklenen Sprite,Menu,Label gibi nesneleri ekliyoruz.

Scene graph

Sahneye eklenen nesneler graph (graf) veri yapısı şeklinde dahil edilir.













Bir sahneye yukarıdaki şekilde eklenen nesneler olduğu varsayalım.



























Sahnenin render edilmesi grafın sol tarafındaki düğüme eklenen nesneden başlar. Aşağıdaki görselde kare noktadan başlayan çizgiler sol taraftan başlayarak sağ taraftaki nesnede son bulur.


















Aşağıdaki örnek kodu inceleyelim. Cocos2d-x de sahneye eklenen nesneler z-order baz alınarak render edilir. Yani sahneye eklenen her nesneye belirli bir derinlik atanarak konumları çakışan nesnelerin hangisinin diğerinin üzerinde görüleceği belirlenebilir. Aşağıdaki örnek kodda sahneye eklenen düğümlere ikinci parametre olarak derinlik atanıyor ve bu derinlikde belirlenen sayının büyüklüğe göre nesnenin sahne üzerindeki derinliğini belirliyor.

scene->addChild(title_node, -2);
scene->addChild(sprite_node, 1);

Yukarıda title_node a -2 sprite_node 1 olarak atanmış olan z-order değeri sprite nesnesinin title nesnesinin üzerinde görülebilmesini sağlayacaktır. Yukarıdaki kodun kullanımın daha detaylı anlatımını sonraki yazıda göreceğiz.

Sprite

Sprite oyunun içerisinde belirli bir değer içerisinde bulunacak olan ve belirli değerleri değiştirilecek nesnelerdir. Örneğin ana oyuncu,düşmanlar,parkurlar sprite a örnek olarak verilebilir.

Örneklerde aşağıdaki görseli kullanacağım. Görseli Resources klasörüne kaydederek ball.png şeklinde yada kaydettiğiniz ismi ile çağırarak kullanabilirsiniz.



Bir sprite nesnesini oluşturmak için auto parametresi ile bir değişken adı kullanacak Sprite class ının create fonksiyonunu çağırıyoruz ve sprite için kullanmak istediğimiz görselin adını belirtiyoruz. auto parametresi oluşturulacak olan değişkenin türünün otomatik olarak tanımlanmasını sağlar. C++ dilinde double num = 0.25 ile auto num 0.25 aynı işlevi görür.

auto ilkSprite = Sprite::create("ball.png");




Oluşturduğumuz mySprite sprite inin ekranda konumunu belirlemek için ->setPosition fonksiyonunu kullanıyoruz. Vec2 ile 2 boyutlu koordinat sisteminde x ve y değerlerini parametre olarak belirtiyoruz.

ilkSprite->setPosition(Vec2(500, 0));

ilkSprite ı döndürmek için ->setRotation fonksiyonunu kullanıyoruz. Derece olarak belirttiğimiz değer kadar sprite ın saat yönünde dönmesini sağlayabiliyoruz.

mySprite->setRotation(45); 

Sprite in ölçeklendirmek için ->setScale fonksiyonunu kullanıyoruz. setScale fonksiyonu x ve y düzlemlerini boyutlandırmak üzere iki parametre alıyor.

mySprite->setScale(2.0);



Sprite in bulunduğu merkezi baz alarak farklı bir noktaya göre değişikliklerin uygulanmasını setAnchorPoint fonksiyonu ile yapıyoruz.

mySprite->setAnchorPoint(Vec2(0, 0));



Aksiyon

Sprite ile oluşturduğumuz nesnemize hareket katmak için MoveBy ve MoveTo sınıflarını kullanıyoruz.

MoveBy sprite in mevcut konumunu baz alarak belirlenen vektör uzunluğu kadar mesafeye belirtelen saniye süresi içinde sprite i taşır.

auto moveBy = MoveBy::create(4,Vec2(10,10));

MoveTo ise ekranın koordinat sisteminde belirtilen bir noktayı baz alarak o konuma belirtilen saniye süresi içinde sprite i taşır.

auto moveTo = MoveTo::create(4,Vec2(10,10));

İlk parametre belirtilen konuma taşıma süresini saniye cinsinden belirtmemizi sağlıyor.

player->runAction(moveBy);

player->runAction(moveTo);

şeklinde runAction fonksiyonu ile aksiyonların sprite üzerinde çalıştırılmasını sağlıyoruz.

Sıralı Aksiyonlar

Bir sprite a birden fazla aksiyon eklemek için Sequence sınıfını kullanıyoruz.

auto actions = Sequence::create(ScaleTo::create(1.5,1.5),MoveTo::create(5,Vec2(20,20));

player->runAction(actions);

şeklinde bir tanımlama ile aksiyonları asenkron şekilde sıralı olarak çalıştırabiliyoruz.

Parent Child İlişkisi

Bir yada birden fazla sprite ın olduğu sahnelerde döndürme yada ölçeklendirme gibi bir değişikliği tüm sprite lara uygulamak istiyorsak hepsi için ayrı şekilde belirterek yapabilir yada hepsini tek bir düğüme ekleyerek düğüm üzerinden değişikliği tanımlayabiliriz.

addChild fonksiyonu ile bir sprite a bir çocuk ekleyerek sprite üzerinde yapılacak tüm değişikliklerin çocuk olarak eklenen sprite lere yansımasını sağlayabiliyoruz.

sprite->addChild(player);

Log

log fonksiyonu ile sahnelerin istediğimiz herhangi bir satırında konsol üzerinde görebileceğimiz bir çıktı gönderebiliyoruz.

log("hello world");

log fonksiyonunda bir değişkeni yazdırmak istiyorsak c dilinde yer alan printf fonksiyonuna benzer şekilde yazdırabiliyoruz.

int num = 10;

log("num : %d",num);

Bu yazıda cocos2d-x de temel kavramları basit örnekler ile gördük. Yazıda yapılan örnekler önceki yazıda oluşturulan örnek cocos2d-x projesi üzerinde HelloWorldScene.cpp dosyasında yapılmıştır. Yazıda hatalı bulduğunuz yerleri,soru ve önerilerinizi ahmetsimsek@tuta.io ya gönderebilir yada yorum olarak yazabilirsiniz. Sonraki yazılarda görüşmek  üzere.
logoblog

Thanks for reading Temel Cocos2d-x kavramları

Previous
« Prev Post

1 yorum:

  1. Yukarıdaki bazı resimler gözükmüyor.Resimleri aldığın url'leri güncelleyebilir misin?

    YanıtlaSil