JeuWeb - Crée ton jeu par navigateur
Boucle rétroactive dans une simulation - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Boucle rétroactive dans une simulation (/showthread.php?tid=7965)



Boucle rétroactive dans une simulation - Xenos - 17-01-2019

Salutations,

En progressant sur le développement de VariiSpace, je tombe maintenant dans un cas qui m'a laissé de mauvais souvenirs sur ECLERD: une boucle rétroactive.

Actuellement, la règle du jeu est la suivante:
• Un objet céleste est composé d'atomes en certaines quantité
• La quantité de chacun de ces atomes fait rayonner l'objet céleste
• Ce rayonnement peut détruire les vaisseaux orbitant autour de l'objet céleste
• Les vaisseaux ainsi détruits retombent sur l'objet céleste, et leur masse (leurs atomes) est intégrée à l'objet céleste

J'ai donc une boucle rétroactive: Composition de l'oc -> rayonnement -> vaisseaux détruits -> changement de la composition de l'oc

Comment gérez-vous ces cas sur vos jeux? Jusqu'ici, je n'ai trouvé que trois solutions:
• Résoudre analytiquement l'équation: c'est compliqué, chiant, et pas toujours faisable, j'aimerai donc l'éviter
• Itérer dans la simulation jusqu'à converger: ici, c'est faisable, car on n'a rien qui peut "recréer" des vaisseaux, donc c'est envisageable, mais ça me semble un peu lourd et un peu chiant à implémenter (il faut savoir s'il est pertinent de reboucler ou non, et boucler un nombre fini de fois jusqu'à ce que l'état de l'objet céleste soit inchangé)
• Changer les règles du jeu: je ne vois alors pas trop lesquelles utiliser?

Alors, comment gérez-vous ça dans vos jeux? Ou dans vos projets pros?


RE: Boucle rétroactive dans une simulation - Ter Rowan - 18-01-2019

hello pas sûr d'avoir capter les subtilités mais si je reste sur une compréhension simple du besoin

pour moi itérer jusqu'à ce que une des conditions suivantes soit réunie

- le nombre d'itérations t'amène à ta "date" (je pense que tu veux savoir l'état de ton "système" à une date T)
- il n'y ait plus de vaisseau ( donc l'état est forcément stable jusqu'à ce qu'un nouveau vaisseau arrive mais là on revient à une date T ?)


RE: Boucle rétroactive dans une simulation - Xenos - 18-01-2019

En fait, ce n'est pas tellement une "date": je fais pas des itérations qui ont une durée T, mais je fais des itérations pour converger vers un état stable. Par exemple, j'ai 30 masses de vaisseaux et de débris en orbite autour d'une planète qui n'en accepte que 10, parce que la planète fait elle-même 100 de masse (rapport: 10/100 entre la masse de la planète et la masse totale possible en orbite).
Cette masse excédentaire en orbite peut venir de plein de choses: parce qu'il y a eu une bataille avant, ou parce que le joueur a extrait de la matière de la planète qui est donc moins massive alors que ses vaisseaux sont maintenant plus massifs car leurs soutes sont remplies, etc).
Il faut donc que je trouve un mécanisme pour ramener la planète à l'équilibre. Je peux dire "la limite c'est 10, y'a 30 de masse en orbite, donc je 'crashe' 20 unités de masse sur la planète" mais la planète fait alors 120 de masse, donc, elle accepte 12 de masse sur son orbite: l'orbite a été "trop" vidée. Après, je peux ignorer ce genre de soucis pour le moment, et considérer que l'orbite a été un peu plus vidée que prévu...

Mais dans le cadre du rayonnement, je ne sais pas si je pourrai faire de même: là, je peux faire de l'excédent (crasher trop de vaisseaux) car plus le nombre de vaisseaux crashés augmente, plus j'ai de place dispo en orbite, donc, je n'ai besoin que d'1 calcul, quitte à être "trop méchant" avec le joueur. En revanche, pour le rayonnement, ce sera l'inverse: plus la planète est massive, plus elle rayonne, et plus les vaisseaux seront détruits par ce rayonnement (car ils ont une "résistance" au rayonnement)?! Si je garde l'exemple de la masse, ça veut dire qu'une planète de masse M peut avoir jusqu'à (20 - M/10) masses de vaisseaux en orbite. Donc, ma planète de 1000 masse peut avoir (20 - 100 / 10) = 10 de masse de vaisseaux en orbite, donc je crash 20 masses de vaisseaux, la planète fait maintenant 120 de masse, donc max (20 - 120/10) = 8 masses de vaisseaux, etc etc jusqu'à ce que je converge?! Soit je fais ainsi, soit je change de règle, soit je résoud l'équation et j'implémente cette résolution... je voulais savoir comment font les autres


RE: Boucle rétroactive dans une simulation - Ter Rowan - 18-01-2019

arf quand je te lis, j ai peur que tu repartes sur le même travers qu'Eclerd, une simulation trop pointilleuse qui complexifie et nuit au gamepay.

Ca se trouve y a pas de pb mais fait attention quand même Smile


RE: Boucle rétroactive dans une simulation - Xenos - 18-01-2019

Ouep, j'ai la même peur, mais je pense au fond qu'il "suffit" que je ne généralise pas trop mes fonctions de calculs. Par exemple, la masse de la planète divisée par 100, c'est la masse maxi en orbite. Ca, j'ai pas envie de le lâcher niveau gameplay (ça sert à se protéger d'une trop grosse flotte ennemie). De même, je ne veux (et ne peux) interdire aux joueurs de dépasser cette limite (car sinon, on serait inattaquable: si j'ai saturé l'orbite d'une planète, personne ne peut y venir pour m'attaquer: c'est "trop safe" je dirai). Donc il faut que je trouve une mécanique simple pour le cas où l'orbite d'une planète sature.

La formule "masse maxi en orbite = masse planète / 100" est simple, et surtout, monotone (elle croit toujours: plus la planète est lourde, plus y'a de place dans l'orbite), donc, si je dépasse la limite, je n'ai qu'à crasher ce qui dépasse sur la planète et à faire un joli "rapport d'incident" au joueur: c'est simple, et la flotte crashée dans la planète l'ayant alourdie, il y aura forcément assez de place dans l'orbite pour les vaisseaux suivants.

Pour le rayonnement, il me faudrait pareil: une limite simple et claire à comprendre, et une conséquence simple et unique si on la dépasse... Je vais tâcher de trouver, ça devrait bien se passer finalement Smile