iMedre

SKPhysicsBody Sınıfının Fonksiyonları Nelerdir? Sprite Kit Derinlikleri #37

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

Hacim Bazlı Fizik Body’leri Oluşturmak

init(circleOfRadius: CGFloat)

Sahip düğümün kökeni merkezli bir dairesel fizik gövdesi oluşturur.

init(circleOfRadius: CGFloat, center: CGPoint)

Geliştiricinin belirlediği bir noktaya merkezli dairesel bir fizik gövdesi oluşturur.

init(rectangleOf: CGSize)

Sahip düğümün kökeni merkezli bir dikdörtgen fizik gövdesi oluşturur.

init(rectangleOf: CGSize, center: CGPoint)
Geliştiricinin belirlediği bir noktaya merkezli bir dikdörtgen fizik gövdesi oluşturur.
init(bodies: [SKPhysicsBody])
Birim tabanlı bir fizik kütlesi grubunun birleşimini gerçekleştirerek bir fizik kütlesi oluşturur.
init(polygonFrom: CGPath)
 Çokgen şekilli bir fizik gövdesi oluşturur.
init(texture: SKTexture, size: CGSize)
Bir texture içeriğinden bir fizik gövdesi oluşturur.
init(texture: SKTexture, alphaThreshold: Float, size:CGSize)
Bir doku içeriğinden, yalnızca belirli bir saydamlık değerini aşan metinleri yakalayan bir fizik gövdesi oluşturur.

Kenar Tabanlı Fizik Body’leri Oluşturmak

init(edgeLoopFrom: CGRect)

Bir dikdörtgenden bir kenar(edge) döngü oluşturur.

init(edgeFrom: CGPoint, to: CGPoint)

İki nokta arasında bir kenar oluşturur.

init(edgeLoopFrom: CGPath)

Bir yoldan bir kenar döngü oluşturur.

init(edgeChainFrom: CGPath)

Bir yoldan bir kenar zinciri oluşturur.

Kuvvetlerin Bir Fizik Bedenini Nasıl Etkileneceğini Tanımlamak

var affectedByGravity: Bool

Bu fizik bedeninin fizik dünyasının yer çekiminden etkilenip etkilenmediğini gösteren Boole değeri.

var allowsRotation: Bool

Fizik gövdesinin açısal kuvvetlerden ve buna uygulanan impulslardan etkilenip etkilenmediğini gösteren Boole değeri.

var isDynamic: Bool

Fizik bedeninin fizik simülasyonu tarafından taşınıp taşınmadığını gösteren bir Boole değeri.

Body’nin Fiziksel Özelliklerini Tanımlama

var mass: CGFloat

Vücudun kütlesi kilogram.

var density: CGFloat

Metrekareye göre kilogram cinsinden yoğunluğu.

var area: CGFloat

Gövdenin kapladığı alan.

var friction: CGFloat

Fizik gövdesinin yüzeyinin pürüzlülüğü. Sürtünme

var restitution: CGFloat

Fizik vücudunun geri kazanılmış enerjisi.

var linearDamping: CGFloat
 Vücudun doğrusal hızını azaltan bir özellik.
var angularDamping: CGFloat
Vücudun dönme hızını azaltan bir özellik.

Çarpışma ve İletişim ile Çalışmak 

İki fizik cismi temasa geçtiğinde veya aynı alanı işgal etmeye kalkıştığında, SpriteKit aralarında iki tür etkileşimi destekler:

  • İki bedenin birbirine değdiğini bilmeniz gerektiğinde bir iletişim kullanılır. Çoğu durumda, bir çarpışma olduğunda oyun değişiklikleri yapmanız gerektiğinde kişileri kullanırsınız.
  • İki nesnenin birbirine girmesini önlemek için bir çarpışma kullanılır. Bir vücut başka bir cisme çarptığında, SpriteKit otomatik olarak çarpışma sonuçlarını hesaplar ve çarpışmadaki cisimlere impuls uygular.

Oyununuz, çarpışmaların ne zaman gerçekleşmesi gerektiğini ve fizik kütleleri arasındaki etkileşimlerin gerçekleştirilmesi için ek oyun mantığına ihtiyaç duyduğunu belirlemek için sahnedeki fizik yapılarını yapılandırır. Bu etkileşimleri sınırlamak sadece oyununuzun mantığını tanımlamak için değil, aynı zamanda SpriteKit’ten iyi bir performans elde etmek için de gereklidir. SpriteKit, her karedeki etkileşimlerin sayısını sınırlamak için iki mekanizma kullanır:

Kenar tabanlı fizik kütleleri, diğer kenar tabanlı bedenlerle asla etkileşime girmez. Bu, düğümleri yeniden konumlandırarak kenar tabanlı cisimleri hareket ettirseniz bile, fizik bedenlerinin asla çarpışmayacağı veya birbirleriyle temas etmeyeceği anlamına gelir.

Her fizik bedeni kategorize edilir. Kategoriler uygulamanız tarafından tanımlanmıştır; Her sahnede 32 kategoriye kadar olabilir. Bir fizik gövdesini yapılandırdığınızda, hangi kategorilere ait olduğunu ve hangi kategorilerle etkileşim kurmak istediğini tanımlarsınız. Kişiler ve çarpışmalar ayrı ayrı belirtilir.

Aşağıdaki kod bir kırmızı ve mavi bir top ve bir dizi noktadan oluşturulmuş bir zemin nesnesini oluşturur. Kırmızı topu yere ait categoryBitMask ile eşleşen bir collisionBitMask vererek, kırmızı top onu sarar. Ancak, mavi topun collisionBitMask farklı bir değere ayarlandı ve yerle etkileşime girmiyor:

let ballRadius: CGFloat = 20
let redBall = SKShapeNode(circleOfRadius: ballRadius)
redBall.fillColor = .red
redBall.position = CGPoint(x: 280, y: 320)
redBall.physicsBody = SKPhysicsBody(circleOfRadius: ballRadius)

let blueBall = SKShapeNode(circleOfRadius: ballRadius)
blueBall.fillColor = .blue
blueBall.position = CGPoint(x: 360, y: 320)
blueBall.physicsBody = SKPhysicsBody(circleOfRadius: ballRadius)

var splinePoints = [CGPoint(x: 0, y: 300),
                    CGPoint(x: 100, y: 50)
                    CGPoint(x: 400, y: 110),
                    CGPoint(x: 640, y: 20)]
let ground = SKShapeNode(splinePoints: &splinePoints,
                         count: splinePoints.count)
ground.physicsBody = SKPhysicsBody(edgeChainFrom: ground.path!)
ground.physicsBody?.restitution = 0.75

redBall.physicsBody?.collisionBitMask = 0b0001
blueBall.physicsBody?.collisionBitMask = 0b0010
ground.physicsBody?.categoryBitMask = 0b0001

var categoryBitMask: UInt32

Bu fizik bedeninin hangi kategorilere ait olduğunu tanımlayan bir maske.

var collisionBitMask: UInt32

Hangi fizik kütlesi kategorilerinin bu fizik kütlesi ile çarpışabileceğini tanımlayan bir maske.

var usesPreciseCollisionDetection: Bool

Fizik dünyasının daha hassas bir çarpışma tespit algoritması kullanıp kullanmadığını belirleyen bir Boole değeri.

var contactTestBitMask: UInt32

Hangi vücut kategorilerinin bu fizik kütlesi ile kesişim bildirimlerine neden olduğunu tanımlayan bir maske.

func allContactedBodies()

Bu fizik bedeninin fizik bedenleri ile temas halindedir.

Fizik Bedenine Kuvvetler ve Darbelerin Uygulanması

Fizik Body’lerinin Taşınması

Varsayılan olarak, olaydaki fizik bedenlerine sadece yerçekimi uygulanır. Bazı durumlarda, bu bir oyun inşa etmek için yeterli olabilir. Ancak çoğu durumda, fizik bedenlerinin hızını değiştirmek için başka adımlar atmanız gerekir.

İlk olarak, hızını ve angular(açısal)Velocity özelliklerini ayarlayarak bir fizik bedeninin hızını doğrudan kontrol edebilirsiniz. Diğer birçok özellikte olduğu gibi, fizik bedeni ilk oluşturulduğunda bu özellikleri bir kez ayarlarsınız ve daha sonra fizik simülasyonunun bunları gerektiği şekilde ayarlamasına izin verirsiniz. Örneğin, bir an için bir roket gemisinin füzeleri ateşleyebileceği uzay tabanlı bir oyun yaptığınızı varsayın. Gemi bir füze ateşlediğinde, füzenin geminin başlangıç hızı ve fırlatma yönünde ek bir vektör olması gerekir. Aşağıdaki kod, fırlatma hızını hesaplamak için bir uygulamayı göstermektedir.

missile.physicsBody?.velocity = self.physicsBody!.velocity
missile.physicsBody?.applyImpulse(CGVector(dx: missileLaunchImpulse * cos(shipDirection),
                                           dy: missileLaunchImpulse * sin(shipDirection)))

Bir vücut simülasyonda olduğunda, vücuda uygulanan kuvvetlere göre hızın ayarlanması daha yaygındır. Bir başka hız değişimi, çarpışmalar daha sonra tartışılmaktadır.

Bir vücuda uygulanan varsayılan kuvvetler koleksiyonu şunları içerir:

  • Fizik dünyasının uyguladığı yerçekimi kuvveti
  • Vücudun kendi özellikleri tarafından uygulanan sönümleme kuvvetleri
  • Sistemdeki başka bir bedenle temasa dayanan sürtünme kuvveti

Kendi kuvvetlerini ve dürtülerini fizik bedenlerine de uygulayabilirsiniz. Çoğu zaman, simülasyon gerçekleştirilmeden önce bir ön işleme adımında kuvvetler ve impulslar uygularsınız. Oyun mantığınız, hangi kuvvetlerin uygulanması gerektiğini belirlemek ve bu kuvvetleri uygulamak için uygun yöntem çağrılarını yapmaktan sorumludur.

Bir kuvvet veya itme uygulamak için seçim yapabilirsiniz:

  • Kuvveti uygularken ve benzetimin bir sonraki karesi işlendiğinde geçen zaman arasında geçen zaman süresine bağlı olarak bir kuvvet uygulanır. Yani, bir gövdeye sürekli bir kuvvet uygulamak için, her yeni bir çerçeve işlendiğinde uygun yöntem çağrılarını yapmanız gerekir. Kuvvetler genellikle sürekli etkiler için kullanılır
  • Bir dürtü, geçtiği simülasyon zamanından bağımsız olarak vücudun hızına anlık bir değişiklik yapar. İmpulslar genellikle vücudun hızındaki ani değişiklikler için kullanılır.

Roket örneğiyle devam etmek için, bir roket gemisi muhtemelen motorlarına döndüğünde kendisine bir kuvvet uygular. Bununla birlikte, bir füze ateşlediğinde, füzeyi roketin kendi hızı ile başlatabilir ve daha sonra ilk patinaj hızını vermek için tek bir impuls uygulayabilir.

Kuvvetler ve dürtüler aynı kavramı modellediğinden (bir vücut hızını ayarlama) bu bölümün geri kalanı güçlere odaklanır.

Bir cisme üç yoldan biriyle kuvvet uygulayabilirsiniz:

  • Vücudun doğrusal hızını etkileyen doğrusal bir kuvvet.
  • Sadece vücudun açısal hızını etkileyen açısal bir kuvvet.
  • Vücut üzerindeki bir noktaya uygulanan bir kuvvet. Fizik simülasyonu, nesnenin şekline ve kuvvetin uygulandığı noktaya dayanarak vücudun açısal ve doğrusal hızındaki ayrı değişiklikleri hesaplar.

Aşağıdaki kod, gemiye bir kuvvet uygulamak için bir sprite alt sınıfında uygulayabileceğiniz kodu göstermektedir. Bu kuvvet, ana motorlar aktive edildiğinde roketi hızlandırır. Motorlar roketin arka tarafında olduğundan, kuvvet roket gövdesine doğrusal olarak uygulanır. Kod, roketin mevcut yönlendirmesine dayalı olarak itme vektörünü hesaplar. Yönlendirme, ilgili düğümün zRotation özelliğine dayanır, ancak resmin yönü, düğümün oryantasyonundan farklı olabilir. İtme her zaman sanat eseri ile yönlendirilmelidir. Aşağıdaki kod benzer bir etki gösterir, ancak bu sefer roket kuvvet tarafından döndürülür, böylece itme açısal itme olarak uygulanır.

self.physicsBody?.applyTorque(thrust)

func applyForce(CGVector)

Bir fizik kütlesinin ağırlık merkezine bir kuvvet uygular.

func applyTorque(CGFloat)

Bir nesneye bir tork uygular.

func applyForce(CGVector, at: CGPoint)

Bir fizik kütlesinin belirli bir noktasına bir kuvvet uygular.

func applyImpulse(CGVector)

Bir fizik kütlesinin ağırlık merkezine bir dürtü uygular.

func applyAngularImpulse(CGFloat)

Bir nesneye açısal momentum kazandıran bir impuls uygular.

func applyImpulse(CGVector, at: CGPoint)

Bir fizik kütlesinin belirli bir noktasına bir dürtü uygular.

Fizik Beden Konumunun ve Hızının İncelenmesi

var velocity: CGVector

Fizik gövdesinin hız vektörü, saniyede metre cinsinden ölçülür.

var angularVelocity: CGFloat

Fizik gövdesinin açısal hızı.

var isResting: Bool

Nesnenin fizik simülasyonu içinde durup durmadığını gösteren bir Boolean özelliği.

Fizik Bedeninin Düğümünü Okuma

var node: SKNode?

Bu bedenin bağlı olduğu düğüm.

Bir Fizik Bedenine Hangi Eklemlerin Bağlandığını Belirleme

var joints: [SKPhysicsJoint]

Bu fizik bedenine bağlı eklemler.

Fizik Alanları ile Etkileşim

var fieldBitMask: UInt32

Bu fizik kütlesi üzerinde hangi fizik alanlarının kategorilerini zorlayacağını tanımlayan bir maske.

var charge: CGFloat

Fizik bedeninin elektriksel yükü.

Düğümün Ebeveynine Fizik Gövdesi Sabitleme

var pinned: Bool

Fizik gövdesinin düğümünün ana düğümüne sabitlenip sabitlenmediğini gösteren Boole değeri.

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.