Dans un jeu basé sur des tuiles 2D, comment les PNJ et les tuiles doivent-ils se référencer?

9

Je fais un moteur de tuile pour les jeux 2D descendants. Fondamentalement, le monde est composé d'une grille de tuiles.

Maintenant, je veux mettre par exemple des PNJ qui peuvent se déplacer sur la carte.

Que pensez-vous est le mieux:

  1. chaque tuile a un pointeur vers le PNJ qui est sur sa tuile, ou un pointeur NULL
  2. avoir une liste de PNJ, et ils ont les coordonnées de la tuile sur laquelle ils se trouvent.
  3. autre chose?

je pense

  1. est plus rapide pour la détection des collisions, mais il utiliserait beaucoup plus d'espace mémoire et il est plus lent de trouver tous les PNJ dans une carte.
  2. c'est le contraire.
lezebulon
la source

Réponses:

11

Pourquoi pas les deux? Il y a des moments où vous voudrez voir s'il y a un PNJ sur une tuile spécifique (comme pour la détection de collision, comme vous l'avez mentionné), et d'autres fois où vous voudrez parcourir tous les PNJ du monde ( comme pour exécuter leurs méthodes d'IA à chaque image).

Un pointeur par tuile n'est pas beaucoup de mémoire, sauf si vous travaillez sur une plate-forme à mémoire limitée ou si vous avez une carte vraiment énorme.

Nathan Reed
la source
5
+1 J'ai tendance à être d'accord avec cela, cependant @lezebulon, je vous suggère d'encapsuler toute logique qui doit être mise à jour simultanément, le plus tôt possible. Autrement dit, lorsqu'un joueur quitte une tuile, il devrait y avoir une opération atomique (appel de fonction) pour supprimer les deux pointeurs, joueur à tuile et tuile à joueur, en même temps. Et de même pour lorsqu'un joueur arrive sur une tuile, faites les deux affectations de pointeurs ensemble. Cela vous évitera un chaos potentiel où les références ne sont pas d'accord les unes avec les autres, c'est-à-dire que l'une existe alors que l'autre ne l'est pas.
Ingénieur
0

Comment gérez-vous les collisions avec la carte? Si vous avez une couche de collision, un moyen très simple serait de créer d'abord une liste de PNJ avec des coordonnées indiquant sur quelle tuile ils se trouvent, puis de parcourir cette liste et de marquer la tuile de couche de collision sous le PNJ comme tuile de collision. De cette façon, les collisions contre les PNJ seraient traitées en même temps que le reste de la carte. C'est, bien sûr, si les PNJ ne bougent pas ...

Joona
la source