Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Un probleme pas comme les autres...
M.machine Hors ligne Membre Points: 91 Défis: 3 Message

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)


Lephenixnoir Hors ligne Administrateur Points: 24934 Défis: 174 Message

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.
Mon graphe (28 Janvier): (MPM ; serial gint ; (Rogue Life || HH2) ; PythonExtra ; ? ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
M.machine Hors ligne Membre Points: 91 Défis: 3 Message

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...
Farhi Hors ligne Membre Points: 1417 Défis: 0 Message

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 :
Longueur  
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.
"La créativité est contagieuse faites la tourner"
Albert Einstein
M.machine Hors ligne Membre Points: 91 Défis: 3 Message

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...

Farhi a écrit :
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 ?
Farhi Hors ligne Membre Points: 1417 Défis: 0 Message

Citer : Posté le 11/03/2025 22:18 | #


M.machine a écrit :
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).

M.machine a écrit :
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.
"La créativité est contagieuse faites la tourner"
Albert Einstein
Fcalva Hors ligne Membre Points: 618 Défis: 10 Message

Citer : Posté le 11/03/2025 22:56 | #


Fahri a écrit :
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
M.Machine a écrit :
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.
Apréciateur de Noctua moyen
Caltos : G35+EII, G90+E (briquée )
Tuper4 Hors ligne Membre Points: 1017 Défis: 26 Message

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.
Je fais que de confondre Noël et Halloween
Par ce que Oct 31= Dec 25
Fcalva Hors ligne Membre Points: 618 Défis: 10 Message

Citer : Posté le 12/03/2025 13:35 | #


Tuper4 a écrit :
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
Apréciateur de Noctua moyen
Caltos : G35+EII, G90+E (briquée )
M.machine Hors ligne Membre Points: 91 Défis: 3 Message

Citer : Posté le 17/03/2025 15:05 | #


Farhi a écrit :
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.

Farhi a écrit :
Ç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

Farhi a écrit :
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................

Fcalva a écrit :
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 :
Farhi a écrit :
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))

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2025 | Il y a 124 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd