CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] Stocker des données efficacement

lokilok
lokilok
Niveau 17
14 septembre 2012 à 18:21:44

Bonjour.

En fait je suis entrain de faire un petit jeu, et je voudrais savoir quel était le meilleur moyen pour stocker différentes information sur le niveau.

En fait je veux stocker des événement qui se déclencherons dès que le joueur dépasse la position x, des ennemis et des éléments du niveau qui seront fixe (mur, bonus, etc etc).

Au début j'avais pensé à une liste pour les événements et un tableau pour les ennemis/éléments fixe, mais comme la taille du niveau est variable c'est pas une très bonne idée je pense.

Voilà, je sais pas trop dans quoi les stocker sans faire un truc trop lourd ou sans faire plein de listes ou je ne sais trop quoi, merci d'avance de votre aide.

chris_27
chris_27
Niveau 10
14 septembre 2012 à 18:26:34

Bonjour,

La question de choisir une bonne structure de données est toujours une bonne question. Pour y répondre, le seul moyen efficace que je connaisse est d'établir clairement ce que tes structures vont contenir (types des différentes valeurs stockées) et les opérations que tu es sucéptible de faire à l'éxecution (recherche d'un élément, ajout/suppression, tri, etc.).

À partir de là, on peut commencer à réfléchir.

Caudheur
Caudheur
Niveau 8
14 septembre 2012 à 18:56:33

Salut,

un article intéressant (mais qui ne concerne que les conteneurs STL) : http://cpp.developpez.com/faq/cpp/?page=STL#STL_choix_conteneur

lokilok
lokilok
Niveau 17
14 septembre 2012 à 19:49:25

Bah pour les événement, ça sera une classe et une positon x, et pour les ennemis ça sera une classe et une position x,y.

Après, pour ce qui est des murs et tout le trala, je sais pas si je dois stocker des classe ou juste des int, mais je penche plutôt pour des classe (plus de flexibilité).

Caudheur, merci mais justement j'hésite sur la manière dont ce sera stocker, alors difficile de choisir un conteneur avant d'avoir trouvé.

godrik
godrik
Niveau 30
14 septembre 2012 à 20:45:53

pour qu'un evenement se declenche quand le joueur arrive a une position, la technique la plus simple que je connaisse est de rajouter une entite a ton jeu qui a un traitement de collision approprie. Ca te permet tirer de toutes les optimisation de collisions qu'il te faudra faire de toute facon.

Aldebran
Aldebran
Niveau 10
14 septembre 2012 à 22:16:03

Si j'ai bien compris lorsque le joueur dépasse une position X, un évènement doit se déclencher ?

- Que se passe-t-il si le joueur revient avant X et repart après ? L'évènement doit-il se déclencher plusieurs fois ?
- Le joueur peut-il faire des "sauts" sur l'axe X, ou bien se déplace-t-il de manière continue dans le sens des X croissants ?
- Une fois chargé, le niveau peut-il évoluer ? (rajout de nouveaux évènements ou de nouveaux ennemis ?)
- Si un ennemi s'approche de toi de telle manière que son X devient inférieur au tient, l'évènement doit-il se déclencher ?

A priori, vu que seul l'axe X t'intéresse, il n'est pas intéressant d'implémenter un vrai système de collision avec bounding box. Et dans le cas le plus simple (évènements déclenchés une seule fois, objets fixes connus au lancement du niveau, déplacement continu de sens constant), un vulgaire tableau alloué dynamiquement peut suffire pour stocker les éléments fixes : en retenant le nombre d'évènements déclenchés tu peux savoir exactement quel est le prochain élément susceptible de se déclencher et tester sa condition de déclenchement. Et toujours dans ce cas "simple", le mieux serait une liste triée en fonction de la position X pour tes objets mobiles (et mise à jour à chaque évolution de ton environnement), pour qu'avec une recherche dichotomique tu puisse rapidement trouver les ennemis les plus proches sur l'axe X, vérifier s'ils satisfont la condition de déclenchement et éventuellement déclencher l'évènement.

lokilok
lokilok
Niveau 17
14 septembre 2012 à 23:08:34

"- Que se passe-t-il si le joueur revient avant X et repart après ? L'évènement doit-il se déclencher plusieurs fois ? "

Pour l'instant non, mais peut-être je rajouterais un événement qui s'enclenche plusieurs fois, je sais pas encore.

"- Le joueur peut-il faire des "sauts" sur l'axe X, ou bien se déplace-t-il de manière continue dans le sens des X croissants ? "

Tu veux dire passer de x = 0 à x = 50 par exemple d'un coup ? Non, il bouge que de 5 pixels par 5 pixels.

"- Une fois chargé, le niveau peut-il évoluer ? (rajout de nouveaux évènements ou de nouveaux ennemis ?) "

Certains événements peuvent rajouter des ennemis, mais il ne peut pas y avoir plus d'événement qu'au départ.

"- Si un ennemi s'approche de toi de telle manière que son X devient inférieur au tient, l'évènement doit-il se déclencher ? "

Non, les ennemis n'influent pas sur les événements.

Sinon j'ai compris ce que tu dis pour les événements, mais pas pour les objets mobile (tu parle bien des ennemis ?).

Enfin le truc, c'est que quand les ennemis apparaissent à l'écran, ils sont considéré comme actif, donc c'est uniquement à ce moment là que je les fais bouger/attaquer etc etc. Et je vois pas trop l'utilité d'une recherche dichotomique là dedans.

hyrulink2
hyrulink2
Niveau 7
15 septembre 2012 à 00:03:27

Ce que tu peut faire c'est rajouter un "faux ennemi" invisible qui, lorsqu'il entre en collision avec le joueur déclenche l’évènement. Comme ça tu n'a pas à gérer le stockage des évenèments différemment.
Ce que je fais en général dans un jeu c'est considérer le jeu comme une liste de "process". Un process peut être un ennemi, le joueur, une liste de process à déclencher séquentiellement, un process à déclenchement conditionellemnt(par une collision par exemple), etc...
Chaque process a une methode update qui le met à jour.
Ca permet de gérer indifféremment les entités du jeu et ça simplifie le code.

Neofungamer
Neofungamer
Niveau 22
15 septembre 2012 à 13:37:03

J'aime bien ce que propose hyrulink2

Dans l'idée, tu peux considérer que chaque Agent/Entity est capable d'interagir avec les autres entities qui se trouvent dans un champ de vision que tu peux définir.

Ainsi si ton Personnage passe devant un Arbre, celui si est en mesure de lancer l'Interaction la plus appropriée qui par exemple instanciera des ennemis à des positions précises.

Ces ennemis fonctionnants de la même manière que l'Arbre, pourront apercevoir le Personnage et déclencher l'interaction s'Approcher puis lorsqu'ils seront assez proche, déclencheront l'interaction Attaquer.

De là pour ton moteur de comportement on a une notion qui émerge et qui est la notion de précondition.

Suis-je assez proche pour attaquer? Si oui j'attaque
Si non j'avance

Une autre précondition peut apparaitre :

Suis-je assez fort pour attaquer? Si oui j'attaque
Si non, je me barre

Du coup d'un point de vu code, on a des Agents et des Interactions
un Agent possède n Interactions (en général quelques unes. Elles peuvent être placée dans un tableau par ordre de priorité par exemples.)

lokilok
lokilok
Niveau 17
17 septembre 2012 à 18:17:22

Merci à tous.

Donc je pense utiliser une map pour stoker les objets fixe, et une liste pour les entités.

_TheAutist_
_TheAutist_
Niveau 10
19 septembre 2012 à 20:52:49

tu peux faire une classe pour tes entités et des classes filles éventuelles pour leurs détail.
Et tu créeras un objet pour chaque entité créée.
Ensuite, tu les stocke dans un vecteur ou un tableau si tu veux limiter leur nombre.

hyrulink2
hyrulink2
Niveau 7
20 septembre 2012 à 14:47:23

"tu peux faire une classe pour tes entités et des classes filles éventuelles pour leurs détail. "
:d) Ça je le déconseille fortement, on croit gagner du temps et au final c'est le gros bordel dès que le jeu deviens conséquent. Je me permet de dire ça car quand je découvrais l'objet, tout excité que j'étais par l'héritage et ses possibilités, j'ai eu le malheur de faire ça pour un jeu et crois moi c'était pas joli à voir à la fin. Bref, utiliser l'héritage pour ajouter des détails est très tentant mais c'est mauvais, pour ça il y a la composition.

godrik
godrik
Niveau 30
20 septembre 2012 à 15:27:58

hyrulink +1.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment