GELECEĞİ YAZANLAR BLOG

Yeni Blog Yaz

Apple'ın Oyun Motoru: Sprite Kit

Büşra Deniz - 22 Nisan 2014

 

Tüm geliştiriciler için oyun geliştirme konusu her zaman dikkat çekici ve merak uyandırıcı bir konu olmuştur. Özellikle mobil dünyasının hızlı gelişimi ve mobil uygulama mağazalarında oluşan oyun ekosistemiyle oyun geliştirme daha da dikkat çekici bir konuma geldi. Angry Birds, Temple Run, Candy Crush, Clash of Clans gibi oyunların başarılarını görüp de hangi geliştirici oyun yazmak istememiştir ki?

Özellikle Appstore'daki oyun sayısı ve oluşan ekosistem Apple tarafından da fark edilmiş olmalı ki, iOS 7 ile birlikte geliştiricileri için Sprite Kit kütüphanesini duyurdu. Xcode 5 ile ilk Sprite Kit projeleri yazılmaya başlandı. Biz de ilk Sprite Kit projemizi oluşturmaya başlayalım.

 

Sprite Kit ile ilk proje

Xcode 5 ve üzerinde sürümlerde Create New Project seçeneğine tıkladığımızda aşağıdaki ekran açılacak. Burada SpriteKit Game seçeneğini göreceksiniz:

SpriteKit'i seçtikten sonra projemiz ile ilgili bilgilerimizi giriyoruz.  

Bu adımdan sonra projeniz oluşturulacak ve aşağıdaki dosyaları göreceksiniz.

Burada oluşturulan projenin bir iOS uygulaması ile hemen hemen aynı olduğunu göreceksiniz.

 

Hello World!

ViewController.m dosyasına baktığımızda viewDidLoad fonksiyonu içerisinde SKView üzerine bir tane SKScene ekleniyor.

[cpp]
-(void)viewDidLoad {
[super viewDidLoad];

// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;

// Create and configure the scene.
SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;

// Present the scene.
[skView presentScene:scene];
}
[/cpp]

 

SKView - SKScene

SKView SpriteKit elemanlarını üzerine çizdiğiniz ve işlediğiniz sınıftır. SKView üzerine birden fazla SKScene objesi ekleyebilir ama aynı zamanda sadece bir tane SKScene objesini görüntüleyebilirsiniz. Bunlar arasında geçişleri farklı animasyonlarla yapabilirsiniz.

Örneğin; oyununuzun giriş ekranı, oyun ekranı ve sonuç ekranı farklı SKScene objeleridir ve bunlar arasında geçiş yapabilirsiniz. SKScene sınıfı ise diğer tüm SpriteKit elemanlarını istediğiniz hiyerarşi ile ekleyip görüntüleyebildiğiniz sınıftır. SKView - SKScene ve diğer SpriteKit elemanları arasındaki ilişki aşağıdaki diyagram gibidir:

SpriteKit ile ilgili dikkat edilmesi gereken ayrıntılardan bir tanesi de koordinat sisteminin UIKit ile aynı olmama durumudur. UIKit başlangıç noktası (0,0) olarak sol-alt köşeyi alırken SpriteKit sol-üst köşeyi almaktadır.

 

SKNode

MyScene.m dosyası içine bakacak olursak, initWithSize fonksiyonu içerisinde ekrana bir SKLabelNode eklenerek "Hello World" yazısı gösteriliyor. SKLabelNode SKNode sınıfından türetilmiş ekranda yazı göstermek için kullandığımız sınıftır. SKSpriteNode, SKEmitterNode, SKEffectNode, SKShapeNode gibi birçok sınıf SKNode sınıfından türetilmiştir. Bu objeleri SKScene üzerinde ister iç içe ister aynı hiyerarşiyle ekleyip çizdirebilirsiniz.

[cpp]
-(id)initWithSize:(CGSize)size {

                  if (self = [super initWithSize:size]) {
/* Setup your scene here */
self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];

SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
myLabel.text = @"Hello, World!";
myLabel.fontSize = 30;
myLabel.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame));
[self addChild:myLabel];
}
return self;

}
[/cpp]

 

SKAction

Oyununuz içerisinde tıklama, sürekleme, yana çevirme gibi hareketlerde istediğiniz işlemi yapmanızı SKAction sağlar.

Scene üzerine SKAction kullanarak istediğimiz hareketi ekleyebiliriz. Örneğin; MyScene içerisinde ekrana her dokunulduğunda bir tane SKSpriteNode oluşturulup, dönme hareketi eklenerek sahne üzerine yerleştirilmiştir.

[cpp]
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

/* Called when a touch begins */
for (UITouch *touch in touches) {

CGPoint location = [touch locationInNode:self];
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
sprite.position = location;

SKAction *action = [SKAction rotateByAngle:M_PI duration:1];
[sprite runAction:[SKAction repeatActionForever:action]];

[self addChild:sprite];
}

}[/cpp]

Uygulamayı çalıştırdığınızda ekrana her tıkladığınızda bir roket ekrana eklenecek ve kendi etrafında dönmeye başlayacaktır. Böylelikle Sprite Kit ile ilk projemizi oluşturduk. Buraya kadar olan kısımda herhangi ekstra bir işlem yapılmadı, direkt Xcode'un size sağlamış olduğu proje üzerinden konuştuk. Böyle bir başlangıç yaptıktan sonra Sprite Kit'i mobil oyun dünyasında tek seçenek olmadığını tekrar hatırlatalım. Şu an çok geniş bir kullanım kitlesine ulaşmış olmasa da önü açık görünüyor. Rakipleri ile arasında artı ve eksi pek çok fark var. Genel olarak Sprite Kit'in diğer mobil oyun geliştirme ortamları ile arasındaki farkları sıralayacak olursak:

Avantajları:

  • Bir Sprite Kit projesi oluştururken herhangi bir kütüphane indirip, proje ile entegre etmenize gerek yok. Doğrudan Xcode üzerinden Sprite Kit projesi oluşturup herhangi bir yapılandırma gerçekleştirmeden ilerleyebilirsiniz.
  • Objective-C bilen geliştiriciler için öğrenimi çok kolay.
  • Apple'ın kendi kütüphanesi olduğu için iOS'un yeni sürümleri ile daha hızlı uyumlu hale gelecek. Third-party bir kütüphanenin size vereceği desteği Apple daha hızlı sağlar.
  • Oyununuz içerisinde particle, texture atlas vb. kullanımı için herhangi bir ekstra editöre ihtiyacınız yok. Xcode içerisindeki editörler ile tümünü gerçekleştirebiliyorsunuz.
  • İçerisinde dâhili bir fizik motoru bulunduruyor.

Dezavantajları:

  • Diğer kütüphanelerle karşılaştırdığımızda şu an için daha az özellik sunuyor.
  • Multi platform bir oyun geliştiremiyorsunuz. Yazdığınız oyun sadece iOS için geliştirilmiş oluyor.
  • Oyun içerisinde kendi OpenGL kodunuzu yazmanıza izin vermiyor.
  • Şu an için sadece 2D oyun geliştirebiliyorsunuz.

Son olarak, Sprite Kit'in hiç oyun geliştirmemiş iOS geliştiricileri için iyi bir başlangıç olacağını düşünüyorum. Tamamen yabancı bir geliştirme ortamına girmeden küçük çaplı oyunlar ya da prototipler geliştirmek zevkli olacaktır.

2 Cevap

Fikri Karadereli

23 Nisan 2014

Teşekkürler. Güzel bir yazı olmuş. Devamını bekliyorum.

Erkam KÜCET

05 Şubat 2015

Güzel paylaşım teşekkürler...

Yorum yapmak için Giriş Yapın ya da Üye olun.