iMedre

SKPhysicsWorld Sınıfı Ve Fonksiyonları – Sprite Kit Derinlikleri #35

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

SKPhysicsWorld Sınıfı Nedir?

Bir sahnenin fizik simülasyonunu içine alan bir nesne.

Genel Bakış

SKPhysicsWorld nesnesi, çarpışmaları ve diğer fiziksel özellikleri simüle eder. SKPhysicsWorld nesneleri doğrudan oluşturmazsınız; bunun yerine, bir SKScene nesnesinin physicsWorld özelliğini okuyun. Fizik dünyası nesnesi, aşağıdaki görevleri gerçekleştirmenizi sağlar:

  • Yerçekimi gibi simülasyon için global özellikleri ayarla
  • Sahnede iki fizik gövdesi arasında eklemler oluşturun
  • İki fizik gövdesi birbiriyle temas halinde olduğunda bildirim almak için bir temsilci belirleyin.
  • Sahne içindeki hangi fizik cisimlerinin noktaları, dikdörtgenleri veya ışınlarla kesiştiğini belirleyin.

Fizik Dünyasını Yapılandırma

Bir sahnedeki tüm fizik bedenleri, sahneye bağlı bir SKPhysicsWorld nesnesi tarafından SpriteKit’te temsil edilen fizik dünyasının bir parçasıdır. Fizik dünyası, simülasyonun iki önemli özelliğini tanımlar:

  • Gravity özelliği simülasyondaki hacim temelli cisimlere bir hızlanma uygular. affectedByGravity özelliğini false olarak ayarlayan statik birimler ve fizik gövdeleri etkilenmez.
  • Speed özelliği, simülasyonun çalıştığı hızı belirler.

Fizik Cisimlerini Aramak

Bazen, olay yerinde fizik bedenleri bulmak gerekir. Örneğin, şunları yapmanız gerekebilir:

  • Bir fizik bedeninin sahnenin bir bölgesinde bulunup bulunmadığını keşfedin.
  • Bir fizik gövdesinin (oyuncu tarafından kontrol edilen gibi) belirli bir çizgiyi geçtiğinde algıla.
  • İki nesne arasında bir duvar gibi başka bir fizik bedeninin bulunup bulunmadığını görmek için iki fizik cismi arasındaki görüş çizgisini izleyin.
  • Bir gövde ile bir sahnenin dinleyici düğümü arasında bir ses düğümü varsayalım.

Bazı durumlarda, bu etkileşimleri çarpışmalar ve irtibat sistemi kullanarak gerçekleştirebilirsiniz. Örneğin, bir fizik bedeninin bir bölgeye girdiğinde, bir fizik kütlesi oluşturabilir ve sahnede görünmez bir düğüme ekleyebilirsiniz. Daha sonra, fizik cisim çarpışma maskesini, hiçbir şeyle çarpışmayacak şekilde, ve ilgilenen fizik bedenlerini tespit etmek için temas maskesini yapılandırın. İstenen etkileşimler gerçekleştiğinde, iletişim temsilcisine başvurulur.

Ancak, bu tasarımı kullanarak görüş alanı gibi kavramları uygulamak kolay değildir. Bunları uygulamak için sahnenin fizik dünyasını kullanırsınız. Fizik dünyası ile belirli bir noktayı veya dikdörtgeni kesişen bir ışın veya fizik gövdesi boyunca tüm fizik bedenlerini arayabilirsiniz.

Bir örnek, temel tekniği göstermektedir. Aşağıdaki kod, görüş hattı algılama sisteminin olası bir uygulamasını göstermektedir. Röntgen boyunca en yakın fizik bedenini araştırmak için sahnenin orijini ile belirli bir yönde bir ışın oluşturur. Eğer bir fizik kütlesi bulursa, bunun kategori maskesini, bunun saldırması gereken bir hedef olup olmadığını kontrol eder. Saldırı için belirlenmiş bir hedefi görürse, topu vurur.

func isTargetVisibleAtAngle(angle: CGFloat, distance: CGFloat) -> Bool {
    let rayStart = CGPoint.zero
    let rayEnd = CGPoint(x: distance * cos(angle),
                         y: distance * sin(angle))
    
    let body = scene.physicsWorld.body(alongRayStart: rayStart, end: rayEnd)
    
    return body?.categoryBitMask == targetCategory
}
func attackTargetIfVisible() {
    if isTargetVisibleAtAngle(angle: cannon.zRotation, distance: 512) {
        shootCannon()
    }
}

Aynı davranışı uygulamaya koymanın bir başka yolu da, ışının başlangıç ve bitiş konumlarını, sahnenizdeki iki fizik birimininkilere ayarlamaktır. Örneğin, oyuncunun oyun nesnesinin konumunu bir konum olarak ve bir düşman biriminin konumunu diğer konum olarak kullanabilirsiniz.

Ayrıca vücut kullanarak bir nokta veya dikdörtgeni kesişen fizik bedenleri için de arama yapabilirsiniz body(at: ) ve vücutta body(in: ) yöntemlerinde.

Bazen sahne içindeki en yakın fizik bedenine dayanarak basit bir belirleme yapamazsınız. Örneğin, oyununuzun mantığında, tüm fizik bedenlerinin görüş alanını engellemediğine karar verebilirsiniz. Bu durumda, enumerateBodies (alongRayStart: end: using : ) yöntemini kullanarak ışın boyunca tüm fizik gövdelerini numaralandırmanız gerekir. Ray boyunca her vücut için bir kez çağrılan bir blok sağlarsınız. Bu bilgiyi, görüş hattının bir hedefe var olup olmadığı konusunda daha bilinçli bir karar vermek için kullanabilirsiniz.

Fonksiyonlar

Fizik Dünyası Simülasyonunu(Physics World) Yapılandırma

var gravity: CGVector

Fizik dünyasındaki fizik bedenlerine uygulanan yerçekimi ivmesini belirten bir vektör.

var speed: CGFloat

Simülasyonun yürütme hızı.

Fizik Body’leri Birleştirmek

func add(SKPhysicsJoint)

Fizik dünyasına bir eklem ekler.

func removeAllJoints()

Tüm eklemleri fizik dünyasından kaldırır.

func remove(SKPhysicsJoint)

Fizik dünyasından belirli bir eklemi kaldırır.

Fizik Dünyasında Çarpışmaların Tespiti

var contactDelegate: SKPhysicsContactDelegate?

İki fizik kütlesi birbiriyle temas ettiğinde çağrılan bir temsilci.
İki fizik gövdesi çakıştığında ve fizik gövdelerinden birinin diğer gövdenin categoryBitMask özelliğiyle çakışan bir contactTestBitMask özelliği olduğunda bir kişi oluşturulur. Varsayılan olarak, bir fizik kütlesinin contactTestBitMask, temizlenen tüm bitlere ayarlanmıştır.

Fizik Dünyasındaki Body’leri Aramak

func body(alongRayStart: CGPoint, end: CGPoint)

Bir ışınla kesişen ilk fizik bedenini arar.

func body(at: CGPoint)

Bir noktada  ilk fizik bedenini arar.

func body(in: CGRect)

Belirtilen dikdörtgeni kesişen ilk fizik gövdesini arar.

func enumerateBodies(alongRayStart: CGPoint, end: CGPoint, using: (SKPhysicsBody, CGPoint, CGVector, UnsafeMutablePointer<ObjCBool>) -> Void)

Bir ışınla kesişen sahnedeki tüm fizik bedenlerini numaralandırır.

func enumerateBodies(at: CGPoint, using: (SKPhysicsBody, UnsafeMutablePointer<ObjCBool>) -> Void)

Sahnede bir nokta içeren tüm fizik bedenlerini numaralandırır.

func enumerateBodies(in: CGRect, using: (SKPhysicsBody, UnsafeMutablePointer<ObjCBool>) -> Void)

Belirtilen dikdörtgeni kesişen sahnedeki tüm fizik bedenlerini numaralandırır.

Fizik Alanları ile Çalışmak

func sampleFields(at: vector_float3)

Sahnedeki tüm alan düğümlerini örnekler ve bu noktada kuvvetlerinin toplamını döndürü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.