SpriteKit یک فریمورک از اپل برای توسعه بازیهای دوبعدی در iOS، macOS، tvOS و watchOS است. این فریمورک اجزای آمادهای برای کار با گرافیک، فیزیک، انیمیشن و صدا فراهم میکند و به توسعهدهندگان اجازه میدهد روی گیمپلی تمرکز کنند. طبق دادههای Apple WWDC (2025)، SpriteKit در بیش از ۲۰۰ هزار برنامه در App Store استفاده میشود.
نکات اصلی
SpriteKit یک فریمورک برای گرافیک دوبعدی و بازی است که بخشی از SDK اپل محسوب میشود. SpriteKit که در سال ۲۰۱۳ با iOS 7 معرفی شد، API سطح بالایی برای رندر اسپرایتها، کار با انیمیشن، فیزیک، ذرات و صدا فراهم میکند. این فریمورک با Xcode و Interface Builder یکپارچه شده است که ساخت صحنههای بازی را آسانتر میکند.
برخلاف موتورهای بازی مانند Unity، SpriteKit برای پلتفرمهای اپل بهینه شده و از شتاب سختافزاری از طریق Metal API استفاده میکند. این امر مصرف انرژی پایین در دستگاههای موبایل و عملکرد بالا حتی در مدلهای قدیمیتر آیفون را تضمین میکند. رندر از طریق Metal در تمام دستگاههای دارای iOS 12 و جدیدتر در دسترس است.
اکوسیستم SpriteKit شامل یکپارچگی با GameplayKit (الگوریتمها و هوش مصنوعی)، AVFoundation (ویدئو و صدا)، Core Image (فیلترها) و ARKit (واقعیت افزوده) است. طبق دادههای اپل (۲۰۲۵)، SpriteKit رزولوشن تا ۸K را در دستگاههای دارای تراشه A17 Pro و جدیدتر پشتیبانی میکند و ۱۲۰ FPS را در iPad Pro ارائه میدهد.
اولین نسخه SpriteKit با iOS 7 همراه با iPhone 5s ظاهر شد. پیش از آن، توسعهدهندگان از Core Graphics یا کتابخانههای شخص ثالث مانند Cocos2D استفاده میکردند. SpriteKit 2.0 (iOS 10) پشتیبانی از Metal، شیدرها (فایلهای .fsh) و سیستم ذرات بهبودیافته را اضافه کرد. SpriteKit 3.0 (iOS 17) پشتیبانی بومی از Game Controller و قابلیتهای گسترده PhysicsKit را معرفی کرد.
با انتشار iOS 18 (۲۰۲۴)، SpriteKit پشتیبانی از Swift 6 با امنیت کامل نخ و یکپارچگی با SwiftUI از طریق UIViewRepresentable دریافت کرد. این امر امکان استفاده از SpriteKit را نه تنها برای بازیها، بلکه برای انیمیشنهای UI، نمودارهای تعاملی و تجسم دادهها در برنامههای معمولی فراهم کرد.
معماری SpriteKit بر اساس گراف صحنه (scene graph) ساخته شده است. عنصر ریشه SKScene است که شامل درختی از اشیاء SKNode میشود. هر گره دارای تبدیل (موقعیت، چرخش، مقیاس) است و گرههای فرزند تبدیل والد را به ارث میبرند. این امر ایجاد سلسلهمراتب پیچیده مانند شخصیتی با سلاح متصل را ساده میکند.
SKScene گره ریشهای است که چرخه بهروزرسانی بازی را مدیریت میکند. متد update(_ currentTime:) قبل از هر فریم فراخوانی میشود و زمان جاری را بر حسب ثانیه دریافت میکند. اندازه صحنه بر حسب نقاط (points) تعیین و به طور خودکار از طریق scaleMode با اندازه صفحه تطبیق مییابد. حالتهای .aspectFill، .aspectFit، .fill و .resizeFill در دسترس هستند.
import SpriteKit
class GameScene: SKScene {
override func didMove(to view: SKView) {
self.backgroundColor = SKColor.black
self.scaleMode = SKSceneScaleMode.aspectFill
let sprite = SKSpriteNode(imageNamed: "player")
sprite.position = CGPoint(x: 100, y: 100)
addChild(sprite)
}
override func update(_ currentTime: TimeInterval) {
// منطق بازی در هر فریم
}
}
متد didMove(to view:) یک بار هنگام نمایش صحنه در SKView فراخوانی میشود. در آن اشیاء اولیه ایجاد و پارامترهای صحنه تنظیم میشوند. متد update هر فریم اجرا میشود و برای محاسبه جابجاییها، بررسی برخوردها و بهروزرسانی وضعیت بازی استفاده میگردد.
SKNode کلاس پایه برای همه اشیاء در گراف صحنه است. به صورت بصری نمایش داده نمیشود، اما دارای تبدیل است و میتواند گرههای فرزند داشته باشد. زیرکلاسهای اصلی: SKSpriteNode (تصویر)، SKLabelNode (متن)، SKShapeNode (اشکال) و SKEmitterNode (ذرات). هر گره دارای نام منحصربهفرد برای جستجو از طریق childNode(withName:) است.
SKShapeNode امکان رسم اشکال دلخواه: مستطیلها، دایرهها، خطوط و مسیرهای مبتنی بر CGPath را فراهم میکند. این برای نمونهسازی اولیه اشیاء بازی بدون اسپرایتهای آماده مفید است. برای تولید نهایی توصیه میشود از SKSpriteNode با بافتها استفاده شود، زیرا رندر اشکال از طریق Core Graphics کندتر از رندر سختافزاری بافتها است.
سیستم مختصات SpriteKit از دستگاه مختصات دکارتی چپدست با مبدأ در گوشه پایین سمت چپ استفاده میکند. موقعیت گره بر حسب CGPoint نسبت به والد تعیین میشود. ویژگی zPosition ترتیب رندر را مشخص میکند: گرههای با zPosition بزرگتر روی گرههای با مقدار کوچکتر رسم میشوند.
SKView یک UIView است که محتوای SKScene را نمایش میدهد. این چرخه رندر، جابجایی بین صحنهها و اطلاعات اشکالزدایی را مدیریت میکند. ویژگی showsFPS نمایش نرخ فریم، showsNodeCount — تعداد گرههای صحنه، showsPhysics — تجسم اجسام فیزیکی برای اشکالزدایی را فعال میکند.
در SwiftUI، SpriteKit از طریق SpriteView جاسازی میشود — پوششی که از انیمیشنها، توقف و یکپارچگی با ژستها پشتیبانی میکند. طبق دادههای اپل (۲۰۲۵)، SpriteView از همان رندرر GPU Metal مانند UIView استفاده میکند، بدون افت عملکرد. این امکان ایجاد رابطهای ترکیبی با انیمیشنهای SpriteKit درون SwiftUI را فراهم میکند.
موتور فیزیک SpriteKit شبیهسازی اجسام صلب را با پشتیبانی از گرانش، برخوردها، اصطکاک و کشسانی فراهم میکند. به هر SKSpriteNode میتوان از طریق ویژگی physicsBody یک جسم فیزیکی اختصاص داد. انواع اجسام: .static (ثابت)، .dynamic (متحرک تحت نیروها) و .kinematic (کنترل دستی با برخورد).
SKPhysicsBody شکل و ویژگیهای فیزیکی گره را تعیین میکند. شکل میتواند مستطیلی، دایرهای یا دلخواه بر اساس CGPath باشد. هر جسم دارای ماسکهای بیتی است: categoryBitMask، collisionBitMask و contactBitMask که برخوردها و اعلانهای برخورد را از طریق SKPhysicsContactDelegate مدیریت میکنند.
// تنظیم فیزیک اسپرایت
let player = SKSpriteNode(imageNamed: "ship")
player.physicsBody = SKPhysicsBody(rectangleOf: player.size)
player.physicsBody?.categoryBitMask = 1
player.physicsBody?.collisionBitMask = 2
player.physicsBody?.contactTestBitMask = 2
extension GameScene: SKPhysicsContactDelegate {
func didBegin(_ contact: SKPhysicsContact) {
// مدیریت برخورد
}
}
دلیگیت didBegin هنگام شروع برخورد دو جسم فیزیکی فراخوانی میشود. شی contact شامل ارجاعات به هر دو جسم (bodyA، bodyB) و نقطه تماس (contactPoint) است. برای تشخیص برخورد بین دستههای خاص از ماسکهای بیتی با لایههای برخورد قابل تنظیم استفاده میشود.
SKAction سیستمی از انیمیشنهای اعلامی است که امکان جابجایی، چرخش، مقیاس و تغییر شفافیت گرهها را بدون مدیریت دستی در متد update فراهم میکند. اکشنها میتوانند به صورت ترتیبی (sequence)، موازی (group)، تکراری (repeatForever) یا انتظاری (wait) اجرا شوند.
مثال انیمیشن گشتزنی یک NPC دشمن:
// انیمیشن گشتزنی دشمن
let moveRight = SKAction.moveBy(
x: 200, y: 0, duration: 2.0
)
let moveLeft = SKAction.moveBy(
x: -200, y: 0, duration: 2.0
)
let wait = SKAction.wait(forDuration: 1.0)
let patrol = SKAction.sequence([moveRight, wait, moveLeft, wait])
enemy.run(SKAction.repeatForever(patrol))
سیستم SKActions از ۱۰۰۰ اکشن همزمان بدون کاهش عملکرد در دستگاههای دارای A14+ پشتیبانی میکند. اکشنها میتوانند به هر SKNode از جمله سلسلهمراتب کامل اعمال شوند. برای بازخورد، بخش completion در نظر گرفته شده است که پس از اتمام دنباله اجرا میشود.
SKEmitterNode یک گره تخصصی برای ایجاد افکتهای ذرات: دود، آتش، باران و انفجار است. پارامترهایEmitter از طریق فایل .sks در Xcode یا به صورت برنامهنویسی تنظیم میشوند. پارامترهای کلیدی: birthRate (نرخ تولید)، lifetime (عمر ذرات)، speed (سرعت) و alphaSpeed (نرخ محو شدن).
طبق دادههای اپل (۲۰۲۴)، SKEmitterNode برای GPU بهینه شده و از ۱۰ هزار ذره همزمان با نرخ ۶۰ FPS پشتیبانی میکند. ذرات میتوانند بافتدار و متحرک باشند. برای افکتهای پیچیده توصیه میشود چندینEmitter با پارامترهای مختلف روی هم قرار داده شوند.
توسعه با SpriteKit با تنظیم SKView در کنترلر یا SwiftUI View آغاز میشود. سپس زیرکلاسی از SKScene ایجاد میشود که جهان بازی در آن توصیف میگردد. SpriteKit از ویرایشگر صحنه در Xcode (فایلهای .sks) پشتیبانی میکند که امکان چیدمان بصری گرهها و تنظیم ویژگیها بدون نوشتن کد را فراهم میکند.
SKTransition انیمیشن بین صحنهها را مدیریت میکند. انواع موجود: fade، moveIn، push، reveal، flip، doors و crossFade. مدت زمان انتقال بر حسب ثانیه تعیین میشود. انتقالها میتوانند جهتدار (چپ، راست، بالا، پایین) و با پر کردن رنگی کانتینر ترکیب شوند.
// انتقال بین صحنهها
let newScene = GameScene(size: self.size)
let transition = SKTransition.push(
with: SKDirection.up, duration: 0.5
)
self.view?.presentScene(newScene, transition: transition)
متد presentScene(_:transition:) صحنه جاری را با انیمیشن به صحنه جدیدی جایگزین میکند. قبل از فراخوانی توصیه میشود صحنه جاری را متوقف و صداها را قطع کنید. برای بازگشت به صحنه قبلی از presentScene با جهت مخالف استفاده میشود. طبق دادههای اپل، انتقالهای push در iOS طبیعیتر از fade به نظر میرسند.
در SpriteKit مدیریت ورودی از طریق بازنویسی متدهای SKScene انجام میشود: touchesBegan، touchesMoved، touchesEnded و touchesCancelled. هر متد مجموعهای از لمسها (Set
برای پشتیبانی از گیمپد، SpriteKit از طریق فریمورک GameController با GCController یکپارچه میشود. در iOS 18 پشتیبانی از کنترلر مجازی روی صفحه برای بازیهایی که کنترلر فیزیکی ندارند اضافه شده است. طبق دادههای اپل (۲۰۲۵)، بیش از ۳۰٪ از بازیهای SpriteKit از گیمپد از طریق API استاندارد پشتیبانی میکنند.
SKAudioNode پخش صداها و موسیقی را با موقعیتیابی در فضای صحنه فراهم میکند. صداها به گرهها متصل میشوند و همراه با آنها حرکت میکنند. فرمتهای AAC، MP3، WAV و ALAC پشتیبانی میشوند. برای موسیقی پسزمینه از AVAudioPlayer از AVFoundation و برای افکتهای صوتی کوتاه از SKAction.playSoundFileNamed استفاده میشود.
سیستم میکسر صدا امکان تنظیم بلندی گروههای صدا: موسیقی، افکتها، صدا را فراهم میکند. طبق دادههای اپل (۲۰۲۴)، SpriteKit به طور خودکار بلندی صداها را با فاصله از دوربین صحنه تنظیم میکند و بدون کد اضافی افکت صدای فضایی ایجاد میکند.
بهینهسازی SpriteKit با استفاده از Sprite Sheetها (آطلسهای بافت) آغاز میشود. SKTextureAtlas اسپرایتهای متعدد را در یک بافت واحد ترکیب میکند و تعداد فراخوانیهای رندر (draw calls) را از چند صد به ۱–۲ کاهش میدهد. Xcode هنگام ساخت پروژه به طور خودکار از پوشههای تصویر آطلس میسازد.
SKTextureAtlas همه اسپرایتهای آطلس را با یک عملیات ورودی/خروجی بارگذاری میکند. طبق دادههای اپل (۲۰۲۵)، استفاده از آطلسها زمان بارگذاری صحنه را ۶۰–۷۰٪ در مقایسه با بارگذاری بافتهای جداگانه کاهش میدهد. آطلسها در GPU ذخیره میشوند و هنگام جابجایی بین صحنهها نیاز به بارگذاری مجدد ندارند.
دستهبندی خودکار (batching) در SpriteKit گرههای SKSpriteNode با بافتهای یکسان را در یک draw call ترکیب میکند. برای حداکثر کارایی توصیه میشود از بیش از ۱۰–۱۵ بافت منحصربهفرد در هر صحنه استفاده نشود. طبق WWDC 2024، رندر دستهای تا ۵۰۰ اسپرایت را در یک draw call بدون کاهش FPS پردازش میکند.
اشکالزدا SpriteKit در Xcode نمای بصری گراف صحنه را در زمان واقعی ارائه میدهد. این ابزار تعداد گرهها، draw calls، FPS و مصرف حافظه را نشان میدهد. فیلتر بر اساس کلاس گرهها امکان یافتن تنگناها را فراهم میکند: برای مثال SKShapeNode کندتر از SKSpriteNode رندر میشود.
Instruments با الگوی SpriteKit Profiler اطلاعات دقیقی از زمان رندر هر گره ارائه میدهد. طبق دادههای اپل (۲۰۲۵)، رایجترین مشکلات عملکرد: تعداد زیاد ذرات (بیش از ۱۰ هزار)، CGPath پیچیده برای SKPhysicsBody و ایجاد/حذف مکرر گرهها. استفاده مجدد از گرهها از طریق استخر اشیاء توصیه میشود.
SpriteKit میتواند به عنوان لایهرویه دوبعدی برای برنامههای ARKit استفاده شود. ARSKView SKView را گسترش میدهد و به طور خودکار صحنه SpriteKit را با دوربین ARKit همگام میکند. اشیاء در واقعیت افزوده میتوانند با اسپرایتهایی با موقعیتیابی نسبت به جهان واقعی از طریق ARAnchor نمایش داده شوند.
طبق دادههای اپل (۲۰۲۵)، ARSKView برای ساخت بازیهای AR، لایهرویههای اطلاعاتی و راهنماهای تعاملی استفاده میشود. به عنوان مثال، اسپرایتهای SpriteKit میتوانند نام اشیایی که دوربین به آنها نشانه رفته یا راهنمای انیمیشنی مونتاژ مبلمان را نشان دهند. عملکرد ARSKView به لطف رندرر یکپارچه Metal از SKView کمتر نیست.
سوالات متداول
SpriteKit فریمورک اپل برای ساخت بازیهای دوبعدی و گرافیک تعاملی در iOS، macOS، tvOS و watchOS است. برای توسعه بازیهای معمولی، انیمیشنهای UI و تجسمهای تعاملی با شتاب سختافزاری از طریق Metal استفاده میشود.
انواع اصلی: SKSpriteNode (اسپرایت)، SKLabelNode (متن)، SKShapeNode (شکل)، SKEmitterNode (ذرات)، SKVideoNode (ویدئو) و SKAudioNode (صدا). هر گره از SKNode ارثبری میکند و از تبدیلها و انیمیشنها پشتیبانی میکند.
SKAction یک انیمیشن اعلامی است که به طور خودکار بدون کد در update اجرا میشود. update دستی کنترل کامل روی هر فریم را فراهم میکند. SKAction برای حرکات معمولی سادهتر است، update برای فیزیک پیچیده و تولید رویهای.
از SKTextureAtlas برای ترکیب بافتها استفاده کنید، تعداد بافتهای منحصربهفرد را به ۱۰–۱۵ در هر صحنه محدود کنید و گرهها را از طریق استخر اشیاء بازاستفاده کنید. از طریق Xcode SpriteKit Debugger پروفایل کنید و در تولید نهایی از SKShapeNode اجتناب کنید.
بله، از طریق SpriteView — پوشش SwiftUI برای SpriteKit. SpriteView از انیمیشنها، توقف و یکپارچگی با ژستهای SwiftUI پشتیبانی میکند. این امکان ایجاد رابطهای ترکیبی با عناصر بازی درون یک برنامه معمولی را فراهم میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید