Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gamedev com Kotlin Native

Gamedev com Kotlin Native

2dc2a52d38ee8c184deeceaadf9ed6ba?s=128

Rafael Toledo

July 30, 2020
Tweet

More Decks by Rafael Toledo

Other Decks in Programming

Transcript

  1. GameDev com Kotlin Native

  2. 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-..)
  3. Kotlin Native

  4. Kotlin Native Kotlin sem VM Mas com a StdLib Sem

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

    VM – sem Garbage Collector Comunica com linguagens nativas C C++ ObjectiveC Switf
  6. Linguagem C

  7. 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
  8. 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
  9. 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
  10. Tá, mas a gente não ia falar de Gamedev?

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

  12. Bibliotecas low-level SDL Allegro Qt WxWidgets e outras

  13. SDL Allegro Qt WxWidgets

  14. SDL Allegro Qt WxWidgets

  15. SDL Allegro Qt WxWidgets

  16. SDL Allegro Qt WxWidgets

  17. SDL Allegro Qt WxWidgets

  18. SDL Allegro Qt WxWidgets

  19. Simple DirectMedia Layer Cross Plataforma – Windows, Linux, MacOS, iOS,

    Android audio teclado mouse joystick gráficos OpenGL/Direct3D libsdl.org
  20. Simple DirectMedia Layer Extensões SDL_image SDL_net SDL_ttf SDL_mixer SDL_gfx

  21. Estrutura Básica de um Game

  22. Estrutura de um Game Fortemente orientado a eventos Gestão de

    recursos Input -> Processamento -> Saída
  23. Kotlin SDL

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

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

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

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

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

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

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

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

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

    { ... } compilations.main.cinterops { sdl { // sdl.def includeDirs '/usr/local/include/SDL2' } } } }
  33. // 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 = ...
  34. Header (*.h) to Kotlin

  35. Header file int SDL_Init(Uint32 flags);

  36. Header file int SDL_Init(Uint32 flags); gradle cinteropSdlMacosX64

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

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

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

    Kotlin 1.3
  40. outro exemplo

  41. Header file SDL_Surface *SDL_GetWindowSurface( SDL_Window *window);

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

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

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

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

    SDL_Window
  46. Header file Em C: typedef struct SDL_Window { ... }

    Em Kotlin: class SDL_Window : CStructVar { ... }
  47. Header file SDL_Surface *SDL_GetWindowSurface( SDL_Window *window); recebe uma referência de

    SDL_Window fun SDL_GetWindowSurface( CValuesRef<SDL_Window>? window)
  48. Header file SDL_Surface *SDL_GetWindowSurface( SDL_Window *window); retorna um ponteiro de

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

    SDL_Surface fun SDL_GetWindowSurface( CValuesRef<SDL_Window>? window): CPointer<SDL_Surface>
  50. eita!

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

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

  53. SDL em Kotlin memScoped { val e = alloc<SDL_Event>() while

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

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

  56. 1. C não tem boolean SDL_PollEvent() retorna 0 ou não-0

    em C, 0 é false, não-0 é true
  57. SDL em Kotlin while (SDL_PollEvent(&e) != 0) { ... }

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

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

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

    struct SDL_Event vira e.ptr.reinterpret()
  61. eita!

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

    struct SDL_Event vira e.ptr.reinterpret()
  63. outro exemplo

  64. SDL em C SDL_Window *window; // Acessando os dados de

    um // ponteiro pra struct window->w // retorna a // largura da tela
  65. SDL em Kotlin var window: CPointer<SDL_Window>? // Acessando os dados

    de um // ponteiro pra struct window?.get(0)?.w // retorna a // largura da tela
  66. eita!

  67. outro exemplo

  68. SDL em C // Acessando último erro // retornado pela

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

    SDL println("Erro: ${SDL_GetError()?.toKString()}");
  70. eita!

  71. mas Toledo, isso funciona mesmo?

  72. easy normal hard

  73. easy normal hard

  74. easy normal hard

  75. easy normal hard

  76. demo time Flappy Ball

  77. demo time Flappy Ball

  78. o que tudo isso pode me ensinar?

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

  80. O que posso aprender? Exercitar lógica de programação Como isolar

    uma biblioteca do código e criar abstrações
  81. 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) { ... }
  82. 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 }
  83. 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"
  84. 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
  85. aprender a fazer jogos!

  86. 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
  87. Obrigado! rafaeltoledo.net twitter.com/_rafaeltoledo github.com/rafaeltoledo PSN: rafaeldtoledo Nintendo: rtoledo uber.com/careers