Tek bir görsel ya da ses dosyası olmadan SpriteKit oyunu: Street Legends'ı nasıl yaptık?

Street Legends tek bir görsel ya da ses dosyası olmadan yayında. Her forma, top, saha ve düdük kodla üretiliyor. Nasıl yaptığımızı ve sizin neden aynısını isteyebileceğinizi anlatıyoruz.

Mustafa GüderKurucu, GuderTech4 dk okuma
spritekit-game-without-asset-files.md

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.

PaylaşXLinkedInWhatsApp
Mustafa Güder

Yazar hakkında

Mustafa Güder

Mustafa Güder, GuderTech’in kurucusu ve iOS geliştiricisi. Avustralya’da iki yıl eğitim aldıktan sonra Adana’ya dönerek Scevia, Paw & Home ve Street Legends’ı geliştirdi.

Avustralya, 2 yıl Adana, Türkiye

Tüm yazılar