iMedre

SKNode Sınıfı Nedir 2 ? Sprite Kit Derinlikleri #5

Merhaba. SKNode sınıfımıza kaldığımız yerden devam ediyoruz, bir önceki  SKNode Sınıfı Nedir? yazıda  SKNode sınıfı nedir, düğüm ağacı nasıl oluşturulur, node’ların özellikleri, koordinat sistemi oluşumu, çocuk-ebeveyn kavramı vb. konularını anlattım, eğer birinci yazıyı okumadıysanız, kırmızı butona tıklayarak yazıyı okumanızı tavsiye ederim.

Bu yazıda Düğüm Ağacı için Çizim Sırasını Anlama, Hit-Test Emri Çizim Emrinin Tersidir,  Düğüm Ağacını Arama, Bir Düğüm, Özelliklerinin Birçoğunu Soyuna Uygular ve Koordinat Uzayları Arası Dönüştürme konularını anlatacağım. Keyifli okumalar.

Düğüm Ağacı için Çizim Sırasını Anlama

Sahne oluşturma için standart davranış, basit bir çift kural izler:

  • Bir ebeveyn, içeriğini oluşturmadan önce içeriğini çizer.
  • Çocuklar, çocuk dizisinde göründükleri sırayla işlenirler.

Şekil 3, dört çocuğu olan bir düğümün nasıl işlendiğini göstermektedir.

Şekil 3:

 

 

Yukarıdaki resimde, helikopter gövdesi ve bileşenleri, gökyüzündeki düğümün hemen çocuklarıdır. Böylece sahne içeriği şu şekilde işlendi:

  1. Sahne kendini, içeriğini arka plan rengine göre temizler.
  2. Sahne gökyüzü düğümünü oluşturur.
  3. Gökyüzü düğümü, çocuk olarak eklendikleri sırayla, helikopter gövdesi ve bileşenleri olan çocuklarını ortaya çıkarır.

Düğümün çocuklarının sırasını korumak çok iş gerektirebilir. Bunun yerine, her düğüme sahnede açık bir yükseklik verebilir. Bunu, bir düğümün zPosition özelliğini ayarlayarak yaparsınız. Z konumu, düğümün konum özelliğinin ebeveynin konumuna göre x ve y konumunu temsil etmesi gibi, düğümün üst düğümüne göre yüksekliğidir. Dolayısıyla, ebeveyn konumunun üstünde veya altında bir düğüm yerleştirmek için z konumunu kullanırsınız.

Z-pozisyonlarını dikkate aldığınızda, düğüm ağacı nasıl işlenir:

  1. Her bir düğümün global z-konumu, z konumunun üst öğesinin z-konumuna yinelenen eklenmesiyle hesaplanır.
  2. Düğümler en küçük z-konumundan en büyük z-konumuna kadar sıralanır.
  3. İki düğüm aynı z-pozisyonunu paylaşırsa, önce atalar oluşturulur ve kardeşler çocuk düzeninde işlenir.

Az önce gördüğünüz gibi, SpriteKit, düğüm düğümlerine ve düğüm ağacındaki konumlarına dayanarak deterministik bir oluşturma düzeni kullanır. Ancak, oluşturma sırası çok belirleyici olduğundan, SpriteKit, aksi takdirde geçerli olabilecek bazı oluşturma optimizasyonlarını uygulayamayabilir. Örneğin, SpriteKit aynı doku ve çizim modunu paylaşan tüm düğümleri toplayıp tek bir çizim geçişi ile çizebilirse daha iyi olabilir. Bu tür optimizasyonları etkinleştirmek için, görünümün ignoresSiblingOrder özelliğini true olarak ayarlarsınız.

Kardeşlik sırasını göz ardı ettiğinde(ignoresSiblingOrder ), SpriteKit düğümleri oluşturmak için grafik donanımını kullanır, böylece z-pozisyonuna göre sıralanırlar. Düğümleri, sahneyi oluşturmak için gereken çekiliş çağrılarının sayısını azaltan bir çizim düzenine sıralar. Ancak bu optimize çizim emri ile aynı yükseklikte paylaşan düğümlerin oluşturma sırasını tahmin edemezsiniz. Oluşturma sırası, her yeni bir çerçeve oluşturulduğunda değişebilir. Birçok durumda, bu düğümlerin çizim sırası önemli değildir. Örneğin, düğümler aynı yükseklikte ise ancak ekranda üst üste gelmezse, herhangi bir sırada çizilebilirler.

Şekil 4, oluşturma sırasını belirlemek için z-pozisyonlarını kullanan bir ağacın bir örneğini göstermektedir. Bu örnekte, helikopterin gövdesi 100’lük bir yükseklikte ve çocukları boylarına göre işlenir. İki rotor düğümü aynı yükseklikte paylaşır ancak üst üste gelmez.

Şekil 4:

Bir alt düğümün z-konumu, ebeveyninin z konumuna eklendiğinden, çocuk düğümlerini farklı ana düğümlerden araya getirebilirsiniz. Liste 3, her biri yuvarlak bir çocuk düğümü olan iki kare ana düğüm oluşturan kodları gösterir. İlk düğüm 10’un bir z-pozisyonuna sahiptir ve çocuk düğümü 10’luk bir z-pozisyonuna sahiptir. İkinci düğüm 15’lik bir z-pozisyonuna sahiptir ve çocuk düğümü de 10’luk bir z-pozisyonuna sahiptir.

Sahneye bir kez eklendiğinde, ilk düğümün çocuğu etkin bir global z-pozisyonuna (20) sahiptir ve ikinci düğümün çocuğu, bir serpiştirme etkisi veren etkin bir global z-pozisyonuna (25) sahiptir

 



Liste 3:

func addNodesTo(scene: SKScene,
                color: SKColor, position: CGPoint,
                parentZ: CGFloat, childZ: CGFloat) {
    
    let diameter: CGFloat = 250
    let rect = CGRect(origin: position,
                      size: CGSize(width: diameter, height: diameter))
     
    let parentNode = SKShapeNode(rect: rect)
    let childNode = SKShapeNode(ellipseIn: rect.insetBy(dx: 10, dy: 10))
  
    [(parentNode, scene, parentZ), (childNode, parentNode, childZ)].forEach {
        node, parent, zPosition in
        
        node.fillColor = color
        node.strokeColor = .white
        node.zPosition = zPosition
        
        parent.addChild(node)
    }
}

  
addNodesTo(scene: scene,
           color: .red,
           position: CGPoint(x: 300, y: 300),
           parentZ: 10,
           childZ: 10)
 
addNodesTo(scene: scene,
           color: .blue,
           position: CGPoint(x: 350, y: 250),
           parentZ: 15,
           childZ: 10)



Şekil 5, ortaya çıkan sahneyi göstermektedir

Figür 5:

Özetlemek gerekirse, sahneyi oluşturma sırasını belirlemek için hem ağaç sırasını hem de z konumlarını kullanabilirsiniz. Karmaşık bir sahne oluştururken, sıralama davranışını devre dışı bırakmalı ve deterministik bir sahne düzeni oluşturmak için düğümlerin z-konumlarını kullanmalısınız.

 Hit-Test Emri, Çizim Emrinin Tersidir

Bir sahnede, SpriteKit ekrana dokunma işlemleri veya mouseolayları işlediğinde, olayı kabul etmek isteyen en yakın düğümü bulmak için sahneyi gezer. Bu düğüm, etkinliği istemiyorsa, SpriteKit bir sonraki en yakın düğümü ve benzerlerini denetler. İsabet testinin işlendiği sıra, esasen çizim düzeninin tersidir.

İsabet testi(Hit-Test) sırasında bir düğümün dikkate alınması için, isUserInteractionEnabled özelliği bir true değerine ayarlanmalıdır. Varsayılan değer, bir sahne düğümü dışındaki herhangi bir düğüm için yanlıştır.

Bazen, standart olay işleme mekanizmalarına güvenmek yerine, düğümleri doğrudan aramak istersiniz. SpriteKit’te, soyundan herhangi birinin kendi koordinat sisteminde belirli bir noktaya kesişip geçmediğini bir düğümden isteyebilirsiniz. Noktayı kesişen ilk kesişimi bulmak için atPoint (_ : ) yöntemini çağırın veya noktayı kesişen tüm düğümlerin bir dizisini almak için node (: ) yöntemini kullanın.

Diğer Etkileri Eklemek için Düğüm Derinliğini Kullanma

SpriteKit, yalnızca isabet testini ve çizim sırasını belirlemek için zPosition değerini kullanır. Kendi oyun efektlerinizi uygulamak için z konumunu da yapabilirsiniz. Örneğin, nasıl oluşturulduğunu veya ekranda nasıl hareket ettiğini belirlemek için bir düğümün yüksekliğini kullanabilirsiniz. Bu şekilde sis veya paralaks efektlerini canlandırabilirsiniz. SpriteKit sizin için bu etkileri oluşturmaz. Genellikle, bunları işlenmeden önce sahneyi işleyerek uygularsınız.

Düğüm Ağacını Arama

Sahne ağacındaki düğümler genellikle sahne için kesin görüntü oluşturma sırasını belirlemek üzere düzenlenir, bu düğümler sahnenizde rol oynamaz. Ayrıca, doğrudan çalışma zamanında bunları anında oluşturmak yerine düğümleri bir arşiv dosyasından yükleyebilirsiniz. Bu nedenle, bir düğüm ağacında belirli düğümleri bulabilmeniz gerekebilir. Bunu yapmak için, düğümlere adlar sağlar ve ardından bu adları ararsınız.

Bir düğümün name özelliği, bir düğümün adını tutar. Ad herhangi bir noktalama işareti olmadan alfanümerik bir dize olmalıdır. Liste 4, birbirinden ayırt etmek için üç farklı düğümün nasıl isimlendirileceğini gösterir.

playerNode.name = "player"
monsterNode1.name = "goblin"
monsterNode2.name = "ogre"

 

Ağaçtaki düğümleri adlandırdığınızda, bu adların benzersiz olup olmayacağına karar verin. Bir düğümün adı benzersizyse, sahne ağacında bu ada sahip birden fazla düğümü asla eklememelisiniz. Diğer taraftan, bir düğüm adı oyununuzda benzersiz değilse, ilgili düğümlerin bir koleksiyonunu temsil edebilir. Örneğin, Liste 4’te, oyunda muhtemelen birden fazla goblin vardır ve hepsini aynı ada sahip olarak tanımlamak isteyebilirsiniz. Ancak player oyunda benzersiz bir düğüm olabilir.

Düğüm adı genellikle uygulamanızda iki amaca hizmet eder:

  1. Düğümün adına göre oyun mantığını uygulayan kendi kodunuzu yazabilirsiniz. Örneğin, iki fizik nesnesi çarpıştığında, çarpışmanın oynanışı nasıl etkilediğini belirlemek için düğüm isimlerini kullanabilirsiniz.
  2. Belirli bir ada sahip düğümleri arayabilirsiniz. Genellikle, bir sahne ilk kez yüklendiğinde bu bir kez yapılır.

SKNode sınıfı, düğüm ağacını aramak için aşağıdaki yöntemleri uygular:

  1. ChildNode (withName : ) yöntemi, bir düğümün çocuklarını eşleşen bir düğüm buluncaya kadar arar, sonra durur ve bu düğümü döndürür. Bu yöntem genellikle benzersiz isimleri olan düğümleri aramak için kullanılır.
  2. EnumerateChildNodes (withName: using 🙂 yöntemi, bir düğümün çocuklarını arar ve bulduğu her eşleşen düğüm için bloğunuzu bir kez çağırır. Aynı adı paylaşan tüm düğümleri bulmak istediğinizde bu yöntemi kullanırsınız.
  3. Subscript (_ : ) yöntemi, belirli bir ada sahip eşleşen bir dizi düğüm döndürür.

Aşağıdaki kod, oyuncu düğümünü bulmak için sahne sınıfınızda nasıl bir yöntem oluşturabileceğinizi gösterir. Kodunuzun içinde bir sahne yükleyen ve hazırlayan bir yöntem kullanabilirsiniz.

var playerNode: SKNode? {
    return childNode(withName: "player")
}

Bu yöntem sahnede çağrıldığında, sahne adı özelliği arama dizisiyle eşleşen bir düğüm için çocuklarını (ve yalnızca çocuklarını) arar ve ardından düğümü döndürür. Bir arama dizgisini belirtirken, düğümün adını veya bir sınıf adını belirtebilirsiniz. Örneğin, player düğümü için kendi alt sınıfınızı oluşturup PlayerSprite olarak adlandırırsanız PlayerSprite öğesini player yerine arama dizesi olarak belirtebilirsiniz; aynı düğüm iade edilecektir.

Gelişmiş Aramalar

Varsayılan arama sadece bir düğümün çocuklarını arar ve tam olarak düğümün adı veya sınıfıyla eşleşmelidir. Ancak, SpriteKit daha gelişmiş aramalar yapabilmeniz için etkileyici bir arama sözdizimi sağlar. Örneğin, daha önce olduğu gibi aynı aramayı yapabilir, ancak tüm sahne ağacında arama yapabilirsiniz. Ya da düğümün çocuklarını arayabilir, ancak tam bir eşleşme gerektirmek yerine bir desenle eşleştirebilirsiniz.

Tablo 3 farklı sözdizimi seçeneklerini açıklar. Arama, genel düzenli ifade semantiği kullanır.

Gösterim;

/

Arama dizgisinin başlangıcına yerleştirildiğinde, bu, aramanın ağacın kök düğümünde gerçekleştirilmesi gerektiğini gösterir. Arama dizesinin başlangıcından başka bir yere yerleştirildiğinde, bu, aramanın düğümün çocuklarına taşınması gerektiğini belirtir.

//

Arama dizgisinin başlangıcına yerleştirildiğinde, aramanın kök düğümde başlaması ve tüm düğüm ağacında yinelemeli olarak gerçekleştirilmesi gerektiğini belirtir. Aksi takdirde, mevcut konumundan tekrarlamalı bir arama yapar.

.

Mevcut düğüme karşılık gelir.

..

Arama, düğümün ebeveyine taşınmalıdır.

*

Arama sıfır veya daha fazla karakterle eşleşir.

Bir Düğüm, Özelliklerinin Birçoğunu Soyuna Uygular

Bir düğümün özelliğini değiştirdiğinizde, efektler genellikle düğümün soyuna yayılır. Net etki, bir çocuğun sadece kendi özelliklerine değil aynı zamanda atalarının özelliklerine dayandırılmasıdır.

xScale, yScale 

Düğümün koordinat sistemi, bu iki faktör tarafından ölçeklendirilir. Bu özellik, koordinat dönüşümünü, düğümün çerçevesini, çizimini ve isabet testini etkiler. Onun torunları benzer şekilde ölçeklendirilmiştir.

zRotation

Düğümün koordinat sistemi döndürülür. Bu özellik, koordinat dönüşümünü, düğümün çerçevesini, çizimini ve isabet testini etkiler. Onun torunları benzer şekilde ölçeklendirilmiştir.

alpha

Düğüm bir karışım modu kullanılarak oluşturulmuşsa, karışım işlemi gerçekleşmeden önce alfa değeri herhangi bir alfa değerine çarpılır. Torunları benzer şekilde etkilenir.

isHidden

Bir düğüm gizlenmişse, düğüm ve torunları işlenmez.

speed

Bir düğümün eylemleri işlediği hız bu değerle çarpılır. Torunları benzer şekilde etkilenir.

Koordinat Uzayları Arası Dönüştürme

Düğüm ağacıyla çalışırken, bazen bir konumu bir koordinat uzayından diğerine dönüştürmeniz gerekir. Örneğin, fizik sistemindeki eklemleri belirtirken, eklem konumları sahne koordinatlarında belirtilir. Dolayısıyla, yerel bir koordinat sisteminde bu noktalara sahipseniz, bunları sahnedeki koordinat alanına dönüştürmeniz gerekir.

Aşağıdaki kod, düğümün konumunun sahne koordinat sistemine nasıl dönüştürüleceğini gösterir. Sahnenin dönüşümü yapması isteniyor. Bir düğümün konumunun üst öğenin koordinat sisteminde belirtildiğini unutmayın; böylece kod, dönüştürülecek düğüm olarak node.parent öğesinden geçer. convert(_: to : ) yöntemini çağırarak aynı dönüşümü tersine gerçekleştirebilirsiniz.



let positionInScene: CGPoint?

if let parent = node.parent {
    positionInScene = node.scene?.convert(node.position,
                                          from: parent)
}
else {
    positionInScene = nil 
}

 

Koordinat dönüşümlerini gerçekleştirmeniz gereken bir durum, olay işleme gerçekleştirdiğiniz zamandır. Fare ve dokunma olaylarının koordinatları görüntülemek için pencere koordinatlarından ve oradan sahneye dönüştürülmesi gerekir. Yazmanız gereken kodu basitleştirmek için SpriteKit birkaç kolaylık yöntemi ekler.

 

Bu yazıda SKNode sınıfının konularını bitirdik. Bir sonraki yazı SKNode sınıfının fonksiyonları hakkında olacak. Keyifli okumalar.

 

Erdem Özgür

Yorum Ekle

Bizleri Sosyal Medyadan Takip Edebilirsiniz

Utanmana gerek yok, bizimle iletişim kurabilirsin. İnsanlarla tanışmayı ve yeni arkadaşlar edinmeyi seviyoruz.