1 2 — Les entités
Shadow15510 edited this page 2022-07-16 11:06:25 +02:00
This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Les entités

Présentation générale

Les entités sont des objets présents en sur-impression sur la carte. Les PnJ, en sont, les points d'intérêts aussi etc. Chaque entité présente sur la carte est représentée par une liste de la forme : [identifiant, symbole, carte, x, y, animation, autres].

  • l'identifiant permet de cibler l'entité dans le reste du moteur
  • le symbole est le caractère qui sera affiché pour symboliser l'entité
  • carte, x, y sont les coordonnées de l'entité (indice de la carte et les coordonnées sur cette carte)
  • l'animation correspond au type de mouvement que l'entité peut avoir.
  • 'autres' est un argument facultatif, laissé vide la plupart du temps qui permet de fournir des données supplémentaires utiles pour certains type d'animation.

Gestion des entités

Animations

Les animations peuvent être programmées par vos soins comme bon vous semble. Il vous suffit pour cela de créer des fonctions qui prennent 5 arguments :

  • l'entité (l'objet associé à)
  • la liste data qui contient les données du moteur
  • la liste stat qui contient les données du jeu
  • screen qui est un objet qui correspond à l'écran
  • walkable qui est une chaîne de caractère qui contient les caractères sur lesquelles on peut marcher.

Les entités possèdent les attributs Entity.pos_x et Entity.pos_y qui sont ses coordonnées. Vous pouvez changer le type d'animation d'une entité via la méthode dédiée Entity.change_behavior(new_behavior) (prend en argument le nom de la nouvelle animation).

Pour l'écran, rien de fondamentalement indispensable, pour récupérer la valeur d'une case utilisez la méthode Screen.get_cell(x, y) pour avoir la valeur de la case en x, y.

Les fonctions d'animations vont donc être de la forme :

def mon_animation(entite, data, stat, ecran, cases_autorisees):
    ...

Ces fonctions ne retournent rien.

Vous devez ensuite consistuer un dictionnaire avec vos animations en mettant comme clef le nom de l'animation :

animations = {"animation_1": mon_animation, ...}

Il existe quatre animations fournies avec le moteur :

  • "permanent" : l'entité ne bouge pas et son type d'animation est verrouillé (i.e. ne peut pas être modifié dans la suite)
  • "stand by" : l'animation par défaut, l'entité ne bouge pas
  • "follow" : l'entité se met à suivre le joueur partout, par défaut l'entité ne peut marcher que sur les mêmes cases que le joueur, mais il peut y avoir certains glitchs, notamment avec les portes où l'entité se met à bloquer le passage au joueur. Vous pouvez alors placer une chaîne de caractères qui contient les caractères autorisés en plus.
  • "walk between" : nécessite deux arguments supplémentaires : un entier initialisé à 0; et la liste des coordonnées des cases sur lesquels l'entité va passer. L'entité va parcourir en boucle les points donnés.
  • "walk to" : nécessite également deux arguments en plus : un entier initialisé à 0; et la liste des coordonnées des cases. Une fois arrivé à destination, l'entité va arrêter de bouger, son statut reviens alors en "stand by".
  • "follow by player" : comme "walk to" mais si le joueur est trop loin, le PnJ stoppe momentanément son mouvement.

Par exemple le tuple :

["bandit", "$", 0, 4, 7, "walk between", 0, ((4, 7), (3, 7), (3, 6), (4, 6))]

correspond à une entité du nom de "bandit" symbolisée par le caractère "$", initialement positionnée aux coordonnées (4; 7) de la carte d'indice 0 et qui effectue une marche entre les 4 points donnés. L'entier initialisé à 0 est l'indice du point courant dans la liste des coordonnées.

Autre exemple :

[0, "*", 0, 1, 2, "follow", "^"]

est une entité d'identifiant 0, de symbole *, initialement positionnées en (1; 2), qui va suivre le joueur et qui peut marcher sur les cases contenant le caractère "^" (en plus des caractères autorisés par défaut).

Si vous voulez modifier le type d'animation et que vous avez besoin des arguments supplémentaires, vous pouvez modifier l'attribut : Entity.args qui est une liste.

Note : les animations qui font bouger l'entités prennent en arguments les coordonnées par lesquelles l'entité doit passer. Vous pouvez également préciser uniquement les coordonnées de départ et d'arrivée : l'entité se déplacera alors en ligne droite et/ou en diagonale pour rejoindre son point d'arrivée.

Téléportation

Les entités peuvent être téléportées sur différentes cartes. Pour cela, vous pouvez utiliser la méthode Entity.teleport associée à l'entité ciblée. L'usage est simple, la méthode prend trois arguments :

  • l'indice de la carte d'arrivée
  • la position en x
  • la position en y

Utilisation manuelles des entités lors d'évènements

Les fonctions évènementielles prennent en argument le dictionnaire des entités présente sur la carte courante ainsi que l'identifiant de l'entité activée par le joueur. Pour accéder à l'entité en tant qu'objet, il vous suffit d'utiliser le dictionnaire : entite_activee = entites[identifiant]. Vous avez alors accès à différents paramètres :

  • Entity.pos_x; Entity.pos_y : les coordonnées de l'entité
  • Entity.behavior : le type d'animation actuel de l'entité
  • Entity.symbol : le symbole de l'entité
  • Entity.args : les paramètres facultatifs de l'entité (sous forme de liste)

L'objet est également muni de quelques méthodes:

  • Entity.change_behavior(new_behavior, *args) : une méthode qui permet de changer le type d'animation
  • Entity.teleport(map_id, x, y): téléporte l'entité aux coordonnées ciblées

L'entité est entièrement modifiable (par effet de bord).