Guest User

Untitled

a guest
Jul 17th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.13 KB | None | 0 0
  1. # chi sono
  2. [contatti]
  3. ciao sono andrea, lavoro qui a 2hire come sviluppatore embedded e smontacose.
  4. Visto che chi non sa fare insegna, oggi voglio parlarvi di entity component system e perché penso sia veramente bello
  5. e perché non l'ho mai usato
  6.  
  7. # survey
  8. vedo un po' di facce conosciute.
  9. quanti di voi sono programmatori puri?
  10. quanti sono programmatori per necessità di videogioco?
  11. quanti conoscono il pattern Entity Component system?
  12. quanti usano un engine per i propri lavori?
  13.  
  14. # obiettivo
  15. perché chiedo questo?
  16. ecs è alla base di tantissimi prodotti in ambito videogiochi, e credo che conoscere un po' i meccanismi che fanno funzionare queste macchine, ci renda persone migliori e possa risolvere la fame nel mondo.
  17. Per chi prima ha detto di essere un programmatore puro, che non usa engine per i suoi giochi, e che non conosce ecs, spero di riuscirvi a mostrare qualcosa di nuovo.
  18.  
  19. # antefatto [warning: fictonalization]
  20. 2 gamejam fà mi sono fatto convincere da Andrea a partecipare, a suon di parolacce
  21. insieme a sarah, bruno, tsuneo e massimo ci eravamo dati appuntamento al pub per condividere un po' di idee e decidere quale tecnologia avremmo usato
  22. io per l'occasione io avevo deciso finalmente di imparare love2d e ecs, ed ero molto deciso a condividerli con gli altri
  23. Fu una bella sessione di brainstorming, si buttarono giù molte idee e avevamo anche una bozza di un possibile gameplay (lo so, non si fa)
  24.  
  25. # un problema [warning: informatica]
  26. Problema: vogliamo modellare un sistema dove molteplici agenti interagiscono fra di loro contemporaneamente, e con un certo grado di autonomia
  27.  
  28. per esempio: in un videogioco abbiamo il personaggio di un giocatore, e dei nemici che si muovono a random
  29.  
  30. # proposta 1
  31. ecco come avrei affrontato io il problema, un po' di tempo fa
  32.  
  33. - è la mia prospettiva da programmatore che non vuole usare engine
  34.  
  35. modelliamo una classe player, nel suo metodo update leggiamo gli input per muoverlo. modelliamo una classe npc, e nel suo metodo lo facciamo muovere a random
  36.  
  37. # aggiunta
  38. se il giocatore tocca un nemico, perde
  39.  
  40. # proposta 1.1
  41. nel loop del gioco facciamo if(player touches enemy) die()
  42.  
  43. # aggiunta
  44. i nemici non si muovono a random, ma vanno verso il giocatore
  45.  
  46. # proposta 1.2
  47. la classe npc riceve il giocatore, ad ogni update si muove verso la sua posizione
  48. ^ pessimo design
  49.  
  50. # aggiunta
  51. quando il giocatore attiva la sua arma, i nemici dietro di lui esplodono
  52.  
  53. # proposta 1.3
  54. nel loop del gioco mettiamo un if(x is pressed){for( e in enemies){if(e is behind player) die(e)}}
  55.  
  56. # cosa abbiamo finora
  57. come potete immaginare questo è un design che diventa sempre più ingarbugliato, con logica sparsa un po' ovunque, oggetti che non si sa a chi appartengono, bug che compaiono in maniera imbarazzante.
  58. Quale è il problema? aggiungere un comportamento diventa sempre più difficile, i dati sono inutilmente ridondanti.
  59. questo design va bene quando abbiamo un solo giocatore, 2/3 nemici, ed un tutorial per qualche engine js/html5, ma possiamo allargare il nostro mondo solo spendendo molte bestemmie
  60.  
  61. # il problema
  62. il problema di fondo del design di prima è che un comportamento (muoversi verso un obiettivo, esplodere) è mezzo mischiato con i dati su cui opera (la propria posizione, l'obiettivo, un evento) e questi piccoli pezzi di codice sono replicati un po' di volte.
  63.  
  64. # ecs
  65. (non ho controllato wikipedia, garantito sto dicendo delle cazzate)
  66. ecs dice:
  67. il mondo è popolato da esseri, che si chiamano entità. essi hanno una identità e poco più.
  68. nel mondo ci stanno anche leggi, chiamate sistemi, che governano come le entità si evolvono da un istante di tempo all'altro.
  69. ad esempio: un sistema dice che se ho un obiettivo, devo "spostarmi verso di esso",
  70. un'altra dice che "spostarmi" significa modificare la mia "posizione" con un vettore,
  71. una terza dice che se c'è una esplosione vicino a me, allora vengo distrutto
  72.  
  73. # ecs -cont
  74.  
  75. i Sistemi interagiscono con le entità? No! ogni sistema interagisce con il suo tipo di dato, che è chiamato Componente.
  76.  
  77. Dove stanno questi Componenti? ogni Entità è un contenitore di tutti i Componenti che ne devono determinare il comportamento
  78.  
  79. In pratica cerchiamo di disaccoppiare completamente i dati dal codice, ed eliminiamo le dipendenze fra i vari pezzi di codice
  80.  
  81. # esempio
  82.  
  83. Modelliamo il nostro gioco con Entità{posizione, grafica, vita, input, nome="player"}, e tanti nemici modellati come Entità{posizione, obiettivo, grafica, nome="npc..."}
  84.  
  85. dove posizione, grafica, vita, input, obiettivo sono i nostri Componenti
  86.  
  87. poi creiamo un Sistema<posizione, input> che modifica la posizione a seconda dell'input, per permettere all'utente di controllare Qualcosa
  88. un Sistema<posizione, obiettivo> che avvicina la posizione all'obiettivo, per far muovere Qualcosa
  89.  
  90. questi sono sistemi semplici, delle funzioni, che fanno evolvere le entità singolarmente
  91.  
  92. # esempio 2
  93.  
  94. e per modellare le interazioni fra entità?
  95.  
  96. una soluzione (una delle tante) è avere un sistema per verificare se una interazione sta avvenendo, e se si creare al volo una entità che descrive questa interazione. Sui componenti di questa nuova Entità "evento" possiamo triggerare tutti i sistemi che ci pare.
  97. per esempio: potremmo avere un Sistema<posizione, collidibile> che verifica quali entità collidono e genera una Entità{collisione, entità_a, entità_b} per ogni nuova collisione, un Sistema<collisione> che cambia il colore delle entità che collidono, un Sistema<collisione> che azzera la vita delle entità, un Sistema<vita> che uccide l'entità con vita zero, e un Sistema<collisione> che distrugge l'entità "evento", in modo da consumare gli eventi ad ogni turno
  98.  
  99. # sembra complicato?
  100.  
  101. si, è un po' complicato. sopratutto perché l'istinto naturale del "prima programma e poi chiedi scusa" qui viene sovvertito: prima di programmare c'è del lavoro da fare per individuare entità, componenti e sistemi, e cercare di evitare l'errore di nascondere dati dentro i sistemi, e comportamenti dentro le entità
  102.  
  103. # ma il mondo stesso è complicato
  104.  
  105. in realtà però il problema di architettura, il problema di spendere del tempo a sistemare il codice, è un problema che ad un certo punto qualsiasi progetto deve affrontare.
  106. Chi ha già avuto un progetto personale, ad uno stato medio/avanzato sà quanto è doloroso il debito tecnico di copiare e incollare il codice in giro
  107.  
  108. # cosa non sto dicendo
  109.  
  110. ecs, come lo ho illustrato qui, è un meccanismo a basso livello per organizzare lo sviluppo, ma non è ancora chiaro come farlo funzionare nella pratica.
  111.  
  112. un approccio (semplicistico e poco ottimale) è:
  113. nel setup, creo le Entità con i loro Componenti, e li salvo in una lista master.
  114. nel loop, per ogni Sistema itero la lista, ed eseguo il sistema sulla entità se questa soddisfa il suo filtro (per esempio il Sistema<posizione, texture> si attiva solo per le entità con questi due componenti, e disegna a schermo una texture alla posizione indicata)
  115.  
  116. ovviamente c'è un discorso dell'ordine con cui attivo i sistemi, e un possibile ordinamento delle entità, che sto accuratamente evitando
  117.  
  118. # un approccio più sensato
  119.  
  120. usate un motore di entity component system che vi renda la vita semplice
  121.  
  122.  
  123. # svantaggi
  124.  
  125.  
  126. # vantaggi
  127.  
  128.  
  129. # perché è figo
  130.  
  131. plugnplay
  132. mix and mash
  133. salvataggios
Add Comment
Please, Sign In to add comment