Slide 1

Slide 1 text

GameDev com Kotlin Native

Slide 2

Slide 2 text

Rafael Toledo Sr Sofware Engineer @ Uber Mega Drive (94-01) Dreamcast (01-08) Faculdade (08-11) XBox 360 (12-14) Playstation 4 (14-..) Switch (18-..)

Slide 3

Slide 3 text

Kotlin Native

Slide 4

Slide 4 text

Kotlin Native Kotlin sem VM Mas com a StdLib Sem VM – sem Garbage Collector Comunica com linguagens nativas C C++ ObjectiveC Switf

Slide 5

Slide 5 text

Kotlin Native Kotlin sem VM Mas com a StdLib Sem VM – sem Garbage Collector Comunica com linguagens nativas C C++ ObjectiveC Switf

Slide 6

Slide 6 text

Linguagem C

Slide 7

Slide 7 text

Sobre a Linguagem C Já tem quase 50 anos (1972) Influenciou várias outras linguagens como: C++ C# ObjC Go Java Python JavaScript Perl PHP Rust

Slide 8

Slide 8 text

TODAS as keywords auto break case char const continue default do int long register return short signed sizeof static struct switch typedef union unsigned void volatile while double else enum extern float for goto if

Slide 9

Slide 9 text

TODAS as keywords auto break case char const continue default do int long register return short signed sizeof static struct switch typedef union unsigned void volatile while double else enum extern float for goto if

Slide 10

Slide 10 text

Tá, mas a gente não ia falar de Gamedev?

Slide 11

Slide 11 text

Game Engines (C/C++) CryEngine Lumberyard Unreal Engine Godot e outras

Slide 12

Slide 12 text

Bibliotecas low-level SDL Allegro Qt WxWidgets e outras

Slide 13

Slide 13 text

SDL Allegro Qt WxWidgets

Slide 14

Slide 14 text

SDL Allegro Qt WxWidgets

Slide 15

Slide 15 text

SDL Allegro Qt WxWidgets

Slide 16

Slide 16 text

SDL Allegro Qt WxWidgets

Slide 17

Slide 17 text

SDL Allegro Qt WxWidgets

Slide 18

Slide 18 text

SDL Allegro Qt WxWidgets

Slide 19

Slide 19 text

Simple DirectMedia Layer Cross Plataforma – Windows, Linux, MacOS, iOS, Android audio teclado mouse joystick gráficos OpenGL/Direct3D libsdl.org

Slide 20

Slide 20 text

Simple DirectMedia Layer Extensões SDL_image SDL_net SDL_ttf SDL_mixer SDL_gfx

Slide 21

Slide 21 text

Estrutura Básica de um Game

Slide 22

Slide 22 text

Estrutura de um Game Fortemente orientado a eventos Gestão de recursos Input -> Processamento -> Saída

Slide 23

Slide 23 text

Kotlin SDL

Slide 24

Slide 24 text

// build.gradle apply plugin: 'org.jetbrains.kotlin.multiplatform' kotlin { macosX64() linuxX64() mingwX64() mingwX86() }

Slide 25

Slide 25 text

// build.gradle apply plugin: 'org.jetbrains.kotlin.multiplatform' kotlin { macosX64() // Mac OS linuxX64() mingwX64() mingwX86() }

Slide 26

Slide 26 text

// build.gradle apply plugin: 'org.jetbrains.kotlin.multiplatform' kotlin { macosX64() linuxX64() // Linux mingwX64() mingwX86() }

Slide 27

Slide 27 text

// build.gradle apply plugin: 'org.jetbrains.kotlin.multiplatform' kotlin { macosX64() linuxX64() mingwX64() // Windows 64 bits mingwX86() // Windows 32 bits }

Slide 28

Slide 28 text

// build.gradle apply plugin: 'org.jetbrains.kotlin.multiplatform' kotlin { macosX64() // Mac OS linuxX64() mingwX64() mingwX86() }

Slide 29

Slide 29 text

// build.gradle apply plugin: 'org.jetbrains.kotlin.multiplatform' kotlin { macosX64() // Mac OS linuxX64() mingwX64() mingwX86() }

Slide 30

Slide 30 text

// build.gradle apply plugin: 'org.jetbrains.kotlin.multiplatform' kotlin { macosX64() { binaries { entryPoint 'pacote.main’ linkerOpts '-L/usr/local/lib', '-LSDL2' } } }

Slide 31

Slide 31 text

// build.gradle apply plugin: 'org.jetbrains.kotlin.multiplatform' kotlin { macosX64() { binaries { ... } compilations.main.cinterops { sdl { // sdl.def includeDirs '/usr/local/include/SDL2' } } } }

Slide 32

Slide 32 text

// build.gradle apply plugin: 'org.jetbrains.kotlin.multiplatform' kotlin { macosX64() { binaries { ... } compilations.main.cinterops { sdl { // sdl.def includeDirs '/usr/local/include/SDL2' } } } }

Slide 33

Slide 33 text

// src/nativeInterop/cinterop/sdl.def headers = SDL.h stdlib.h time.h entryPoint = SDL_main headerFilter = SDL* stdlib.h time.h compileOpts = -D_POSIX_SOURCE compileOpts.osx = ... compileOpts.linux = ...

Slide 34

Slide 34 text

Header (*.h) to Kotlin

Slide 35

Slide 35 text

Header file int SDL_Init(Uint32 flags);

Slide 36

Slide 36 text

Header file int SDL_Init(Uint32 flags); gradle cinteropSdlMacosX64

Slide 37

Slide 37 text

Header file int SDL_Init(Uint32 flags); gradle cinteropSdlMacosX64 fun SDL_Init(flags: Uint32)

Slide 38

Slide 38 text

Header file int SDL_Init(Uint32 flags); gradle cinteropSdlMacosX64 fun SDL_Init(flags: Uint32)

Slide 39

Slide 39 text

Header file int SDL_Init(Uint32 flags); gradle cinteropSdlMacosX64 fun SDL_Init(flags: kotlinx.Uint) Kotlin 1.3

Slide 40

Slide 40 text

outro exemplo

Slide 41

Slide 41 text

Header file SDL_Surface *SDL_GetWindowSurface( SDL_Window *window);

Slide 42

Slide 42 text

Header file SDL_Surface *SDL_GetWindowSurface( SDL_Window *window); eita!

Slide 43

Slide 43 text

Header file SDL_Surface *SDL_GetWindowSurface( SDL_Window *window); função SDL_GetWindowSurface()

Slide 44

Slide 44 text

Header file SDL_Surface *SDL_GetWindowSurface( SDL_Window *window); função SDL_GetWindowSurface() fun SDL_GetWindowSurface()

Slide 45

Slide 45 text

Header file SDL_Surface *SDL_GetWindowSurface( SDL_Window *window); recebe um ponteiro pra SDL_Window

Slide 46

Slide 46 text

Header file Em C: typedef struct SDL_Window { ... } Em Kotlin: class SDL_Window : CStructVar { ... }

Slide 47

Slide 47 text

Header file SDL_Surface *SDL_GetWindowSurface( SDL_Window *window); recebe uma referência de SDL_Window fun SDL_GetWindowSurface( CValuesRef? window)

Slide 48

Slide 48 text

Header file SDL_Surface *SDL_GetWindowSurface( SDL_Window *window); retorna um ponteiro de SDL_Surface

Slide 49

Slide 49 text

Header file SDL_Surface *SDL_GetWindowSurface( SDL_Window *window); retorna um ponteiro de SDL_Surface fun SDL_GetWindowSurface( CValuesRef? window): CPointer

Slide 50

Slide 50 text

eita!

Slide 51

Slide 51 text

SDL em C SDL_Event e; while (!SDL_PollEvent(&e)) { ... }

Slide 52

Slide 52 text

SDL em Kotlin SDL_Event e; while (!SDL_PollEvent(&e)) { ... }

Slide 53

Slide 53 text

SDL em Kotlin memScoped { val e = alloc() while (!SDL_PollEvent(&e)) { ... } }

Slide 54

Slide 54 text

SDL em Kotlin memScoped { val e = alloc() while (!SDL_PollEvent(&e)) { ... } } // aqui a memória é liberada

Slide 55

Slide 55 text

SDL em Kotlin while (!SDL_PollEvent(&e)) { ... }

Slide 56

Slide 56 text

1. C não tem boolean SDL_PollEvent() retorna 0 ou não-0 em C, 0 é false, não-0 é true

Slide 57

Slide 57 text

SDL em Kotlin while (SDL_PollEvent(&e) != 0) { ... }

Slide 58

Slide 58 text

SDL em Kotlin SDL_PollEvent(&e) chamada de função, tudo tranquilo

Slide 59

Slide 59 text

SDL em Kotlin parâmetro: &e endereço de memória de uma struct SDL_Event

Slide 60

Slide 60 text

SDL em Kotlin parâmetro: &e endereço de memória de uma struct SDL_Event vira e.ptr.reinterpret()

Slide 61

Slide 61 text

eita!

Slide 62

Slide 62 text

SDL em Kotlin parâmetro: &e endereço de memória de uma struct SDL_Event vira e.ptr.reinterpret()

Slide 63

Slide 63 text

outro exemplo

Slide 64

Slide 64 text

SDL em C SDL_Window *window; // Acessando os dados de um // ponteiro pra struct window->w // retorna a // largura da tela

Slide 65

Slide 65 text

SDL em Kotlin var window: CPointer? // Acessando os dados de um // ponteiro pra struct window?.get(0)?.w // retorna a // largura da tela

Slide 66

Slide 66 text

eita!

Slide 67

Slide 67 text

outro exemplo

Slide 68

Slide 68 text

SDL em C // Acessando último erro // retornado pela SDL printf("Erro: %s\n", SDL_GetError());

Slide 69

Slide 69 text

SDL em Kotlin // Acessando último erro // retornado pela SDL println("Erro: ${SDL_GetError()?.toKString()}");

Slide 70

Slide 70 text

eita!

Slide 71

Slide 71 text

mas Toledo, isso funciona mesmo?

Slide 72

Slide 72 text

easy normal hard

Slide 73

Slide 73 text

easy normal hard

Slide 74

Slide 74 text

easy normal hard

Slide 75

Slide 75 text

easy normal hard

Slide 76

Slide 76 text

demo time Flappy Ball

Slide 77

Slide 77 text

demo time Flappy Ball

Slide 78

Slide 78 text

o que tudo isso pode me ensinar?

Slide 79

Slide 79 text

O que posso aprender? Exercitar lógica de programação

Slide 80

Slide 80 text

O que posso aprender? Exercitar lógica de programação Como isolar uma biblioteca do código e criar abstrações

Slide 81

Slide 81 text

O que posso aprender? Exercitar lógica de programação Como isolar uma biblioteca do código e criar abstrações while (SDL_PollEvent(e.ptr.reinterpret()) != 0) { ... }

Slide 82

Slide 82 text

O que posso aprender? Exercitar lógica de programação Como isolar uma biblioteca do código e criar abstrações while (eventPool.hasMoreEvents())) { // eventual abstração }

Slide 83

Slide 83 text

O que posso aprender? Exercitar lógica de programação Como isolar uma biblioteca do código e criar abstrações Debugar problemas de lógica – em uma plataforma "diferente"

Slide 84

Slide 84 text

O que posso aprender? Exercitar lógica de programação Como isolar uma biblioteca do código e criar abstrações Debugar problemas de lógica – em uma plataforma "diferente" Lidar com memória

Slide 85

Slide 85 text

aprender a fazer jogos!

Slide 86

Slide 86 text

Links Flappy Ball github.com/rafaeltoledo/flappy-kotlin Tetris (dentro de samples/tetris) github.com/JetBrains/kotlin Tutorials SDL (C/C++) lazyfoo.net Overview Kotlin Native kotlinlang.org/docs/reference/native-overview.html

Slide 87

Slide 87 text

Obrigado! rafaeltoledo.net twitter.com/_rafaeltoledo github.com/rafaeltoledo PSN: rafaeldtoledo Nintendo: rtoledo uber.com/careers