Un probleme pas comme les autres...
Posté le 10/03/2025 19:29
Bonjour ! Je programme actuellement un petit moteur de jeu 2D style RPG en C. Pour le moment j'ai codé un ECS (fonctionnel !) mais je suis bloqué sur les maps...
Voici le contexte :
Les maps sont au format json lorsqu'elle sont stockés sur l'ordinateur et (de manière logique) il faut les convertir pour la calculatrice.
Or, les maps contiennent les différentes layers de tiles MAIS, aussi et surtout, les différentes entités.
Pour donner un exemple voici comment je crée une entité, ici le joueur :
entity_t *player = entity_manager_add_entity(&game.entity_manager, "player");
rect_t player_bounds = {10.0f, 10.0f, 32.0f, 32.0f};
add_component(player, create_component(TRANSFORM_COMPONENT), player_bounds, PLAYER_DEFAULT_SPEED);
add_component(player, create_component(SPRITE_COMPONENT), "player_idle_sheet");
add_component(player, create_component(ANIMATION_SYSTEM), 4, 0, PLAYER_DEFAULT_IDLE_ANIMATION_SPEED, true, true, false);
add_component(player, create_component(PLAYER_SYSTEM));
(c'est beau hein
)
Vous pouvez voir que ce n'est pas forcément simple de stocker ces différent types de donnés de manière propre dans une structure "map_t" par exemple...
Donc voici ma question :
Est-ce que ce serait plus propre de stocker la partie intéressante du fichier json qui contient toutes les définition des entités ou alors quelque chose de plus simple vous viendrai en tête ?
En tout cas merci d'avance et j'espère que d'autres ont déjà eu le problème et donc une solution pas trop complexe...
(et oui je vais publier le moteur)
Citer : Posté le 10/03/2025 19:40 | #
De loin on dirait que t'as d'abord envie de définir un modèle d'entité (e.g. ennemi, objet au sol, particule, etc) avec ses propriétés, et dans la map juste mettre une liste de modèles d'entités à instancier au chargement. Ça ne fait que déplacer légèrement la complexité : maintenant t'as plein de propriétés à définir pour les modèles d'entité. Mais ça me semble pas délirant, personnellement.
Citer : Posté le 10/03/2025 21:12 | #
Je vois... Pas mal, pas mal... Mais après ça casse un peu le côté modulable...
Ou alors je pourrais créer un autre fichier json qui defini tout les model d'entitées...
Citer : Posté le 11/03/2025 13:19 | #
Si j'étais à ta place :
Lors de la compilation de ton projet, je convertirais la map en un fichier binaire.
Chaque tile aurait un ID (int), par exemple :
0 → Vide
1 → Herbe
2 → Terre
etc.
Si ta map fait 10 × 15 cases et possède 3 layers.
Pour les entités, tu pourrais adopter un système similaire à Unity, en utilisant des Prefabs associés à un index, par exemple :
0 → Joueur
1 → Monstre1
2 → Monstre2
Lors de la lecture, il appellera la fonction de création de l'entité adéquate en fonction de son index.
Ainsi, ton fichier binaire pourrait ressembler à ceci :
Largeur
Nombre de layers
Données de la map (toutes les tiles et layers sur une ligne)
Nombre d'entités
X, Y, ID_Entité_1
X, Y, ID_Entité_2
...
Selon moi, ce serait une bonne façon de stocker et lire la map efficacement.
Albert Einstein
Citer : Posté le 11/03/2025 16:45 | #
Je vois ! Bonne approche... Et ça reprend le système de "template" d’entités.
Mais au pire j'utilise le format json avec une lib python ça devrait passer...
similaire à Unity
Mais ou est-ce que tu apprend des truc comme ça, moi ça m’intéresserait de savoir comment des moteurs comme Unity fonctionnent mais je tombe seulement sur des tutoriel "débutant" ? Car le meilleur moyen d'apprendre c'est par l'exemple n'est-ce pas ?
Citer : Posté le 11/03/2025 22:18 | #
Mais au pire j'utilise le format json avec une lib python ça devrait passer...
Pour le code en Python, oui, mais ici, il s'agit du format pour le C. Toi, tu veux convertir ta map JSON en C, sauf que ce que je te dis, c'est que tu peux convertir ta map en fichier binaire pour que ton programme en C puisse le lire (et non la convertir en ligne de code). Ça permet d'économiser de la place sur ton exécutable, car tu n'as pas le droit de créer un exécutable de plus de 2 Mo sur les calculatrices. Donc, si tu as beaucoup de maps, pas le choix : tu dois les stocker à l'extérieur (dans un fichier binaire).
Mais ou est-ce que tu apprend des truc comme ça, moi ça m’intéresserait de savoir comment des moteurs comme Unity fonctionnent mais je tombe seulement sur des tutoriel "débutant" ? Car le meilleur moyen d'apprendre c'est par l'exemple n'est-ce pas ?
T'as de la chance, car tu parles à une personne qui utilise Unity depuis 2015 et qui a tenté de refaire son propre moteur des tonnes de fois.
Bon, pour commencer, si tu veux faire un moteur comme Unity, tu le fais en C++ et pas en C. Tu me remercieras pour ça.
Ensuite, t'as pas mal d'aide dans la doc et sur les forums d'Unity.
Il faut toujours garder en tête l'ordre d'exécution, c'est fondamental.
Ensuite, il faut chercher à comprendre comment fonctionnent les GameObjects et les Components.
Pour revenir sur ta question de "où on apprend tout ça", la réponse est : "En essayant et en échouant". Il n'y a pas de miracle ni de recette magique, c'est du brute force. Tu essayes de faire fonctionner des choses pas à pas, commence par créer des petits projets, puis deviens de plus en plus ambitieux. Tu vas passer des heures à t'arracher la tête sur un problème, mais ce n'est pas grave : une fois résolu, tu ne referas plus jamais cette erreur et surtout tu vas comprendre POURQUOI ça ne marchait pas. C'est de cette façon que j'ai déduit le comportement d'Unity pour ma part.
En plus aujourd'hui, tu as de la chance, car t'as ChatGPT, qui est vraiment bien pour expliquer le fonctionnement d'Unity et peut même te faire un tuto sur mesure selon tes attentes.
Albert Einstein
Citer : Posté le 11/03/2025 22:56 | #
ChatGPT
Si tu l'avais mis au début j'aurais arrêté de lire là
Non, ChatGPT n'est pas un bon outil pour apprendre. Encore moins à un niveau plus technique.
Je vais pas m'étendre sur le sujet ici (#hs éventuellement), mais bref c'est le cas, et clairement ça transforme en bouille le cerveau de ceux qui en abusent
Mais ou est-ce que tu apprend des truc comme ça, moi ça m’intéresserait de savoir comment des moteurs comme Unity fonctionnent mais je tombe seulement sur des tutoriel "débutant" ? Car le meilleur moyen d'apprendre c'est par l'exemple n'est-ce pas ?
Tu as les docs officiels de Unity qui sont disponibles sur https://docs.unity.com/ si tu tiens à t'en inspirer.
Caltos : G35+EII, G90+E (briquée
Citer : Posté le 12/03/2025 13:06 | #
Bah tu veux utiliser quoi dans ce cas là?
ChatGPT ou même Claude AI sont super bon dans ce domaine là. Alors si tu ne sais pas n'utiliser et demander seulement des réponses en ne sachant pas ce que tu fais, là oui, c'est mauvais. Mais tant que tu check ce qu'il te dit et que tu comprends, je reste sur l'avis de Farhi
C'est comme une calculatrice, il s'agit d'un outil pour te guider (L'IA peut apprendre par contre contrairement à la calto) et qui n'a aucune utilité si tu ne l'utilise pas correctement.
Après, ça c'est mon point de vue et j'ai pû survoler au dessus quelque chose sans le voir.
Par ce que Oct 31= Dec 25
Citer : Posté le 12/03/2025 13:35 | #
Bah tu veux utiliser quoi dans ce cas là?
Tes neurones
J'ai pas envie de trop dérailler le topic, donc -> #hs si tu veux débatre
Caltos : G35+EII, G90+E (briquée
Citer : Posté le 17/03/2025 15:05 | #
c'est que tu peux convertir ta map en fichier binaire pour que ton programme en C puisse le lire (et non la convertir en ligne de code)
J'ai demandé à un pote irl (il a 20 ans d’expérience...) et il m'a proposé un truc comme ça, la sérialisation binaire je crois.
Ça permet d'économiser de la place sur ton exécutable, car tu n'as pas le droit de créer un exécutable de plus de 2 Mo sur les calculatrices.
A caca, ça je savais pas
Donc, si tu as beaucoup de maps, pas le choix : tu dois les stocker à l'extérieur (dans un fichier binaire).
Bas en fait ça risque d'être nécessaire vue que c'est un moteur pour rpg................
Non, ChatGPT n'est pas un bon outil pour apprendre. Encore moins à un niveau plus technique.
Je vais pas m'étendre sur le sujet ici (#hs éventuellement), mais bref c'est le cas, et clairement ça transforme en bouille le cerveau de ceux qui en abusent
Alors je sais que je ne devrai pas rentrer dans le débat et tu as raison il faudrait continuer dans #hs pour ça mais bon...
Dans ta phrase il y a une contradiction, tu dit que "ChatGPT n'est pas un bon outil pour apprendre." mais que "ça transforme en bouille le cerveau de ceux qui en abusent".
J'ai déjà utilisé ChatGPT, et sincèrement, comme le dit Farhi, c'est pratique pour "faire un tuto sur mesure selon tes attentes". (je sais faire des castes dynamiques polymorphiques en C++ maintenant, et s'il vous plaît trouver moi un tutoriel explicatif étape par étape et explicite sur ce qu'est ce truc et là je laisse tomber
Or, je ne peut pas nier le fait que si on en abuse, ou que l'on ne s'en sert pas bien, c'est très mauvais, ça peut nuire à la production voir "transformer en bouille le cerveau de ceux qui en abusent".
Edit :
utilise le C++ au lieu du C
T'inquète, j'ai un peu d'expérience là dedans mais il y avait tellement de fuite mémoires partout que je me suis dit que j'allais faire du C pour m'entrainer. (2D_Engine (C++ cracra))