+ All Categories
Home > Documents > Game play Kit - Due Munk

Game play Kit - Due Munk

Date post: 22-Jan-2022
Category:
Upload: others
View: 3 times
Download: 0 times
Share this document with a friend
84
Gems of Game play Kit NSSpain Tobias Due Munk 15 September 2017
Transcript
Page 1: Game play Kit - Due Munk

Gems— of —Game play Kit

NSSpain – Tobias Due Munk – 15 September 2017

Page 2: Game play Kit - Due Munk

iOStvOSmacOSwatchOS

Page 3: Game play Kit - Due Munk

iOStvOSmacOSwatchOS

Page 4: Game play Kit - Due Munk

“Unlike high-level game engines such as SpriteKit and SceneKit, GameplayKit is not involved in animating and rendering visual content. Instead, you ...GameplayKit Guide

Page 5: Game play Kit - Due Munk

... use GameplayKit to develop your gameplay mechanics and to design modular, scalable game architecture with

minimal effort.”

Page 6: Game play Kit - Due Munk

... use GameplayKit to develop your gameplay mechanics and to design modular, scalable game architecture with

minimal effort.”

Page 7: Game play Kit - Due Munk

○○○○

Page 8: Game play Kit - Due Munk

●○○○

Page 9: Game play Kit - Due Munk

Shufflearrays 

Page 10: Game play Kit - Due Munk

Naive

extension MutableCollection { mutating func shuffle() { guard count > 1 else { return } for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: count, to: 1, by: -1)) { let d = Int(arc4random_uniform(Int(unshuffledCount))) let i = index(firstUnshuffled, offsetBy: d) swapAt(firstUnshuffled, i) } }}

Stackoverflow

Page 11: Game play Kit - Due Munk

Naive

extension MutableCollection { mutating func shuffle() { guard count > 1 else { return } for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: count, to: 1, by: -1)) { let d = Int(arc4random_uniform(Int(unshuffledCount))) let i = index(firstUnshuffled, offsetBy: d) swapAt(firstUnshuffled, i) } }}

Page 12: Game play Kit - Due Munk

Naive

extension Sequence { func shuffled() -> [Element] { var result = Array(self) result.shuffle() return result }}

Page 13: Game play Kit - Due Munk

Naive

[0, 1, 2, 3].shuffled() // [2, 1, 0, 3]

Page 14: Game play Kit - Due Munk

Gem

import GameplayKit

Page 15: Game play Kit - Due Munk

Gem

import GameplayKitlet source = GKARC4RandomSource.sharedRandom()

Page 16: Game play Kit - Due Munk

Gem

import GameplayKitlet source = GKRandomSource.sharedRandom()source.arrayByShufflingObjects( in: [0, 1, 2, 3])

Fisher-Yates, StackOverflow

Page 17: Game play Kit - Due Munk

Gem

import GameplayKitlet source = GKRandomSource.sharedRandom()([0, 1, 2, 3] as NSArray) .shuffled(using: source)

Fisher-Yates

Page 18: Game play Kit - Due Munk

Gem

import GameplayKitextension Array { func shuffled( using source: GKRandomSource = .sharedRandom() ) -> [Element] { let nsArray = self as NSArray let shuffled = nsArray.shuffled(using: source) return shuffled as! [Element] }}

Page 19: Game play Kit - Due Munk

Gem

import GameplayKitextension Array { func shuffled( using source: GKRandomSource = .sharedRandom() ) -> [Element] { let nsArray = self as NSArray let shuffled = nsArray.shuffled(using: source) return shuffled as! [Element] }}

Page 20: Game play Kit - Due Munk

Gem

[0, 1, 2, 3].shuffled() // [2, 0, 1, 3]

Page 21: Game play Kit - Due Munk

●○○○

Page 22: Game play Kit - Due Munk

●●○○

Page 23: Game play Kit - Due Munk

Performant

VisualSearch

Page 24: Game play Kit - Due Munk

Matthias Tretter

Page 25: Game play Kit - Due Munk
Page 26: Game play Kit - Due Munk
Page 27: Game play Kit - Due Munk
Page 28: Game play Kit - Due Munk

Naive

let dots = [ CGPoint(x: 0, y: 0), CGPoint(x: 1, y: 1), CGPoint(x: 2, y: 0)]

Page 29: Game play Kit - Due Munk

Naive

let dots = [ CGPoint(x: 0, y: 0), CGPoint(x: 1, y: 1), CGPoint(x: 2, y: 0)]let selection = CGRect( origin: .zero, size: CGSize(width: 1, height: 1))

Page 30: Game play Kit - Due Munk

Naive

let dots = [ CGPoint(x: 0, y: 0), CGPoint(x: 1, y: 1), CGPoint(x: 2, y: 0)]let selection = CGRect( origin: .zero, size: CGSize(width: 1, height: 1))

Page 31: Game play Kit - Due Munk

Naive

dots.filter { dot in return selection.contains(dot)}

Page 32: Game play Kit - Due Munk

Gem

import GameplayKit

Page 33: Game play Kit - Due Munk

Gem

import GameplayKitlet tree = GKRTree<Point>(maxNumberOfChildren: 10)

Page 34: Game play Kit - Due Munk

Gem

import GameplayKitclass Point: NSObject { let x: CGFloat let y: CGFloat}

Page 35: Game play Kit - Due Munk

Gem

import GameplayKitlet tree = GKRTree<Point>(maxNumberOfChildren: 10)for point in points { let vector = vector_float2( x: Float(point.x), y: Float(point.y) ) tree.addElement( point, boundingRectMin: vector, boundingRectMax: vector, )}

Page 36: Game play Kit - Due Munk

Gem

import GameplayKitlet tree = GKRTree<Point>(maxNumberOfChildren: 10)for point in points { let vector = vector_float2( x: Float(point.x), y: Float(point.y) ) tree.addElement( point, boundingRectMin: vector, boundingRectMax: vector, )}

Page 37: Game play Kit - Due Munk

Gem

import GameplayKitlet tree = GKRTree<Point>(maxNumberOfChildren: 10)for point in points { let vector = vector_float2( x: Float(point.x), y: Float(point.y) ) tree.addElement( point, boundingRectMin: vector, boundingRectMax: vector )}

Page 38: Game play Kit - Due Munk

Gem

import GameplayKitlet tree = GKRTree<Point>(maxNumberOfChildren: 10)for point in points { let vector = vector_float2( x: Float(point.x), y: Float(point.y) ) tree.addElement( point, boundingRectMin: vector, boundingRectMax: vector, splitStrategy: .reduceOverlap )}

Page 39: Game play Kit - Due Munk

Gem

let selectionMin = vector_float2( x: selection.minX, y: selection.minY)let selectionMax = vector_float2( x: selection.maxX, y: selection.maxY)

Page 40: Game play Kit - Due Munk

Gem

let selectionMin = vector_float2( x: selection.minX, y: selection.minY)let selectionMax = vector_float2( x: selection.maxX, y: selection.maxY)let selectedDots = tree.elements( inBoundingRectMin: selectionMin, rectMax: selectionMax)

Page 41: Game play Kit - Due Munk

Gem

import GameplayKitlet tree = GKRTree<Point>(maxNumberOfChildren: 10)tree.queryReserve = 100

Page 42: Game play Kit - Due Munk
Page 43: Game play Kit - Due Munk
Page 44: Game play Kit - Due Munk
Page 45: Game play Kit - Due Munk
Page 46: Game play Kit - Due Munk

●●○○

Page 47: Game play Kit - Due Munk

●●●○

Page 48: Game play Kit - Due Munk

Natural Randomness

Page 49: Game play Kit - Due Munk

Naive

CGFloat(arc4random()) / CGFloat(UINT32_MAX)

Page 50: Game play Kit - Due Munk

Naive

Page 51: Game play Kit - Due Munk

Naive

Page 52: Game play Kit - Due Munk

Naive

Page 53: Game play Kit - Due Munk

Gem

import GameplayKit

Page 54: Game play Kit - Due Munk

Gem

import GameplayKitlet source = GKPerlinNoiseSource( frequency: 2, octaveCount: 3, persistence: 0.5, lacunarity: 2)

Page 55: Game play Kit - Due Munk

Gem

import GameplayKitlet source = GKPerlinNoiseSource( frequency: 2, octaveCount: 3, persistence: 0.5, lacunarity: 2)

Page 56: Game play Kit - Due Munk

Gem

let noise = GKNoise(source)

Page 57: Game play Kit - Due Munk

Gem

let map = GKNoiseMap( noise, size: vector2(1, 1), origin: vector2(0, 0), sampleCount: vector2(3, 5), seamless: true)

Page 58: Game play Kit - Due Munk

Gem

map.value(at: vector2(0, 0))

Page 59: Game play Kit - Due Munk

Gem

map.value(at: vector2(0, 0))map.value(at: vector2(1, 0))map.value(at: vector2(2, 0))

Page 60: Game play Kit - Due Munk

Gem

map.value(at: vector2(0, 0))map.value(at: vector2(1, 0))map.value(at: vector2(2, 0))map.value(at: vector2(0, 1))map.value(at: vector2(0, 2))map.value(at: vector2(0, 3))map.value(at: vector2(0, 4))

Page 61: Game play Kit - Due Munk

Gem

Page 62: Game play Kit - Due Munk

Gem

Page 63: Game play Kit - Due Munk

Gem

Page 64: Game play Kit - Due Munk

●●●○

Page 65: Game play Kit - Due Munk

●●●●

Page 66: Game play Kit - Due Munk

Pathfinding

Page 67: Game play Kit - Due Munk
Page 68: Game play Kit - Due Munk

Tivoli Gardens, Copenhagen

Page 70: Game play Kit - Due Munk

Obstacles

let obstacle =GKPolygonObstacle( points: [ float2(0, 0), float2(0, 2), float2(1, 2), float2(1, 0) ])

Page 71: Game play Kit - Due Munk

⚠ Counterclockwise¹let obstacle =GKPolygonObstacle( points: [ float2(0, 0), float2(1, 0), float2(1, 2), float2(0, 2) ])

Page 72: Game play Kit - Due Munk

Obstacle Graph

let graph = GKObstacleGraph( obstacles: [obstacle], bufferRadius: 0)

Page 73: Game play Kit - Due Munk

Obstacles

Page 74: Game play Kit - Due Munk

A → B

Page 75: Game play Kit - Due Munk

Path

let from = GKGraphNode2D(point: float2(x: -1, y: 1))let to = GKGraphNode2D(point: float2(x: 2, y: 1))

Page 76: Game play Kit - Due Munk

Path

let from = GKGraphNode2D(point: float2(x: -1, y: 1))let to = GKGraphNode2D(point: float2(x: 2, y: 1))graph.connectUsingObstacles(node: from)graph.connectUsingObstacles(node: to)

Page 77: Game play Kit - Due Munk

Path

let from = GKGraphNode2D(point: float2(x: -1, y: 1))let to = GKGraphNode2D(point: float2(x: 2, y: 1))graph.connectUsingObstacles(node: from)graph.connectUsingObstacles(node: to)let path = graph.findPath(from: from, to: to)

Page 78: Game play Kit - Due Munk

Path

let from = GKGraphNode2D(point: float2(x: -1, y: 1))let to = GKGraphNode2D(point: float2(x: 2, y: 1))graph.connectUsingObstacles(node: from)graph.connectUsingObstacles(node: to)let path = graph.findPath(from: from, to: to)[ GKGraphNode2D: {-1, 1}, GKGraphNode2D: { 0, 0}, GKGraphNode2D: { 1, 0}, GKGraphNode2D: { 2, 1}]

Page 79: Game play Kit - Due Munk

Buffer Radius

let graph = GKObstacleGraph( obstacles: [obstacle], bufferRadius: 0.5)[ GKGraphNode2D: {-1.0, 1.0}, GKGraphNode2D: {-0.5, 0.0}, GKGraphNode2D: { 1.5,-0.5}, GKGraphNode2D: { 2.0, 1.0}]

Page 80: Game play Kit - Due Munk

A → B

Page 81: Game play Kit - Due Munk

A → B

Page 82: Game play Kit - Due Munk

●●●●

Page 84: Game play Kit - Due Munk

Gems— of —Game play Kit

NSSpain – Tobias Due Munk – 15 September 2017


Recommended