Skip to content

Task: Data Handle Pattern #1700

Description

@Topi3

Taskin kuvaus

Otetaan käyttöön uusi "data handle" design pattern, jonka avulla voi käsitellä entitejä ja muita kokonaisuuksia pelissä.
Pääidea on, että kokonaisuuksilla on yksi handle, joka on helppo hakea, ja joka antaa helposti käsitellä koko kokonaisuutta.

Toteutus

Entiteille tai muille kokonaisuuksille voi määrittää handle structin, joka luodaan tarvittaessa ja joka pitää tietoa kokonaisuudesta.
Handle structit voivat elää vain yhden quantum framen ajan, jotta ei rikota quantumin rakennetta.

struct (name)Handle
{
  // sisältää yhden tai useamman staattisen Create metodin
  //{

  // yksinkertainen create
  public static (name)EntityHandle Create(EntityRef entityRef)
  // määritetään kun handleä käytetään yhtä entityä varten,
  // jossa tapauksessa luomisvaiheessa haetaan entityyn liittyviin komponentteihin pointterit.

  // linkattu create
  public static (name)EntityHandle Create(EntityRef entityRef)
  // määritetään kun handleä käytetään kokonaisuudessa, johon kuuluu monta entityä,
  // jossa tapauksessa luomisvaiheessa haetaan LinkQComponent, joka sisältää identifierin,
  // jonka avulla voidaan hakea referenssejä kokonaisuuteen liittyvään dataan
  // ja/tai asetetaan kokonaisuuteen liittyviä arvoja.

  // muu create
  public static (name)EntityHandle Create((type) (other identifier))
  // sets properties based on provided identifier
  // määritetään kun handleä käytetään kokonaisuuteen, joka ei liity entityyn,
  // jossa tapauksessa luomisvaiheessa käytetään muuta annettua identifieria,
  // jonka avulla haetaan referenssejä kokonaisuuteen liittyvään dataan ja/tai asetetaan kokonaisuuteen liittyviä arvoja.

  //}

  // antaa pääsyn komponentteihin, referensseihin ja muuhun dataan
  // {

  public EntityRef ERef { get; private set }

  public (Qcomponent) (component 1) { get; private set }
  public (Qcomponent) (component 2) { get; private set }
  ...

  public (type) (other property 1) { get; private set }
  public (type) (other property 2) { get; private set }
  ...

  // }
}

Tarvittaessa määritetään LinkQComponent, joka lisätään kokonaisuuteen liittyviin entiteihin.
Sisältää tarvittavat identifierit, joiden avulla voidaan luoda handle structi.
Voi sisältää myös enumin, joka merkkaa missä osassa kokonaisuutta komponentti on kiinni.

component (name)LinkQcomponent
{
  (name)EntityType
  EntityRef ERef
  (type) (other identifier)
}

enum (name)EntityType
{
  ...
}

Yhdessä kokonaisuudessa voi olla samaan aikaan osia, jotka liittyvät ja eivät liity entiteihin.
Kokonaisuudet voivat olla päällekkäisiä.
Se miten "data handle" pattern implementoidaan vaihtelee kokonaisuuden mukaan

  • Simulation
    • Lisää BattleHandle cs
      • Lisää struct BattlePlayerHandle
        • Lisää public static PlayerHandle Create(BattlePlayerSlot) metodi
          • Kutsuu SetPlayerDatan
        • Lisää public static PlayerHandle Create(EntityRef) metodi
          • 1. Hakee BattlePlayerLinkQComponent
          • 2. Kutsuu set metodit (data -> character -> (if link.type = hitbox) hitbox)
        • Lisää public LoadPlayerCharacter(EntityRef)
          • 1. Hakee BattlePlayerLinkQComponent
          • 2. Kutsuu SetCharacter
          • 3. Jos Hitbox
            • Kutsuu SetPlayerHitbox
          • 4. Jos ei Hitbox
            • Kutsuu UnsetHitbox
        • Lisää public PlayerData* playerData { get; private set; }
        • Lisää public EntityRef characterEntityRef { get; private set; }
        • Lisää public BattlePlayerCharacterDataQComponent* playerCharacterData { get; private set; }
        • Lisää public Transform2D* characterTransform { get; private set; }
        • Lisää public EntityRef hitboxEntityRef { get; private set; }
        • Lisää public BattlePlayerHitboxQComponent* hitboxComponent { get; private set; }
        • Lisää public Transform2D* hitboxTransform { get; private set; }
        • Lisää private SetPlayerData(BattlePlayerSlot) metodi
          • Asettaa playerDatan
        • Lisää private SetPlayerCharacter(EntityRef) metodi
          • Asettaa characterEntityRef ja character pointterit
        • Lisää private SetPlayerHitbox(EntityRef) metodi
          • Asettaa hitboxEntityRef ja hitbox pointterit
        • Lisää private UnsetHitbox
          • Asettaa kaikki Hitbox arvot nulliksi
      • Lisää struct BattlePlayerCharacterShieldHandle
        • Lisää public static BattlePlayerCharacterShieldHandle Create(EntityRef) metodi
          • 1. Hakee BattlePlayerCharacterShieldLinkQComponentin
          • 2. Kutsuu SetShield
          • 3. Jos ShieldHitbox
            • Kutsuu SetHitbox
        • Lisää public EntityRef shieldEntityRef { get; private set; }
        • Lisää public BattlePlayerShieldDataQComponent* shieldData { get; private set; }
        • Lisää public Transform2D* shieldTransform { get; private set; }
        • Lisää public EntityRef shieldHitboxEntityRef { get; private set; }
        • Lisää public BattlePlayerHitboxQComponent* shieldHitboxComponent { get; private set; }
        • Lisää public Transform2D* shieldHitboxTransform { get; private set; }
        • Lisää private SetShield(EntityRef) metodi
          • Asettaa shieldEntityRef ja shield pointterit
        • Lisää private SetHitbox(EntityRef) metodi
          • Asettaa shieldHitboxEntityRef ja hitbox pointterit
      • Lisää BattleProjectileHandle
        • Lisää public static BattleProjectileHandle Create(EntityRef) metodi
          • 1. Hakee BattleProjectileLink
          • 2. Asettaa ERef ja pointterit
        • Lisää public EntityRef ERef { get; private set; }
        • Lisää public BattleProjectileQComponent* projectile { get; private set; }
        • Lisää public Transform2D* transform { get; private set; }
    • Lisää BattlePlayerData qtn file
      • Lisää struct BattlePlayerData
        • PlayerRef PRef
        • BattlePlayerSlot Slot
        • BattleTeamNumber Team
        • BattlePlayerPlayState PlayState
        • bool IsBot
        • bool IsAbandoned
        • bool AllowCharacterSwapping
        • bool PlayerGiveUpState
        • FrameTimer RespawnTimer
        • int SelectedCharacterNumber
        • BattleEntityID CharacterEntityGroupID
        • array BattlePlayerCharacterState(CharacterCount) CharactersStates
        • array FPVector2(CharacterCount) CharacterPreviousPositions
    • BattlePlayerManagerData
      • Poista kaikki paitsi PlayerCount
      • Lisää array PlayerData(BattlePlayerCount) PlayerArray
    • BattlePlayerData
      • Nimeä uudelleen BattlePlayerCharacterData
      • Nimeä BattlePlayerDataQComponent uudestaan BattlePlayerCharacterDataQComponentiksi
    • Lisää BattleHandleLink qtn
      • Lisää BattlePlayerLinkQComponent
        • BattlePlayerSlot Slot
        • EntityRef CharacterEntityRef
      • Lisää PlayerEntityType
        • Character
        • Hitbox
        • Shield
      • Lisää BattlePlayerCharacterShieldLinkQComponent
        • EntityRef ERef
      • Lisää enum PlayerCharacterShieldEntityType
        • Shield
        • Hitbox
    • BattleProjectileTriggerQComponent
      • Nimeä uudestaan BattleProjectileLinkQComponent
      • Nimeä ProjectileEntityRef ERef
    • Lisää BattlePlayerData cs
      • Partial PlayerData struct
        • Siirrä kaikki tarvittava vanhasta PlayerHandlestä tänne
    • BattlePlayerManager
      • Lisää PlayerData* GetPlayerData(BattlePlayerSlot) metodi
        • Katso vanha PlayerHandle.GetPlayerHandle, sama logiikka(hae PlayerData arraysta)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Battlebattleen liittyvät tehtävät

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions