04-09-2012, 07:08 PM
Bon y a un truc qui n'est pas clair pour moi avec backbone.
Je dis backbone parce que c'est ce que je compte utiliser mais toute la partie théorique de ce post se suit avec une autre lib équivalente.
J'ai mon personnage dans un model.
Mettons que je veuille me soigner. La méthode la plus simple est qu'après l'action de soin, mettons un soin +10 PV, j'augmente mes points de vie de 10, et je .save() mon model.
Le save est envoyé au serveur, celui-ci vérifie que tout est ok, et me renvoie le modèle à l'identique, confirmant ainsi que mon heal s'est bien déroulé.
Du coup, ma vue se met à jour (ça a pu être fait en prédiction).
Bon, ça c'est facile, sauf qu'en console je peux me mettre des centaines de PV, ce n'est donc pas viable.
Mais ça correspond à tous les tutos rapides genre todolist.
Dans une todolist, tu veux changer le nom d'un item, il n'y a pas vraiment de contrôle, tu mets ce que tu veux en nom. Tu l'envoies au serveur, le contrôleur est tout happy et voilà.
Appelons ça "Model update" pour se la péter un peu.
Sauf que pour un heal, je ne peux pas utiliser Model Update.
- d'abord parce que on pourrait tricher
- ensuite parce que la quantité de heal va dépendre d'un jet de dés sur le serveur.
Je dois simplement envoyer un commande : 'heal'. Je peux mettre un attribut commande dans mon modèle qui sera interprété par le serveur.
Ainsi le serveur lit la commande et me renvoie le modèle en JSON avec les nouveaux PV.
ok.
Mais maintenant je suis face à un boss, je prends cher, je vais donc spammer ma commande de heal.
mon model :je m'envoie 2 heals en spammant, le premier me rend 10PV, le second 5PV.
Lors du premier clic, le serveur me renvoie, et lors du second heal, je reçois puisque mes deux heals ont été lancés alors que je n'avais que 80 PV.
Donc c'est foutu pour le spam, je peux au mieux mettre un cooldown, mais ça ne solutionne pas correctement ces race conditions.
Y a donc un truc à faire côté serveur pour résoudre ce problème. ça doit pas être si chaud mais c'est contraignant et ça fera pas du code limpide.
Bon, mais maintenant c'est Bobby qui me lance un lapin de feu. ça me descend ma vie de 15 PV. Là, j'ai rien envoyé au serveur, je n'attend pas de réponse. Je vais donc passer par du push. Du coup, je me dis, quitte à passer par du push pour tout ce qui est "commande" et pas "Model Update"*, on va mettre les heal avec.
Donc les deux questions :
- Est-ce que je raconte pas des conneries, ai-je loupé un truc ?
- Comment proprement mettre à jour mes modèles backbone depuis un push ? Comment faites vous ?
Question subsidiaire :
- Y a-t'il un truc plus adapté que Backbone pour ça ?
*Je garde Model Update pour changer un nom de perso, changer l'équipement du joueur, en somme tout ce qui se traduit vraiment par un état à valider plutôt qu'à une quantité ou autre : je valide facilement si on m'envoie un modèle de joueur avec comme nom "qzd_çèç))à'" mais je ne sais rien valider si on m'envoie "action:Soins rapides IV".
PS: si vous trouvez un nom plus approprié au topic, dites.
Je dis backbone parce que c'est ce que je compte utiliser mais toute la partie théorique de ce post se suit avec une autre lib équivalente.
J'ai mon personnage dans un model.
Mettons que je veuille me soigner. La méthode la plus simple est qu'après l'action de soin, mettons un soin +10 PV, j'augmente mes points de vie de 10, et je .save() mon model.
Le save est envoyé au serveur, celui-ci vérifie que tout est ok, et me renvoie le modèle à l'identique, confirmant ainsi que mon heal s'est bien déroulé.
Du coup, ma vue se met à jour (ça a pu être fait en prédiction).
Bon, ça c'est facile, sauf qu'en console je peux me mettre des centaines de PV, ce n'est donc pas viable.
Mais ça correspond à tous les tutos rapides genre todolist.
Dans une todolist, tu veux changer le nom d'un item, il n'y a pas vraiment de contrôle, tu mets ce que tu veux en nom. Tu l'envoies au serveur, le contrôleur est tout happy et voilà.
Appelons ça "Model update" pour se la péter un peu.
Sauf que pour un heal, je ne peux pas utiliser Model Update.
- d'abord parce que on pourrait tricher
- ensuite parce que la quantité de heal va dépendre d'un jet de dés sur le serveur.
Je dois simplement envoyer un commande : 'heal'. Je peux mettre un attribut commande dans mon modèle qui sera interprété par le serveur.
Ainsi le serveur lit la commande et me renvoie le modèle en JSON avec les nouveaux PV.
ok.
Mais maintenant je suis face à un boss, je prends cher, je vais donc spammer ma commande de heal.
mon model :
Code :
{id:1,pv:80}
Lors du premier clic, le serveur me renvoie
Code :
{id:1,pv:90}
Code :
{id:1,pv:85}
Donc c'est foutu pour le spam, je peux au mieux mettre un cooldown, mais ça ne solutionne pas correctement ces race conditions.
Y a donc un truc à faire côté serveur pour résoudre ce problème. ça doit pas être si chaud mais c'est contraignant et ça fera pas du code limpide.
Bon, mais maintenant c'est Bobby qui me lance un lapin de feu. ça me descend ma vie de 15 PV. Là, j'ai rien envoyé au serveur, je n'attend pas de réponse. Je vais donc passer par du push. Du coup, je me dis, quitte à passer par du push pour tout ce qui est "commande" et pas "Model Update"*, on va mettre les heal avec.
Donc les deux questions :
- Est-ce que je raconte pas des conneries, ai-je loupé un truc ?
- Comment proprement mettre à jour mes modèles backbone depuis un push ? Comment faites vous ?
Question subsidiaire :
- Y a-t'il un truc plus adapté que Backbone pour ça ?
*Je garde Model Update pour changer un nom de perso, changer l'équipement du joueur, en somme tout ce qui se traduit vraiment par un état à valider plutôt qu'à une quantité ou autre : je valide facilement si on m'envoie un modèle de joueur avec comme nom "qzd_çèç))à'" mais je ne sais rien valider si on m'envoie "action:Soins rapides IV".
PS: si vous trouvez un nom plus approprié au topic, dites.