Street Legends, iPhone için geliştirdiğimiz hızlı, beşe beş bir sokak futbolu oyunu; tırmanılacak bir lig, dokuz oyunculu bir kadro ve açılacak formalarla. Uygulama paketini açtığınızda tek bir PNG ya da ses dosyası bulamazsınız. Her görsel ve her ses çalışma anında Swift ile üretiliyor.
Bir oyunu neden böyle geliştirelim?
- Küçük indirme boyutu: doku atlasları ya da ses paketleri yok, uygulama saniyeler içinde kuruluyor
- Her boyutta keskin: şekiller en küçük iPhone'dan iPad'e kadar tam o ekran için çiziliyor
- Sonsuz varyasyon: yeni bir forma yeni bir görsel seti değil, birkaç renk demek
- Hızlı deneme: bir sayıyı değiştirin, tüm oyun güncellensin; dışa aktarma adımı yok
Bunun bedeli, bir illüstratöre dosya teslim edememeniz. Bu yaklaşım stilize, geometrik çizimlere uyuyor; tam da istediğimiz görünüm.
Core Graphics ile sprite çizmek
Karmaşık şekilleri her karede SKShapeNode ile çizmek pahalıdır. Bunun yerine UIGraphicsImageRenderer ile bir kez bir görsele çiziyor ve onu bir dokuya dönüştürüyoruz:
import SpriteKit
import UIKit
func ballTexture(diameter: CGFloat) -> SKTexture {
let size = CGSize(width: diameter, height: diameter)
let image = UIGraphicsImageRenderer(size: size).image { context in
let rect = CGRect(origin: .zero, size: size)
UIColor.white.setFill()
context.cgContext.fillEllipse(in: rect)
UIColor.black.setFill()
let patch = rect.insetBy(dx: diameter * 0.34, dy: diameter * 0.34)
context.cgContext.fillEllipse(in: patch)
}
return SKTexture(image: image)
}
let ball = SKSpriteNode(texture: ballTexture(diameter: 28))
Dokular parametrelerine göre önbelleğe alınıyor; böylece her biri bir kez çiziliyor ve ihtiyaç duyan her düğüm tarafından yeniden kullanılıyor. Formalar da aynı şekilde çalışıyor: takımın renkleriyle doldurulmuş bir forma şekli ve üstüne çizilmiş bir numara.
AVAudioEngine ile ses üretmek
Ses efektleri, bir zarfa sahip kısa dalga biçimleridir. AVAudioSourceNode, örnekleri doğrudan yazmanıza izin verir:
import AVFoundation
final class Synth {
private let engine = AVAudioEngine()
private var phase = 0.0
private var frequency = 0.0
private var amplitude = 0.0
init() {
let sampleRate = engine.outputNode.inputFormat(forBus: 0).sampleRate
let source = AVAudioSourceNode { [unowned self] _, _, frameCount, bufferList -> OSStatus in
let buffers = UnsafeMutableAudioBufferListPointer(bufferList)
for frame in 0..<Int(frameCount) {
let sample = Float(sin(phase) * amplitude)
phase += 2 * .pi * frequency / sampleRate
if phase > 2 * .pi { phase -= 2 * .pi }
amplitude *= 0.9993 // quick decay, like a plucked sound
for buffer in buffers {
buffer.mData?.assumingMemoryBound(to: Float.self)[frame] = sample
}
}
return noErr
}
let format = AVAudioFormat(standardFormatWithSampleRate: sampleRate, channels: 1)
engine.attach(source)
engine.connect(source, to: engine.mainMixerNode, format: format)
try? engine.start()
}
func kick() {
frequency = 90
amplitude = 0.7
}
}
Bir şut sesi hızla düşen pes bir tondur. Düdük, biraz titreşimli tiz bir tondur. Seyirci sesi, golden sonra kabaran filtrelenmiş rastgele gürültüdür. Bu üreteçlerden bir avuç dolusunu birleştirmek oyundaki her sesi karşılıyor.
Hızlı tutmak
- Dokuları
update(_:)içinde değil, yükleme sırasında bir kez çizin - Tekrarlanan efektler için yeni düğüm oluşturmak yerine mevcutları yeniden kullanın
- SpriteKit fizik gövdelerinde basit şekiller kullanın; oyuncular ve top için daireler
- Performansı en yeni cihazda değil, desteklediğiniz en eski cihazda ölçün
Prosedürel çizim ne zaman doğru seçim?
Geometrinin estetiğin kendisi olduğu arcade oyunlarda, bulmaca oyunlarında ve stilize dünyalarda parlar. Resimsi ya da karakter ağırlıklı çizimlerde bir sanatçı ve doku atlası hâlâ daha iyi araçtır; match-3 oyunumuz Paw & Home bu tarafın iyi bir örneği.
Bir oyun mu yaptırmak istiyorsunuz? Bize anlatın. SpriteKit, SceneKit ve Unity ile geliştiriyoruz.
Sık sorulan sorular
SpriteKit 2026'da iOS oyunları için hâlâ iyi bir seçim mi?
Evet, Apple platformlarındaki 2D oyunlar için. Hafif, yerel ve Game Center ile StoreKit'e iyi entegre. Cross-platform ya da yoğun 3D oyunlar için genellikle Unity daha uygundur.
Prosedürel ses, kayıtlı sesten kötü mü duyulur?
Şut, tık ve düdük gibi kısa efektlerde harika duyulabilir ve çok az yer kaplar. Müzik ve insan sesi için kayıtlar hâlâ daha iyi seçimdir.
Doku üretmek uygulamanın açılışını yavaşlatır mı?
Yalnızca her karede çizerseniz. Açılışta bir kez çizilip önbelleğe alınan basit dokular milisaniyeler sürer.
Bir SpriteKit oyunu ne kadar küçük olabilir?
Görsel ve ses dosyaları olmadan eksiksiz bir oyun yalnızca birkaç megabayt olabilir; bunun çoğu derlenmiş koddur.