← Back to Tutorials

13. GameKit & Games

Game Development

GameKit Basics

GameKit provides leaderboards, achievements, matchmaking, and real-time multiplayer:

import GameKit

// Authenticate local player
let localPlayer = GKLocalPlayer.local
localPlayer.authenticateHandler = { viewController, error in
    if let vc = viewController {
        // Present login UI
        self.present(vc, animated: true)
    } else if localPlayer.isAuthenticated {
        print("Player authenticated: \(localPlayer.alias ?? "")")
    }
}

// Report a score
let score = GKScore(leaderboardIdentifier: "com.example.leaderboard")
score.value = 1000
GKScore.report([score]) { error in }

// Report achievement
let achievement = GKAchievement(identifier: "first_win")
achievement.percentComplete = 100.0
GKAchievement.report([achievement]) { error in }

SpriteKit

Apple's 2D game engine with physics, animations, and particle systems:

import SpriteKit

class GameScene: SKScene {
    override func didMove(to view: SKView) {
        // Background
        backgroundColor = .black

        // Sprite node
        let player = SKSpriteNode(color: .white,
            size: CGSize(width: 50, height: 50))
        player.position = CGPoint(x: size.width / 2,
            y: size.height / 2)
        addChild(player)

        // Physics
        player.physicsBody = SKPhysicsBody(
            rectangleOf: player.size)
        player.physicsBody?.isDynamic = true

        // Gravity
        physicsWorld.gravity = CGVector(dx: 0, dy: -9.8)
    }

    override func touchesBegan(_ touches: Set<UITouch>,
        with event: UIEvent?) {
        // Handle touch
    }
}

SceneKit

3D game and graphics engine:

import SceneKit

let scene = SCNScene()

// Camera
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: 0, y: 0, z: 5)
scene.rootNode.addChildNode(cameraNode)

// 3D object (sphere)
let sphere = SCNSphere(radius: 1.0)
sphere.firstMaterial?.diffuse.contents = UIColor.red
let sphereNode = SCNNode(geometry: sphere)
scene.rootNode.addChildNode(sphereNode)

// Light
let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light?.type = .omni
lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
scene.rootNode.addChildNode(lightNode)

Animations

UIView animations are great for UIKit games:

UIView.animate(withDuration: 0.5, delay: 0,
    usingSpringWithDamping: 0.7,
    initialSpringVelocity: 0.5) {
    // Animate properties
    myView.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
    myView.alpha = 0.5
} completion: { finished in
    // Animation completed
}
Practice Task: Create a simple "Tap the Square" game with SpriteKit. A random square appears at a random position. The player must tap it within 1 second. Track the score and display it. Add GameKit leaderboard integration to persist high scores. Add an achievement for scoring 10 points.