21-10-2012, 11:32 PM
(Modification du message : 22-10-2012, 10:35 AM par Sephi-Chan.)
Bien vu Niahoo ! Merci pour le correctif.
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
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
L'état utilisé par le processus est simplement le record.
Le reste de la magie a lieu dans le module
Ici, on peut voir que la fonction
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.
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),
supervisortart_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(),
[ shiphip_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.