Game Development
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 }
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
}
}
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)
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
}