Tutorial - GangBug/AgeofEmpiresII GitHub Wiki

Modes d'execució

Ara per ara tenim dos modes d'executar el joc.
  • Normal -> En aquest mode s'imprimeix el joc de forma normal i per ara te la funcionalitat de fer un display de certes opcions de debug com imprimir els rectangles que engloben els components. F1
  • Debug -> Per a executar el joc d'aquesta manera es necessari passar-li com a parametre la opció -debug d'aquesta manera el joc s'executarà en mode editor

ViewPort

Que es el viewPort? Es la zona de la pantalla en la que renderitza. D'aquesta manera pots dividir la pantalla en diferents zones.


Com afecta això al nostre motor? Comptant que tenim dos modes d'execució normal i debug.
En Normal es fa un display del viewPort del joc i en versions futures també del minimapa.
En Debug es fa un display dels 3. Un, el mas gran es el display de l'editor. I dins, estaria el viewport del joc.
En el viewPort del joc que esta dins del viewPort de l'editor es veuran les coses amb el mateix tamany, ergo es veura una porció mes petita del món.


Animacions

Per carregar animacions s'ha de pujar el png al zip (carpeta animation) junt amb el nou Units_data.xml editat. Al codi s'ha d'afegir la textura (png) al Start de M_Animation i al SetUnit d'Animation (i obviament afegir la nova classe a unit_type al Unit.h).

Entity system

La idea d'aquest sistema és tenir una classe mare de la qual hereta qualsevol cosa que es vulgui posar a l'escena per tal d'aprofitar el polimorfisme. D'aquesta manera si es necessita una classe per fer qualsevol cosa que vagi a l'escena, aquesta hereta de Entity la qual disposa de funcionalitat que facilitarà la feina i té varis mètodes virtuals que pots sobreescriure. Quan vulguis afegir funcionalitat per crear instàncies de la teva nova classe mira com es fa en el entity manager per tal d'assegurar-te que ho fas com cal.

Qué és una Entity?

Com ja s'ha dit Entity és una classe base per a totes les que hi hagin d'aparèixer a l'escena, aquesta consta d'algun atributs i mètodes per abstreure funcionalitat genèrica que només cal programar un cop, d'aquesta manera et podràs centrar en la funcionalitat específica de la teva classe.

Qué fa entity per tu?

  • Posicions i jerarquia.
  • Les entitats es distribueixen com un arbre, és a dir, totes parteixen d'un pare i poden tenir fills que és guarden en un vector. Per tant l'escena penja íntegrament d'una entitat arrel. Aquesta jerarquia ens permet controlar dos tipus de posicions de l'entitat dins del món: la local i la global.

    • Global: Aquesta és la que està en referencia del món i serà la posició on es pintarà en cas que ho hagi de fer.
    • Local: Aquesta està en relació a la posició del pare de tal manera que un objecte amb posició local 1, 1 fill d'un objecte amb posició global de 3, 2 tindrà una posició global de 4, 3.
    Aquestes diferències i els càlculs implicats els calculen internament i no cal que te'n preocupis però pel bon funcionament has d'utilitzar els mètodes per setejar la posició que ja té entity en lloc de modificar directament les variables (són privades per això i és important que no es manipulin a la lleugera).
  • Enable/Disable.
  • Les entitats consten de dos estats: actives o inactives. Quan estan actives aquestes executen la seva lògica i es pinten en pantalla, al contrari no ho faran si estan inactius. Quan s'activen o desactiven es criden els mètodes corresponents que podràs sobreescriure per tal que la teva classe actuï com vulguis.

    De nou per canviar aquest estat s'han d'utilitzar els mètodes que té entity per fer-ho:

    • Enable()
    • Disable()
    • SetActive(bool set)
  • DrawQuad.
  • És un rectangle que defineix la secció de la textura que s'ha de pintar en cas que en tingui de tal manera que per fer animacions simplement s'ha de canviar aquest rectangle des de la teva classe i automàticament s'actualitzarà al final del frame.

  • EnclosingBox.
  • La enclosing box és un rectangle que defineix l'espai mínim que ocupa l'entitat per utilitzar el quadtree(més info més abaix) i simular col·lisions simples. Aquest tamany s'hauria d'ajustar manualment amb l'ajuda del mode debug. En cas que no s'assigni s'utilitzarà el drawQuad automàticament.

  • Texture.
  • Totes les entitats tenen un punter a una textura, en el cas que li proporcionis una i el punter deixi de ser null, si l'entitat està activa es pintarà per pantalla en la posició global que tingui. Per tant si vols imprimir qualsevol objecte de l'escena només cal que li proporcionis una textura i una secció a l'entitat, de la resta ja se n'encarrega el mateix sistema i no caldrà que te'n preocupis més(no més blits des de qualsevol part del codi!!).

  • Métodes virtuals.
  • Entity consta de varis mètodes virtuals que es criden automàticament quan toca de tal manera que els pots sobreescriure per fer la classe en concret que vols fer. A continuació la llista de quins són:

    • Destructor: No molt a comentar. Vigila si alocates memòria!!!
    • void OnStart(): De moment no es crida mai pero serà quan es carregui una escena.
    • void OnFinish(): Es crida abans de fer el delete de l'entitat.
    • void OnEnable(): Es crida quan passa d'inactiva a activa.
    • void OnDisable(): Es crida quan passa d'activa a inactiva.
    • void OnTransformUpdated(): Es crida quan s'han reajustat les posicions per si la teva classe ho ha de tenir en compte.
    • void OnUpdate(float dt): Aquest és el més important, ja que és on has de posar la lògica de la teva classe. És crida cada frame si l'entitat està activa.
    • void DrawDebug(): Aquí pots definir que es pintarà en el mode debug.
    • bool Save(): De moment no funcional.
    • bool Load(): De moment no funcional.

Info extra.

- Les entitats tenen un nom al qual pots accedir i et pot ajudar en algunes coses.

  • MAI esborris directament una entitat. Si vols eliminar definitivament una entitat utilitza el mètode "Remove()" per que s'elimini de forma segura en el següent frame. En moltes ocasions surt més a conta desactivar l'entitat, ja que no es tindrà en compte per a res però no alterarà l'estructura de l'escena.

  • Pots canviar el pare d'una entitat amb el mètode "SetNewParent" que ja s'encarrega de tot.

  • Per crear instàncies de la nova classe mira entity manager i intenta seguir com es fa allà per tal de formar una espècie de factoria d'entitats.

  • Per més informació el codi està tot comentat.

  • Si vols fer alguna modificació estigues MOLT segur del que fas i preferiblement consulta-ho abans.


Advertencies!

A partir d'ara s'ha de vigilar amb les posicions. Sempre han de ser relatives al tamany i la posició del viewPort.
S'ha de vigilar també amb la raó del viewPort, sempre ha de ser 16:9
⚠️ **GitHub.com Fallback** ⚠️