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:
Fizik dünyasındaki fizik bedenlerine uygulanan yerçekimi ivmesini belirten bir vektör.
var speed:
Simülasyonun yürütme hızı.
Fizik Body’leri Birleştirmek
func add(SKPhysics
Fizik dünyasına bir eklem ekler.
func remove
Tüm eklemleri fizik dünyasından kaldırır.
func remove(SKPhysics
Fizik dünyasından belirli bir eklemi kaldırır.
Fizik Dünyasında Çarpışmaların Tespiti
var contact
İ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(along
Bir ışınla kesişen ilk fizik bedenini arar.
func body(at:
Bir noktada ilk fizik bedenini arar.
func body(in:
Belirtilen dikdörtgeni kesişen ilk fizik gövdesini arar.
func enumerate
Bir ışınla kesişen sahnedeki tüm fizik bedenlerini numaralandırır.
func enumerate
Sahnede bir nokta içeren tüm fizik bedenlerini numaralandırır.
func enumerate
Belirtilen dikdörtgeni kesişen sahnedeki tüm fizik bedenlerini numaralandırır.
Fizik Alanları ile Çalışmak
func sample
Sahnedeki tüm alan düğümlerini örnekler ve bu noktada kuvvetlerinin toplamını döndürür.