SlideShare ist ein Scribd-Unternehmen logo
1 von 84
Downloaden Sie, um offline zu lesen
Gems
— of —
Game play Kit
Pragma Conference – Tobias Due Munk – 13 October 2017
Tobias
Due
Munk
@tobiasdm
iOS
tvOS
macOS
watchOS
iOS
tvOS
macOS
watchOS
“Unlike high-level game
engines such as SpriteKit and
SceneKit, GameplayKit is not
involved in animating and
rendering visual content.
Instead, you ...
GameplayKit Guide
...
use GameplayKit to develop
your gameplay mechanics and
to design modular, scalable
game architecture with minimal
effort.”
...
use GameplayKit to develop
your gameplay mechanics and
to design modular, scalable
game architecture with minimal
effort.”
○○○○
●○○○
Shuffled
arrays 
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
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)
}
}
}
Naive
extension Sequence {
func shuffled() -> [Element] {
var result = Array(self)
result.shuffle()
return result
}
}
Naive
[0, 1, 2, 3].shuffled()
// [2, 1, 0, 3]
Gem
import GameplayKit
Gem
import GameplayKit
let source = GKARC4RandomSource.sharedRandom()
Gem
import GameplayKit
let source = GKRandomSource.sharedRandom()
source.arrayByShufflingObjects(
in: [0, 1, 2, 3]
)
Fisher-Yates, StackOverflow
Gem
import GameplayKit
let source = GKRandomSource.sharedRandom()
([0, 1, 2, 3] as NSArray)
.shuffled(using: source)
Fisher-Yates
Gem
import GameplayKit
extension Array {
func shuffled(
using source: GKRandomSource = .sharedRandom()
) -> [Element] {
let nsArray = self as NSArray
let shuffled = nsArray.shuffled(using: source)
return shuffled as! [Element]
}
}
Gem
import GameplayKit
extension Array {
func shuffled(
using source: GKRandomSource = .sharedRandom()
) -> [Element] {
let nsArray = self as NSArray
let shuffled = nsArray.shuffled(using: source)
return shuffled as! [Element]
}
}
Gem
[0, 1, 2, 3].shuffled()
// [2, 0, 1, 3]
●○○○
●●○○
Performant
Visual
Search
Matthias Tretter
Naive
let dots = [
CGPoint(x: 0, y: 0),
CGPoint(x: 1, y: 1),
CGPoint(x: 2, y: 0)
]
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)
)
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)
)
Naive
dots.filter { dot in
return selection.contains(dot)
}
Gem
import GameplayKit
Gem
import GameplayKit
let tree = GKRTree<Point>(maxNumberOfChildren: 10)
Gem
import GameplayKit
class Point: NSObject {
let x: CGFloat
let y: CGFloat
}
Gem
import GameplayKit
let 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,
)
}
Gem
import GameplayKit
let 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,
)
}
Gem
import GameplayKit
let 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
)
}
Gem
import GameplayKit
let 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
)
}
Gem
let selectionMin = vector_float2(
x: selection.minX,
y: selection.minY
)
let selectionMax = vector_float2(
x: selection.maxX,
y: selection.maxY
)
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
)
Gem
import GameplayKit
let tree = GKRTree<Point>(maxNumberOfChildren: 10)
tree.queryReserve = 100
●●○○
●●●○
Natural 
Randomness
Naive
CGFloat(arc4random()) / CGFloat(UINT32_MAX)
Naive
Naive
Naive
Gem
import GameplayKit
Gem
import GameplayKit
let source = GKPerlinNoiseSource(
frequency: 2,
octaveCount: 3,
persistence: 0.5,
lacunarity: 2
)
Gem
import GameplayKit
let source = GKPerlinNoiseSource(
frequency: 2,
octaveCount: 3,
persistence: 0.5,
lacunarity: 2
)
Gem
let noise = GKNoise(source)
Gem
let map = GKNoiseMap(
noise,
size: vector2(1, 1),
origin: vector2(0, 0),
sampleCount: vector2(3, 5),
seamless: true
)
Gem
map.value(at: vector2(0, 0))
Gem
map.value(at: vector2(0, 0))
map.value(at: vector2(1, 0))
map.value(at: vector2(2, 0))
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))
Gem
Gem
●●●○
●●●●
Path
finding
Tivoli Gardens, Copenhagen
Obstacles
Open Street Map data
Obstacles
let obstacle =
GKPolygonObstacle(
points: [
float2(0, 0),
float2(0, 2),
float2(1, 2),
float2(1, 0)
]
)
⚠ Counterclockwise¹
let obstacle =
GKPolygonObstacle(
points: [
float2(0, 0),
float2(1, 0),
float2(1, 2),
float2(0, 2)
]
)
Obstacle Graph
let graph =
GKObstacleGraph(
obstacles: [obstacle],
bufferRadius: 0
)
Obstacles
A → B
Path
let a = GKGraphNode2D(point: float2(x: -1, y: 1))
let b = GKGraphNode2D(point: float2(x: 2, y: 1))
Path
let a = GKGraphNode2D(point: float2(x: -1, y: 1))
let b = GKGraphNode2D(point: float2(x: 2, y: 1))
graph.connectUsingObstacles(node: a)
graph.connectUsingObstacles(node: b)
Path
let a = GKGraphNode2D(point: float2(x: -1, y: 1))
let a = GKGraphNode2D(point: float2(x: 2, y: 1))
graph.connectUsingObstacles(node: a)
graph.connectUsingObstacles(node: b)
let path = graph.findPath(from: a, to: b)
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}
]
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}
]
A → B
A → B
●●●●
Links
—About GameplayKit by Apple
—Random Talk: The Consistent World of Noise by
Natalia Berdys
—GameplayKit: Beyond Games by Sash Zats
—The Right Way To Write Dijkstra’s Algorithm In
Swift by Federico Zanetello
—Playground Examples
Gems
— of —
Game play Kit
Pragma Conference – Tobias Due Munk – 13 October 2017

Weitere ähnliche Inhalte

Was ist angesagt?

Human-powered Javascript Compression for Fun and Gummy Bears
Human-powered Javascript Compression for Fun and Gummy BearsHuman-powered Javascript Compression for Fun and Gummy Bears
Human-powered Javascript Compression for Fun and Gummy Bears
Rui Lopes
 
Pixelplant - WebDev Meetup Salzburg
Pixelplant - WebDev Meetup SalzburgPixelplant - WebDev Meetup Salzburg
Pixelplant - WebDev Meetup Salzburg
wolframkriesing
 
Mashup caravan android-talks
Mashup caravan android-talksMashup caravan android-talks
Mashup caravan android-talks
honjo2
 
What they don't tell you about JavaScript
What they don't tell you about JavaScriptWhat they don't tell you about JavaScript
What they don't tell you about JavaScript
Raphael Cruzeiro
 
cocos2d 事例編 HungryMasterの実装から
cocos2d 事例編 HungryMasterの実装からcocos2d 事例編 HungryMasterの実装から
cocos2d 事例編 HungryMasterの実装から
Yuichi Higuchi
 

Was ist angesagt? (20)

Introduction of 3D Development
Introduction of 3D DevelopmentIntroduction of 3D Development
Introduction of 3D Development
 
Making Games in JavaScript
Making Games in JavaScriptMaking Games in JavaScript
Making Games in JavaScript
 
Grand centraldispatch
Grand centraldispatchGrand centraldispatch
Grand centraldispatch
 
Cocos2dを使ったゲーム作成の事例
Cocos2dを使ったゲーム作成の事例Cocos2dを使ったゲーム作成の事例
Cocos2dを使ったゲーム作成の事例
 
Secure and privacy-preserving data transmission and processing using homomorp...
Secure and privacy-preserving data transmission and processing using homomorp...Secure and privacy-preserving data transmission and processing using homomorp...
Secure and privacy-preserving data transmission and processing using homomorp...
 
Human-powered Javascript Compression for Fun and Gummy Bears
Human-powered Javascript Compression for Fun and Gummy BearsHuman-powered Javascript Compression for Fun and Gummy Bears
Human-powered Javascript Compression for Fun and Gummy Bears
 
Pixelplant - WebDev Meetup Salzburg
Pixelplant - WebDev Meetup SalzburgPixelplant - WebDev Meetup Salzburg
Pixelplant - WebDev Meetup Salzburg
 
The Ring programming language version 1.5.4 book - Part 59 of 185
The Ring programming language version 1.5.4 book - Part 59 of 185The Ring programming language version 1.5.4 book - Part 59 of 185
The Ring programming language version 1.5.4 book - Part 59 of 185
 
Mashup caravan android-talks
Mashup caravan android-talksMashup caravan android-talks
Mashup caravan android-talks
 
Procedural Content Generation with Clojure
Procedural Content Generation with ClojureProcedural Content Generation with Clojure
Procedural Content Generation with Clojure
 
Visualising Big Data
Visualising Big DataVisualising Big Data
Visualising Big Data
 
Program implementation and testing
Program implementation and testingProgram implementation and testing
Program implementation and testing
 
A More Flash Like Web?
A More Flash Like Web?A More Flash Like Web?
A More Flash Like Web?
 
Introduction to Homomorphic Encryption
Introduction to Homomorphic EncryptionIntroduction to Homomorphic Encryption
Introduction to Homomorphic Encryption
 
What they don't tell you about JavaScript
What they don't tell you about JavaScriptWhat they don't tell you about JavaScript
What they don't tell you about JavaScript
 
Genome Browser based on Google Maps API
Genome Browser based on Google Maps APIGenome Browser based on Google Maps API
Genome Browser based on Google Maps API
 
Introduction to programming class 13
Introduction to programming   class 13Introduction to programming   class 13
Introduction to programming class 13
 
LCS35
LCS35LCS35
LCS35
 
Aditazz 01-ul
Aditazz 01-ulAditazz 01-ul
Aditazz 01-ul
 
cocos2d 事例編 HungryMasterの実装から
cocos2d 事例編 HungryMasterの実装からcocos2d 事例編 HungryMasterの実装から
cocos2d 事例編 HungryMasterの実装から
 

Ähnlich wie Gems of GameplayKit. UA Mobile 2017.

Html5 game programming overview
Html5 game programming overviewHtml5 game programming overview
Html5 game programming overview
민태 김
 
Adventures In Data Compilation
Adventures In Data CompilationAdventures In Data Compilation
Adventures In Data Compilation
Naughty Dog
 
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconfbuilding_games_with_ruby_rubyconf
building_games_with_ruby_rubyconf
tutorialsruby
 
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconfbuilding_games_with_ruby_rubyconf
building_games_with_ruby_rubyconf
tutorialsruby
 

Ähnlich wie Gems of GameplayKit. UA Mobile 2017. (20)

Html5 game programming overview
Html5 game programming overviewHtml5 game programming overview
Html5 game programming overview
 
The Ring programming language version 1.6 book - Part 62 of 189
The Ring programming language version 1.6 book - Part 62 of 189The Ring programming language version 1.6 book - Part 62 of 189
The Ring programming language version 1.6 book - Part 62 of 189
 
The Ring programming language version 1.7 book - Part 64 of 196
The Ring programming language version 1.7 book - Part 64 of 196The Ring programming language version 1.7 book - Part 64 of 196
The Ring programming language version 1.7 book - Part 64 of 196
 
HTML5 game dev with three.js - HexGL
HTML5 game dev with three.js - HexGLHTML5 game dev with three.js - HexGL
HTML5 game dev with three.js - HexGL
 
Intro to Python (High School) Unit #3
Intro to Python (High School) Unit #3Intro to Python (High School) Unit #3
Intro to Python (High School) Unit #3
 
Primitives
PrimitivesPrimitives
Primitives
 
Computer graphics lab manual
Computer graphics lab manualComputer graphics lab manual
Computer graphics lab manual
 
Adventures In Data Compilation
Adventures In Data CompilationAdventures In Data Compilation
Adventures In Data Compilation
 
CG OpenGL Shadows + Light + Texture -course 10
CG OpenGL Shadows + Light + Texture -course 10CG OpenGL Shadows + Light + Texture -course 10
CG OpenGL Shadows + Light + Texture -course 10
 
The Ring programming language version 1.3 book - Part 52 of 88
The Ring programming language version 1.3 book - Part 52 of 88The Ring programming language version 1.3 book - Part 52 of 88
The Ring programming language version 1.3 book - Part 52 of 88
 
The Ring programming language version 1.10 book - Part 81 of 212
The Ring programming language version 1.10 book - Part 81 of 212The Ring programming language version 1.10 book - Part 81 of 212
The Ring programming language version 1.10 book - Part 81 of 212
 
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconfbuilding_games_with_ruby_rubyconf
building_games_with_ruby_rubyconf
 
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconfbuilding_games_with_ruby_rubyconf
building_games_with_ruby_rubyconf
 
The Ring programming language version 1.10 book - Part 70 of 212
The Ring programming language version 1.10 book - Part 70 of 212The Ring programming language version 1.10 book - Part 70 of 212
The Ring programming language version 1.10 book - Part 70 of 212
 
The Ring programming language version 1.5.4 book - Part 60 of 185
The Ring programming language version 1.5.4 book - Part 60 of 185The Ring programming language version 1.5.4 book - Part 60 of 185
The Ring programming language version 1.5.4 book - Part 60 of 185
 
The Ring programming language version 1.5.3 book - Part 79 of 184
The Ring programming language version 1.5.3 book - Part 79 of 184The Ring programming language version 1.5.3 book - Part 79 of 184
The Ring programming language version 1.5.3 book - Part 79 of 184
 
Brief intro to clojure
Brief intro to clojureBrief intro to clojure
Brief intro to clojure
 
SCIPY-SYMPY.pdf
SCIPY-SYMPY.pdfSCIPY-SYMPY.pdf
SCIPY-SYMPY.pdf
 
Trident International Graphics Workshop 2014 1/5
Trident International Graphics Workshop 2014 1/5Trident International Graphics Workshop 2014 1/5
Trident International Graphics Workshop 2014 1/5
 
Computer Graphics Unit 1
Computer Graphics Unit 1Computer Graphics Unit 1
Computer Graphics Unit 1
 

Mehr von UA Mobile

Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
UA Mobile
 
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
UA Mobile
 
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
UA Mobile
 
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
UA Mobile
 
До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019
UA Mobile
 
Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019
UA Mobile
 
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
UA Mobile
 
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
UA Mobile
 

Mehr von UA Mobile (20)

Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
 
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
 
Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019
 
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
 
Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019
 
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
 
Working effectively with ViewModels and TDD - UA Mobile 2019
Working effectively with ViewModels and TDD - UA Mobile 2019Working effectively with ViewModels and TDD - UA Mobile 2019
Working effectively with ViewModels and TDD - UA Mobile 2019
 
Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019
 
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
 
Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019
 
До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019
 
Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019
 
Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019
 
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
 
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
 
Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019
 
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
 
Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019
 
Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.
 

Kürzlich hochgeladen

CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceCALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
anilsa9823
 
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceCALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
anilsa9823
 

Kürzlich hochgeladen (7)

CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceCALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
 
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
 
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost LoverPowerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
 
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceCALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
 
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort ServiceBDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
 
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCRFULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
 
9892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x79892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x7
 

Gems of GameplayKit. UA Mobile 2017.