iMedre

SKFieldNode Sınıfı Nedir Ve Fonksiyonları Nelerdir? Sprite Kit Derinlikleri #41

Merhaba bu yazıda Sprite Kit Kütüphanesinden SKFieldNode sınıfı nedir ve  SKFieldNode sınıfının fonksiyonlarını anlatacağım. Keyifli okumalar.

SKFieldNode Sınıfı Nedir?

Fizik efektlerini sahnenin bir bölümüne uygulayan bir düğüm.

Genel Bakış

Alan Ağları Oluşturma bölümü, SpriteKit kullanarak oluşturabileceğiniz, fizik gövdelerine özel kuvvetler uygulamanıza izin veren bir tür dahil olmak üzere, oluşturabileceğiniz alan türlerini listeler. Uygun türdeki bir alan düğümünü örneklendirin ve ardından sahnenin düğüm ağacına ekleyin.

Sahne fizik efektlerini taklit ettiğinde, bir alan düğümü aşağıdaki şeyler doğru olduğu sürece etkisini bir fizik bedenine uygular:

  • Alan düğümü sahnenin düğüm ağacındadır.
  • Alan düğümünün isEnabled özelliği doğrudur.
  • Fizik gövdesi, sahnenin düğüm ağacında bulunan bir düğüme eklenir.
  • Fizik gövdesi, alan düğümünün bölgesinde bulunur (bkz. Bölge).
  • Fizik gövdesi, IsExclusive özelliği true değerine ayarlanmış başka bir alan düğümünün bölgesinde bulunmaz.
  • Alan düğümünün categoryBitMask özelliği ile fizik gövdesinin fieldBitMask özelliği arasındaki mantıksal VE işlem, sıfırdan farklı bir değere neden olur.

Sahne Alanınıza Fizik Alanları Ekleme

Sadece fizik bedenleri, çarpışmaları ve uygulanan kuvvetleri kullanarak bir oyun uygulamak mümkündür, ancak bazen bu çok fazla iş olabilir. Örneğin, iki nesnenin birbirine çekilmesini istiyorsanız, yerçekimi hesaplamaları yapmalı ve yeni bir karenin hesaplaması için bu kuvvetleri uygulamanız gerekir. Bir sahneye genel efektler uygulamak istediğinizde, bunu fizik alanlarını kullanarak daha kolay yapabilirsiniz.

Fizik alanı, sahnenin düğüm ağacının içine yerleştirilmiş bir düğümdür. Sahne fiziği simüle ettiğinde, fizik alanı etkileşime girecek şekilde yapılandırılmış fizik yapılarını etkiler. Alan düğümlerini oluşturma bölümünde tanımlanmış birçok farklı alan etkisi vardır.

Liste 1, bu alanlardan birini, bir doğrusal yerçekimi alanını göstermektedir. Bu örnekte, bir alan düğümü sahnenin fizik dünyasının sağladığı varsayılan çekim yerini değiştirir. İlk olarak, sahnenin varsayılan yerçekimi devre dışı bırakılır. Ardından, sahne, ekranın altına doğru bir vektörle doğrusal bir yerçekimi alanı yaratır ve düğüme, Dünya’nın yerçekimine eşit bir güç verir. Son olarak, düğümü kendisine ekler.

physicsWorld.gravity = CGVector(dx:0, dy: 0);

let gravityVector = vector_float3(0,-1,0);

let gravityNode = SKFieldNode.linearGravityField(withVector: gravityVector)

gravityNode.strength = 9.8

addChild(gravityNode)

Varsayılan yerçekimi yerine bir alan düğümünü kullanmanın bazı nedenleri aşağıda verilmiştir:

  • Yer çekimi gücünü ve yönünü birbirinden bağımsız olarak değiştirebilirsiniz.
  • Eylemlerin etkisini alanın gücünü değiştirebilirsiniz.
  • Alan düğümünü döndürerek yerçekimi yönünü değiştirebilirsiniz.
gravityNode.zRotation = CGFloat.pi
  • Alan düğümünün gücü veya yönünü değiştirmeden alan düğümünün isEnabled özelliğini kullanarak yer çekimini etkinleştirebilir ve devre dışı bırakabilirsiniz.

Alan düğümlerinin Kategoriler ve Bölgeler Arası Etkisinin Sınırlandırılması

Varsayılan olarak, bir alan düğümü olaydaki tüm fizik yapılarını etkiler. Ancak, bu şekilde olmak zorunda değildir. Hangi fizik kütlelerinin bir alan düğümünden etkilendiğini dikkatlice kontrol ederek, bazı ilginç etkiler yaratabilirsiniz.

Saha düğümleri tıpkı fizik bedenleri gibi kategorize edilir. Benzer şekilde, fizik organları hangi alan kategorilerinin onları etkilediğini beyan eder. Bu iki özelliği birleştirerek oyununuz tarafından hangi tür alanların uygulandığına ve hangi fizik kütlelerinin bu alanlardan etkilendiğine karar verebilirsiniz. Genelde, bunu, bir oyuna bırakabileceğiniz genel efektleri tanımlamak için alan kategorilerini kullanarak yaparsınız. Örneğin, bir gezegene yerçekimi eklemek istediğiniz bir oyunu uyguladığınız an için farz edin. Yerçekimi, gemiler ve asteroitler gibi nesneleri gezegene doğru çekmelidir. Aşağıdaki kod, yerçekimi efektleri için bir kategori oluşturur. Bir gezegen oluşturulduğunda, bir çocuk olarak ayrı bir radyal yerçekimi alan düğümü eklenir ve yer çekimi kategorisini kullanacak şekilde yapılandırılır. Yeni bir fizik gövdesi oluşturulduğunda, vücudun maskesi hangi alanların onu etkileyeceğini belirlemek için yapılandırılır. Gemiler yer çekiminden etkilenir ve füzeler güç alanlarından etkilenir.

let gravityCategory: UInt32 = 0x1 << 0
let shieldCategory: UInt32 = 0x1 << 1
...
let gravity = SKFieldNode.radialGravityField()
gravity.strength = 3
gravity.categoryBitMask = gravityCategory
planet.addChild(gravity)
...
ship.physicsBody?.fieldBitMask = gravityCategory
...
missile.physicsBody?.fieldBitMask = shieldCategory

Yani, bu güç alanını uygulama zamanı: Gelen füzeleri saptıracak bir kalkan nesnesi. Bunu yapmanın ilginç bir yolu da başka bir radyal yerçekimi alanıdır, ancak negatif bir alan gücü kullanır: Fizik gövdeleri gemiden uzaklaştırılır. Ancak tüm sahneyi etkileyen bir alan, istediğinizden daha fazla olabilir; bunun yerine alan sadece yakındaki füzeleri etkilemelidir. Alan düğümü nesnesi üzerinde iki özelliği kullanan bir alanın etki alanını tanımlarsınız.

Bir alan düğümünün bölge özelliği, alanın işleri etkileyebileceği alanı belirler. Varsayılan olarak, bu bölge tüm sahneyi kapsar. Ancak, bölgeye bunun yerine sonlu bir şekil vermeyi seçebilirsiniz. Kuvvet alanı için dairesel bir alan iyidir, ancak diğer şekiller mümkündür. Yapıcı set geometrisi (CSG) kullanarak bile oluşturabilirsiniz.

Bir alan düğümünün falloff özelliği, alanın gücünü ne kadar hızlı yitirdiğini belirler. Alanın hiç güç kaybetmemesini veya varsayılan değerden daha hızlı bir şekilde düşmesini tercih edebilirsiniz. Radyal bir yerçekimi alanı için varsayılan değer, diğer vücudun merkezine olan mesafenin karesine göre düşmesidir. Tüm alan türleri falloff özelliğinden etkilenmez.

Aşağıdaki kod roket gemisine geçici bir kuvvet alanı ekler. Saha düğümü füzeleri itmek için oluşturuldu ve yapılandırıldı. Daha sonra düğümden etkilenen alanı sınırlamak için dairesel bir bölge eklenir ve alan, mesafenin bir fonksiyonu olarak gücünün daha çabuk düşmesi için yapılandırılır. Son olarak, alan zayıflatılmalı ve ortadan kaybolmalı, böylece gemi savunmasız değil. Alan, ilk önce güçte bir düşüşe hiçbir şey yapmadan animasyon uygulayan bir eylem kullanılarak zayıflatılır ve ardından kalkan düğümünü kaldırır. Gerçek bir oyunda, kalkan efekti, geminin üstünde oluşturulan bir grafik etkiyle süslenebilir.

let shield = SKFieldNode.radialGravityField()
shield.strength = -5
shield.categoryBitMask = shieldCategory
shield.region = SKRegion(radius: 100)
shield.falloff = 4
shield.run(SKAction.sequence([
    SKAction.strength(to: 0, duration: 2.0),
    SKAction.removeFromParent()
    ]))
ship.addChild(shield)

Fonksiyonlar

class func dragField()

Fizik kütlelerinin hareketine direnen bir kuvvet uygulayan bir alan düğümü oluşturur.
class func electricField()
Fizik cisimlerinin elektrik yüküne orantılı bir elektrik kuvveti uygulayan bir alan düğümü oluşturur.
class func linearGravityField(withVector: vector_float3)

Fizik bedenlerini belirli bir yönde hızlandıran bir alan düğümü oluşturur.
class func magneticField()
 
Fizik cisimlerinin hızı ve elektriksel yüküne dayanan bir manyetik kuvvet uygulayan bir alan düğümü oluşturur.
class func noiseField(withSmoothness: CGFloat, animationSpeed: CGFloat)
Fizik bedenlerine randomize bir ivme uygulayan bir alan düğümü oluşturur.

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.