JeuWeb - Crée ton jeu par navigateur
Mon apprentissage de Erlang - 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 : Mon apprentissage de Erlang (/showthread.php?tid=5664)

Pages : 1 2 3 4


RE: Mon apprentissage de Erlang - niahoo - 21-10-2012

Oui il y a des cas des fois ou init reçoit une liste vide, je ne sais plus où j'en ai vu.

Sinon une petite correction : infinity ici c'est pour le délai de shutdown, non pas de lancement. On met infinity pour les supervisor car on ne connait pas la taille des sous-arbres, un superviseur qui supervise 5 étages de superviseurs/workers peut mettre du temps à vouloir s'éteindre, on lui laisse donc tout son temps. Pour un worker on mettra par défaut 5000 (5 secondes), temps au bout du quel il sera tué (brutal_kill).

tout est là : http://www.erlang.org/doc/design_principles/sup_princ.html#spec


RE: Mon apprentissage de Erlang - Sephi-Chan - 21-10-2012

Bien vu Niahoo ! Merci pour le correctif. Smile


J'ai énormément progressé aujourd'hui ! On peut désormais interagir avec l'application de manière à ajouter un vaisseau dans le monde. Les vaisseaux persistent également au redémarrage du serveur de jeu.


La première étape a été d'ajouter Mnesia au projet. C'est une base de données spécifique à Erlang et qui en reprend les caractéristique (distribuée et concurrente).


Plus concrètement, j'ai ajouté une fonction create au module ship.


create({ X, Y }) ->
Ship = #ship{ id = make_ref(), x = X, y = Y, speed = 100 },
save_ship_in_database(Ship),
supervisorConfusedtart_child(ship_sup, ship_to_ship_specification(Ship)).

La fonction reçoit un tuple de coordonnées et crée un record pour le vaisseau auquel elle attribut un identifiant unique, les coordoonées données et une vitesse.

Elle sauvegarde ce record en base de données via save_ship_in_database puis démarre le processus pour le vaisseau sous la surveillance du superviseur ship_sup.

L'état utilisé par le processus est simplement le record.


Le reste de la magie a lieu dans le module ship_sup[/var. Au démarrage de ce superviseur (lui même lancé par le superviseur principal [var]battlefleet_sup), je fais en sorte qu'il lance les processus des vaisseaux sauvegardés.


init(_Args) ->
{ ok, { { one_for_one, 10, 60 }, ships_specifications() } }.


ships_specifications() ->
Ships = ship:all(),
[ shipConfusedhip_to_ship_specification(Ship) || Ship <- Ships ].

Ici, on peut voir que la fonction ships_specifications génère — à partir de la liste de tous les vaisseaux sauvegardés — une liste de descripteurs de processus. J'utilise ici le mécanisme de lists comprehensions pour boucler sur la collection.


Je suis donc très content du résultat puisque avec assez peu de code (67 lignes actuellement) j'arrive à un résultat bien pratique ! Il y a 48h à peine, je n'avais jamais écrit d'application Erlang, mais seulement des petits tests dans une console.


La prochaine étape majeur, c'est la mise en mouvement des vaisseaux. Chaque processus de vaisseau pourra recevoir trois types de message : un pour le faire avancer, un pour l'arrêter et un pour changer son angle.

Je pense implémenter ça grâce à des timers qui feront calculer à chaque vaisseau sa nouvelle position à intervalle régulier (toutes les 100 ms, par exemple). Je ferais des tests d'occupation CPU pour voir comment ça se comporte.


Les étapes suivantes seront d'introduire une visualisation du plateau de jeu dans un navigateur (avec Canvas), puis d'introduire la notion de joueur qui pourront contrôler les vaisseaux.


RE: Mon apprentissage de Erlang - niahoo - 26-10-2012

Pour ton ship_sup je te conseille un simple_one_for_one au lieu de one_for_one, comme ça tu peux charger un ship à la demande. Ensuite ça dépends du volume de ton jeu. Mais avoir tous les ships chargés tout le temps si tu en as beaucoup c'est dommage.

Ton application ne démarre pas car tu appelles ets:tab2list(ship) mais que visiblement il n'y a pas de table nommée ship. Effectivement, nulle part dans ton code tu ne crées cette table.