iMedre

SKConstraint Sınıfı Nedir Ve Fonksiyonları Nelerdir? Sprite Kit Derinlikleri #28

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

SKConstraint Nedir?

Bir düğümün konumunu veya rotasyonunu sınırlamak için bir şartname.

Genel Bakış

Bir SKConstraint nesnesi, düğümün konumuna veya yönüne ilişkin matematiksel bir kısıtlama tanımlar. Kısıtlamalar düğümlere eklenir; Bir sahne, herhangi bir eylemi ve fizik etkileşimini işledikten sonra, düğüm ağacındaki düğümlere eklenmiş kısıtlamaları uygular. Bir sahne oluşturulmadan önce belirli ilişkilerin doğru olduğundan emin olmak için kısıtlamalar kullanın. Örneğin, aşağıdakileri yapmak için bir kısıtlama kullanabilirsiniz:

  • Bir düğümün zRotation özelliğini, her zaman başka bir düğüme veya sahnedeki bir konuma yönlendirecek şekilde değiştirin.
  • Bir düğümü, başka bir düğüme veya sahnede bir noktaya belirli bir mesafe içinde tutun.
  • Belirtilen bir dikdörtgenin içine bir düğüm tutun.
  • Bir düğümün zRotation özelliğini kısıtlayın, böylece daha sınırlı bir döndürme hareket aralığına sahip olur.

Kısıtlamaları kullanmak için, bir veya daha fazla kısıtlama nesnesi içeren bir NSArray nesnesi oluşturun ve diziyi düğümün kısıtlama özelliğine atayın. Sahne değerlendirildiğinde, bir düğüm üzerindeki kısıtlamalar kısıtlama dizisinde göründükleri sırayla yürütülür.

Bir kez oluşturulduğunda, bir sınırlama değiştirilemez. Bununla birlikte, etkinleştirilmiş özelliğini ayarlayarak bir kısıtlamayı seçici olarak devre dışı bırakabilir veya etkinleştirebilirsiniz. Kısıtlama uygulanmadan önce başvurulan referans koordinat sistemine dönüştürmek için referenceNode özelliğini de kullanabilirsiniz.

Fonksiyonlar

Konum Kısıtlamaları Yaratmak

Konum kısıtlamaları, düğümleri yerine kilitlenmelerini (position X (_: y:)) kısıtlamanıza izin verir, yalnızca dikey olarak hareket edebilir (positionX (_ :)) veya yalnızca yatay olarak hareket edebilir (positionY (_: )).

Liste 1, gürültü alanından etkilenen bağlı bir fizik gövdesine sahip bir düğümü nasıl oluşturabileceğinizi gösterir. Düğüm gürültü ile hareket eder, ancak hem yatay hem de dikey eksenlerde 300 ila 340 nokta arasında dikdörtgen bir bölgeyle sınırlandırılır.

scene.physicsWorld.gravity = CGVector(dx: 0, dy: 0)
   
let noiseField = SKFieldNode.noiseField(withSmoothness: 1, animationSpeed: 0.1)
scene.addChild(noiseField)
     
let node = SKShapeNode(circleOfRadius: 10)
node.physicsBody = SKPhysicsBody(circleOfRadius: 10)
scene.addChild(node)
     
let range = SKRange(lowerLimit: 300, upperLimit: 340)

let lockToCenter = SKConstraint.positionX(range, y: range)

node.constraints = [ lockToCenter ]

class func positionX(SKRange)

Bir düğümün konumunun x koordinatını kısıtlayan bir kısıtlama oluşturur.

class func positionY(SKRange)

Bir düğümün konumunun y koordinatını kısıtlayan bir kısıtlama oluşturur.

class func positionX(SKRange, y: SKRange)

Bir düğümün konumunun her iki koordinatını kısıtlayan bir kısıtlama oluşturur.

Oryantasyon Kısıtlamaları Oluşturma

Yönlendirme kısıtlamaları için yaygın bir kullanım, bir bakış kısıtlaması yapmaktır. Örneğin, bir çift gözü hareketli bir nesneyi takip etmek veya hedefin yönünde bir roket noktası yapmak için bir bakış kısıtlaması yaratabilirsiniz.

Liste 2, işaretçi olarak adlandırılan bir nokta düğümü oluşturmak için bir kısıtlamanın nasıl oluşturulacağını gösterir; her zaman hedef adında bir dairesel şekil düğümüne doğru işaret eder. İşaretçiye atanan doku yukarı doğru bir işaretleme okudur ve SpriteKit’in açısal koordinatları orijini saat 3 konumundayken, yön kısıtının 90 ° (pi / 2 radyan) ofseti vardır, böylece ok doğru yönde yönlendirilir hedef.

let target = SKShapeNode(circleOfRadius: 10)
target.position = CGPoint(x: 100, y: 100)
scene.addChild(target)
    
let pointer = SKSpriteNode(imageNamed: "arrowUp.png")
pointer.position = CGPoint(x: 200, y: 200)
scene.addChild(pointer)
    
let lookAtConstraint = SKConstraint.orient(to: target,
                                           offset: SKRange(constantValue: -CGFloat.pi / 2))
pointer.constraints = [ lookAtConstraint ]

Başka bir yönlendirme kısıtlaması olan zRotation (_ : ), dönüşü sınırlamak için yukarıda gösterilen görünüm kısıtlamasıyla birlikte kullanılabilir. Liste 3’ten gelen kodu ekleyerek okun dönüşü sınırlandırılmayacak, böylece aşağı doğru asla göstermeyecektir:
let limitLookAt = SKConstraint.zRotation(SKRange(lowerLimit: -CGFloat.pi / 2,
                                                 upperLimit: CGFloat.pi / 2))
      
pointer.constraints = [ lookAtConstraint, limitLookAt ]
class func orient(to: SKNode, offset: SKRange)
Başka bir düğümün yüzünü döndürmek için  kısıtlama oluşturur.
class func orient(to: CGPoint, offset: SKRange)
Bir düğümün sabit bir noktaya bakacak şekilde dönmesini zorlayan bir kısıtlama oluşturur. 
class func orient(to: CGPoint, in: SKNode, offset: SKRange)
Bir düğümün, başka bir düğümün koordinat sisteminde bir noktaya dönecek şekilde dönmesini zorlayan bir kısıtlama oluşturur.
class func zRotation(SKRange)
Bir düğümün yönlendirmesini sınırlayan bir kısıtlama oluşturur.

Mesafe Kısıtlamaları Yaratmak

Uzaklık kısıtlamaları, bir düğümü, başka bir düğümün veya bir noktanın belirli bir mesafe aralığına sınırlandırır ve düğüm, itici alanlar ve yollar etrafında böyle bir simüle edici akın etkisi için kullanılabilir. Alt limite, üst limite veya her ikisine birden sahip olan bir menzile sahip bir mesafe kısıtlaması sağlamak çok farklı davranışlarla sonuçlanır:

class func distance(SKRange, to: SKNode)

Bir düğümü başka bir düğüme belirli bir mesafede tutan bir kısıtlama oluşturur.

class func distance(SKRange, to: CGPoint)

Bir noktayı belirli bir noktaya kadar tutan bir kısıtlama oluşturur.

class func distance(SKRange, to: CGPoint, in: SKNode)

Bir düğümü, başka bir düğümün koordinat sisteminde belirli bir noktaya kadar tutan bir kısıtlama oluşturur.

Bir Kısıtlamanın Uygulandığı Koordinat Sisteminin Belirlenmesi

var referenceNode: SKNode?

Sınırı uygulamak için koordinat sistemi kullanılmalıdır.

 

 

 

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.