Comment nous avons créé un jeu de société avec télécommande - Partie 2

La dernière fois, je vous ai parlé de la composante technique de notre jeu de société «intelligent», des problèmes que nous avons rencontrés et de ce qui s'est finalement produit.

image

Aujourd'hui, je veux vous en dire plus sur l'application mobile, le premier jeu et comment créer des miniatures pour celui-ci.

Le premier article peut être trouvé ici: Comment nous avons fait un jeu de société avec télécommande - Partie 1

Attention! Beaucoup de photos dessus.

Dans les commentaires du dernier article, ils notent à juste titre qu'il vaut mieux ne pas faire un jeu, mais une plateforme sur la base de laquelle il est déjà possible de créer des jeux en utilisant les mécanismes disponibles. Au départ, nous l'avions prévu, mais en conséquence, nous avons réalisé que nous ne pouvions pas faire quelque chose en dehors du jeu. Juste en raison du manque d'expérience en conception de jeux ou de concepteurs de jeux familiers qui pourraient nous dire quelles mécaniques devraient être prises en charge.

Par conséquent, nous avons décidé d'implémenter toutes les fonctions de base de la plate-forme (déplacement, surlignage dynamique, invites) dans notre premier jeu, que nous proposerons nous-mêmes. Et puis, en utilisant l'expérience acquise, nous ferons un constructeur de jeux à part entière.

Application mobile


Comme je l'ai écrit plus tôt, toute la gestion de la plateforme s'effectue via une application mobile qui s'y connecte via le protocole BLE.

Plusieurs GIF
GIF "" /

GIF

GIF

GIF "" /

En fait, pour implémenter n'importe quel jeu, vous devez écrire une application mobile à part entière pour lui, dans laquelle vous décrivez toutes les règles et mécanismes.

Lors de la rédaction de l'application, nous avons effectué tous les tests en nous connectant à la plate-forme, ce qui n'est pas très pratique. Par conséquent, afin de simplifier le débogage, nous avons créé un émulateur logiciel simple dans le cadre de l'application, sur lequel les données sont affichées comme elles le seraient sur le terrain de jeu.


Au tout début, nous avons rencontré un problème de perte des données qui quittent l'application. Nous avons constaté que lors de l'utilisation de BLE, la taille maximale de paquet pouvant être envoyée est de 20 octets. Par conséquent, nous divisons toutes les données sortantes sur BLE en paquets de 20 octets, le paramètre «Gate» est écrit dans l'en-tête. Ce paramètre aide Arduino à comprendre à quel composant de la plateforme appartient ce package. Côté Arduino, le traitement de ces packages est élémentaire:

if (NewCommandReady) { switch (CurrentGate) { case 1: processLEDCommand(); break; case 2: processDriverCommand(); break; case 3: processMagnetCommand(); case 4: // break; } //  NewCommandReady = false; } 

Après avoir cassé le streaming de données entre le smartphone et le module BLE en paquets de 20 octets, les données ont cessé de disparaître, mais sont souvent arrivées à l'Arduino sous une forme déformée. Il s'est avéré que nous n'avons pas pris en compte que le port série Arduino a un tampon de 64 octets. Lorsque le tampon déborde, les données sont perdues et les suivantes sont déformées. Augmenter la taille et créer votre propre tampon n'a pas toujours aidé. J'ai dû écrire un protocole wrapper au-dessus du transport BLE pour envoyer et recevoir des données de manière fiable.

En raison de l'utilisation d'un tel «protocole», l'échange de données a été légèrement ralenti en vérifiant l'intégrité des données transmises, mais la fiabilité est plus critique pour le jeu - il sera dommage que l'affichage AOE d'une certaine capacité soit incomplet ou que le héros ne soit pas déplacé lors de la confirmation du déplacement sur un téléphone mobile.

Pour afficher des objets sur le terrain de jeu, nous avons utilisé le principe des couches dans les sous-systèmes de la fenêtre OS:

  • Chaque objet ou action qui est mis en évidence (héros, obstacles, la façon dont le héros se déplace, l'étendue disponible de la capacité et le reste) utilise sa propre couche.
  • Lorsque des couches sont appliquées (par exemple, la région AOE sur l'étendue disponible de la capacité), l'état initial des LED est mémorisé. Par conséquent, il est possible de retourner la couleur d'origine lorsque le calque supérieur disparaît.

La majeure partie des données transférées entre l'application mobile et la plateforme est la repeinture des LED. À des fins d'optimisation, deux algorithmes ont été ajoutés:

  • Pour repeindre les diodes, un tampon est utilisé dans lequel des modifications sont apportées jusqu'au moment où ces modifications doivent être affichées sur la carte physique.
  • La peinture d'une seule LED dans la même commande est exclue.
  • Lors de la repeinture (par exemple, le décalage de la zone de capacité AOE d'une cellule), l'état actuel de la carte LED est analysé. Si la couleur de la LED dans le nouvel état ne diffère pas de la précédente, aucune commande ne sera reçue par l'Arduino pour la repeindre.

Gameplay


Vous avez donc décidé de jouer. Ci-dessous, je vais décrire à quoi cela ressemble de côté:

  1. Nous insérons la fiche dans la prise et allumons le jeu.
  2. À chaque démarrage, un étalonnage automatique a lieu pour déterminer le nombre exact de pas du moteur pas à pas pour déplacer 1 cellule.
  3. En parallèle, nous connectons le smartphone au jeu via Bluetooth.
  4. Dans l'application mobile, chaque joueur sélectionne le personnage qu'il souhaite jouer. Une fois que chacun a fait son choix, appuyez sur «START».

  5. Chacun des personnages a sa propre couleur. Le jeu mettra automatiquement en surbrillance la cellule où vous devez placer la figure de votre héros.
  6. Le jeu se déroule séquentiellement. Le premier coup est fait par le joueur qui a d'abord choisi le héros, le second - le second, etc.
  7. Chaque héros a un certain nombre de points d'action (OD) qui peuvent être dépensés pour se déplacer dans l'arène ou pour appliquer des capacités.
  8. Chaque capacité a son propre temps de récupération, qui est calculé en tours. Dans le cadre de l'application mobile, il existe 2 concepts: Déplacer - l'intervalle entre le début et la fin des actions en cours du joueur. Round - la somme des mouvements de tous les joueurs participant au jeu. Actuellement, le tour d'un joueur est limité à 30 secondes.
  9. Des obstacles sont placés sur le terrain à travers lesquels le joueur ne pourra pas passer ou utiliser la plupart des capacités. Maintenant, ils sont simplement surlignés en rouge sur le terrain de jeu, mais à l'avenir, ils auront une incarnation physique.

  10. Vous pouvez déplacer le champ à l'aide des capacités spéciales de chaque héros. Par exemple, la téléportation d'un magicien. Contrairement au mouvement standard, lorsqu'un joueur ouvre la route de son héros cellule par cellule, lors de l'utilisation de ces capacités, le joueur indique uniquement le point final. Par conséquent, un algorithme est nécessaire pour trouver le chemin le plus court vers un point spécifié, en contournant tous les objets avec lesquels une collision est possible (figures d'autres héros, figures d'obstacles, etc.).


    Ce problème est résolu tout simplement à l'aide de graphiques et de passage BFS à travers les cellules.
    En bref, l'essence de l'algorithme est de marquer les cellules par distance, de la position actuelle du héros à la cellule spécifiée (indiquée en orange), dans laquelle le héros doit être déplacé.

    Après avoir trouvé la cellule souhaitée, le chemin de retour est recherché dans les cellules de telle sorte que la distance entre le point de départ et la cellule suivante soit inférieure de 1 à la cellule actuelle (le passage est marqué en jaune). Après être revenu à la position de départ (cellule verte), une séquence de points est formée, qui est le chemin le plus court. C'est cette séquence qui est transmise à Arduino en équipes pour déplacer le héros.
  11. Après la mort du héros, le jeu déplace automatiquement sa figurine dans la "zone d'origine". Zone d'origine - une cellule dans laquelle la figurine est placée au début de la partie. Chaque joueur a le sien. Après avoir commencé le jeu, vous ne pouvez pas entrer ou utiliser la capacité dans la zone d'origine. Ceci est fait de sorte qu'il est impossible d'attraper le joueur lors de la relance. Pour un joueur dont le héros est vaincu, la partie se termine en 1 tour. Après avoir rejoint la bataille.

  12. En ce moment, le joueur dont le héros a été le dernier à rester sur le terrain en battant les adversaires gagne. Mais la condition peut être différente, par exemple, celui qui a marqué N frags gagne en premier.

Il s'agit d'un gameplay qui fonctionne dans la version actuelle. En raison d'un manque d'expérience dans la conception de jeux, nous ne voyons peut-être pas d'écoles ou d'opportunités évidentes. Par exemple, il est toujours pénible d'attendre votre prochain déménagement. Dans l'implémentation actuelle, le temps d'attente peut atteindre 1,5 minute. Dans la prochaine version du prototype, nous prévoyons d'ajouter des lecteurs d'étiquettes RFID, ce qui diversifiera le gameplay. Par exemple, utilisez des cartes avec des étiquettes RFID que vous pouvez appliquer en dehors de votre tour.

Vignettes


Les miniatures aiment tout! Et nous ne faisons pas exception. Par conséquent, en parallèle avec la collection de mécanique et de programmation, nous nous sommes engagés à inventer nos propres miniatures. Je pense que sur les photos, il est clair que notre jeu concerne les chats fantastiques qui se battent dans l'arène.
Parce que nous ne savons pas du tout comment puiser dans le mot, nous nous sommes tournés vers notre ami, qui a commencé avec grand plaisir à dessiner des "chats de combat".

Elle a pris nos animaux de compagnie comme base. Ainsi, chez elle vivait un chat énorme et vicieux surnommé "Pirate" - c'est lui qui se trouve au cœur du guerrier miniature.

Après quelques semaines, nous avons obtenu nos premiers croquis.


À partir des articles sur la production de jeux de société, j'ai réalisé qu'en Russie, la création de miniatures est déjà assez mauvaise et beaucoup les commandent en Finlande ou en Allemagne.

Avant de nous lancer dans la production de miniatures, nous devions créer des modèles maîtres de chaque héros, ce qui est assez pour un prototype. Au début, nous voulions les fabriquer en pâte polymère, mais il s'est avéré que parmi nos amis il n'y avait pas de miniaturistes, et le sur mesure était trop cher à l'époque. Par conséquent, nous avons décidé de les imprimer d'abord sur une imprimante 3D. Pour ce faire, notre ami nous a fait des modèles 3D de nos premiers héros dans Zbrush.


Avec l'aide de l'impression FDM, il n'a pas été possible d'imprimer des chiffres de qualité acceptable, ce qui était tout à fait attendu.

Heureusement, ma femme a des imprimantes SLA 3D au travail.

La stéréolithographie (SLA) est une technologie d'impression 3D qui vous permet de convertir des matériaux liquides en objets solides à l'aide d'une source lumineuse, couche par couche, en utilisant le processus de photopolymérisation. L'épaisseur de la couche lors de l'impression en utilisant la technologie SLA est plusieurs fois plus petite que lors de l'impression en utilisant FDM, par conséquent, la qualité du produit fini est plus élevée.

Quelques jours plus tard, nous avons reçu nos premières miniatures.


La qualité de ces miniatures est beaucoup plus élevée, mais n'atteint toujours pas la production obtenue par moulage plastique. La faute en est au support qui, après retrait, laisse des traces visibles. En théorie, nous pourrions «découper» les figures en parties séparées et les imprimer individuellement, sans utiliser de supports, puis les coller. Mais cela prendrait beaucoup de temps, et d'ailleurs, cela pourrait encore changer à l'avenir.

Chaque figurine repose sur sa propre base, que nous avons également imprimée sur une imprimante 3D. À l'intérieur de la base se trouve un aimant en néodyme. La taille et l'épaisseur de l'aimant ont été choisies empiriquement afin que la figure se magnétise calmement à l'électroaimant sur le chariot de la plate-forme, mais ne réagisse pas aux figures voisines.

Total


À l'heure actuelle, nous nous engageons à améliorer les caractéristiques physiques de la plate-forme et la fiabilité de tous les composants. Nous remplacerons le contreplaqué par du polycarbonate et du plastique ABS, nous améliorerons la fixation des composants de la plate-forme les uns aux autres et rendrons le terrain de jeu amovible afin qu'il puisse être changé en un autre champ de facteur de forme (par exemple, hexagonal). La prochaine étape consiste à créer un MVP à part entière, ce qui n'est pas dommage de montrer aux gens.

Avec le jeu un peu plus dur. Bien sûr, je veux me concentrer complètement sur la mise en œuvre de la plateforme, sans référence à un jeu spécifique. Cependant, nous sommes bien conscients que personne ne s'intéresse à une plateforme sans jeu.

Merci à tous pour vos critiques / conseils / intérêt. Nous avions une idée de créer une version sans utiliser de mécanique, mais avec la possibilité de déterminer la position et le type de la figure sur le terrain. Je pense que le prochain article sera écrit après la création de MVP .

Source: https://habr.com/ru/post/fr427227/


All Articles