vendredi 28 septembre 2018

[Jour 16] C'est à cette heure ci que tu rentres?

Oui, je suis de retour, douze ans plus tard. Ok j'ai dit que j'allais faire 50 jours d'affilée, mais j'ai jamais dit que y'aurais pas de pauses




Bref, cet article sera assez court parce que ben, j'ai passé douze ans a faire des mises a jour en fait, mais j'ai repris. J'ai changé la maniere dont les arbres sont gérés. Avant, un arbre, c'était un bloc de terre avec un arbre dessus. Maintenant un arbre, ben c'est un arbre.

J'ai du refactoriser beaucoup de code, mais du coup, maintenant, on a des arbres qui sont posés sur les blocs de terre, et donc que l'on pourra retirer par la suite. Je me suis dit que ça pourrait être utile un jour.


Voilà article terminé, le prochain objectif, c'est de faire en sorte de faire rentrer de l'argent :) A bientard

lundi 16 juillet 2018

[Unity3D][Défi50Jours] Jour 15 - ARJEN



Bonjour, aujourd'hui on va parler d'un truc important: l'ARJEN



Alors, oui j'ai pas donné de nouvelles pendant plus d'une semaine, mais j'étais pas là et après j'étais malade, du coup j'ai pas bossé. Mais je suis revenu, et c'est pas important, l'important comme je vous l'ai dit, c'est l'ARJEN, avec un grand J.


Car oui, ça y est, après une grande session d'environ 4h, j'ai ajouté le système de POGNON, de FLOOZ, le système capitaliste comme tu l'aimes. Tu veux poser une maison? OK, mais maintenant va falloir PAYER mon gars et ouais. Une route? Crache tes biftons. T'as plus d'ARJEN? Ben tant pis, tu verras tout rouge, et tu posera plus rien. Faudra attendre la prochaine maj avant de pouvoir regagner du POGNON, déso pas déso.


Du coup, la partie commence avec 1000 d'ARJEN, et une portion de route coute 5 ARJEN tandis qu'une maison en compte 100. Voyez-ci après des exemples d'utilisation de l'ARJEN.

PLINDARJEN.jpg

PUDARJEN.jpg
Et bien sûr tout est sauvegardé, comme ça si tu es pauvre, tu seras toujours pauvre en revenant. MALINX LE LINX

Pour expliquer vite fait comment ça marche, j'ai créé une classe ressource, qui a comme paramètre un nom et une quantité. J'y ai ajouté une fonction d'ajout qui ajoute simplement un nombre à cette quantité.
Dans la classe Game, j'instancie un objet Resource, avec les paramètres de départ "ARJEN" et 1000. Vous pouvez aussi voir qu'il y a un objet instancié avec les paramètres "people" et 0, mais pour l'instant on s'en sert pas.
Ensuite, sur la classe bâtiment, j'ai ajouté une variable "cout" avec une valeur par défaut a 5. J'ai ensuite créé une fonction "Create" que l'on va appeler lorsqu'on pose l'objet sur le sol, qui s'occupe simplement d'enlever la valeur cout au total de l'ARJEN. Ensuite, pour les Maisons, qui sont une extension de la classe Bâtiment, j'ai simplement changé le cout à 100.

Ensuite, la partie un peu plus dure, c'est de rester au dessus de zéro. Dans la partie qui sert à poser les objets, il faut faire plusieurs choses:
- détecter le type de l'objet en sélectionné
- le peindre en rouge si son coût est supérieur à l'ARJEN restant
- ne pas poser si l'objet est en rouge, poser et appeler la fonction Create de l'objet sinon



Bon, pour les maisons c'était simple, par contre pour les routes, hummm. Le principe est le même, sauf que, comme il y a un cliqué glissé, il faut effectuer ces opérations a chaque mouvement de la souris, et sur le nombre total de routes affichées. Et enfin, lorsque l'utilisateur relâche le bouton, si on était en rouge, il faut supprimer les routes. Je vous épargne le code en lui même, mais autant vous dire que tout ça a demandé beaucoup de temps et d'essais, mais maintenant tout marche.

Dernière chose importante, montrer l'ARJEN à l'écran. Bon là c'est tout moche, parce que y'a toujours pas d'UI, mais l'ARJEN c'est l'ARJEN, UI ou pas.

Du coup voilà qui conclut notre article du jour. On a de plus en plus quelque chose qui ressemble à un jeu ! La prochain étape du coup, c'est de pouvoir faire rentrer de l'ARJEN, avec notamment l'ajout de micro-transactions centres des impôts par exemple.



Sur ce des bisous, et à la prochaine! 

jeudi 5 juillet 2018

[Unity3D][Défi50Jours] Jour 14 - Le jeu des devinettes

Salut lecteur.

Aujourd'hui j'ai la flemme de faire un grand article, alors on va jouer à un jeu ok? Ok, de toute façon soit tu joues le jeu soit tu t'en vas j'ai dit que j'allais pas écrire hein.
Donc voilà le jeu: je mets un gif, et tu devines ce qui a été ajouté durant la dernière session. Prêt?

Superjeu.gif

Ca devrait être assez facile. Et niveau code rien qui n'a pas déjà été vu, c'est aussi pour ça que je vous épargne le blabla. Alors, vous avez deviné?

Dites le moi dans les commentaires


Des bisous, la prochaine session on fait vraiment l'UI c'est promis.


PS: il n'y aura pas de sessions de vendredi à lundi inclus, je serais en déplacement et je n'aurais pas de pc

mercredi 4 juillet 2018

[Unity3D][Défi50Jours] Jour 12 et 13 - Améliorations et maisons

Coucou.



Alors oui déso j'ai pas touché au truc ce weekend, et je n'ai pas non plus posté d'updates depuis quelques jours. J'avais la flemme, je fais des journées longues tu sais? C'est compliqué la vie, surtout qu'après le boulot je dois rentrer, me faire à manger, et jouer aux jeux vidéos, du coup c'est dur de trouver du temps !

Mais soit rassuré, toi, lecteur avisé, je suis de retour ! J'ai bel et bien bossé lundi et hier, et oui, j'ai avancé! J'ai même sûrement rattrapé mon retard vu que j'ai fait deux sessions de 3h environs. Et quoi de nouveau vas-tu me demander? Hé bien nous l'allons voir tout de suite.


vendredi 29 juin 2018

[Unity3D][Défi50Jours] Jour 11 - Sauvegarde/chargement des routes

Yo.
Hier, c'était encore une session assez courte malheureusement, il y a eu une soirée imprévue avec le boulot et qui a duré des plombes, du coup je n'ai pas eu le temps que je voulais pour coder.
Mais j'ai quand même une bonne nouvelle, la pose des routes est maintenant finalisée :)

Hier, pendant le peu de temps que j'ai eu pour coder, j'ai tout de même pu mettre en place le système de sauvegarde et chargement des routes.

Pour faire simple, jusque là nous avions l'objet TileObject, qui représentait un point de notre map, avec sa position et son type (Grass, Dirt...). Ici, j'ai créé un nouvel objet nommé BuildingObject, qui pourra être utilisé pour tous les types d'objets posable sur la map. Il contient le type de building ainsi que son orientation. Et il suffit ensuite de dire que chaque TileObject peut maintenant contenir un BuildingObject.

Lors de la construction de chaque morceau de route, on va créer le BuildingObject correspondant et on l'ajoute au TileObject qui se situe sous cette route. Pour supprimer une route, il faudra d'abord supprimer à l'écran le GameObject route, puis supprimer le BuildingObject contenu dans le TileObject correspondant. Et une fois fais, tout se sauvegarde.
(A noter que la manière de sauvegarder les objets est pour l'instant adéquat car un morceau de route fait la taille d'une case, mais si on se met en tête de faire des bâtiments qui peuvent faire plusieurs cases de long ou de large, il faudra peut être changer ce système pour autre chose.)

Pour ne pas conserver les routes à l'écran lorsqu'on change de map, il suffit de supprimer tous les BuildingObject contenus sur la map.

Ensuite, pour le chargement, lorsqu'on instancie chaque case de notre Map, on vérifie si un BuildingObject existe, et ci c'est le cas on instancie le préfab correspondant et on lui applique une rotation en fonction de la direction qui lui est assignée.


Sauvegarde/chargement exemple


Et c'est tout! C'est assez simple au final, ça marche comme il faut, et du coup maintenant on a tout ce qu'il nous fallait pour les routes. Du coup la prochaine étape, ça va être la gestion des ressources, et la pose d'autres type de buildings, avec l'interface et tout et tout. A très vite pour l'update du jour 12!

jeudi 28 juin 2018

[Unity3D][Défi50Jours] Jour 10 - Pose de routes à la souris

Bon, je vais être honnête, aujourd'hui j'étais trop défoncé pour faire une heure complète. Cependant, j'ai quand même pu avancer sur les routes et ajouter la fonctionnalité pour créer des sections de routes à la main.
Du coup l'article d'aujourd'hui va être très court, mais c'est pas plus mal pour une fois :)


Pour expliquer comment marche ce système, lorsqu'un clic est détecté, on créée un  Nœud de départ à la position de la souris. On créée par la même occasion un noeud de fin. Puis tant que le bouton est enfoncé, si la position de la souris change, on change aussi la position du noeud final, et on créée la route en appelant A* et la fonction de traçage de route.

Lorsqu'on change la souris de place d'une case, le chemin calculé ne passe plus forcément par le même endroit que celui calculé pour la case précédente. Et du coup si on se contente d'afficher la route à chaque fois sans rien faire d'autre, on se retrouve vite avec tous les "essais" de chemins sur la carte, et c'est très moche.

C'est bien mais pas top

Il faut donc supprimer à chaque fois ces chemins. La solution la plus simple est de garder dans une liste tous les blocs instanciés, et à chaque fois que la souris bouge, on supprime tous les blocs et on vide la liste, avant d'afficher la nouvelle route et d'y ajouter les nouveaux blocs.


Là on est pas mal

Enfin, comme vous pouvez le constater, le dernier problème à résoudre est qu'avec ce système de liste, on efface la route actuelle si on essaie d'en poser une nouvelle. Pour résoudre ce problème, il suffit de créer une nouvelle liste à chaque fois qu'un clic est détecté, et d'effectuer les mêmes étapes que précédemment sur cette nouvelle liste.



Et voilà le travail :) Ce n'est pas encore tout à fait parfait, mais ça marche déjà très bien et fait ce qu'on veut. Et c'est très visuel donc j'ai pu faire péter les gifs. Du coup je suis plutôt très satisfait!


Le résultat final qui pète des culs


Voilà, comme convenu, un billet très court, mais avec un résultat bien visible. J'espère que ces progrès vous hypent autant que moi. N'hésitez pas à laisser vos remarques, impressions, conseils, questions, et à partager ça fait toujours plaisir, des bisous poilus

mercredi 27 juin 2018

[Unity3D][Défi50Jours] Jour 9 - amélioration des routes

Salut les petits protozoaires euclidiens c'est l'heure de l'update numéro 2 après 7 !


Hier, on avait fait des routes, en utilisant A*. A la fin ça marchait, sauf qu'on n'avait que des diagonales, et ce n'est pas très optimal pour un jeu de gestion de ville. Dans ma dernière session, je me suis donc attaqué à les rendre moins diagonales et plus réaliste.

Pour ça, il a fallu faire quelques modifications sur notre classe Noeud. Souvenez vous, jusqu'ici il comportait sa position, son coût et une référence vers le noeud qui le précède. Ce que nous allons faire ici, c'est altérer la fonction de calcul de coût, notre Heuristique, pour que ce coût soit plus élevé lors d'un changement de direction. Pour ce faire il a simplement fallu ajouter un champ direction à notre objet Noeud. Puis, dans le calcul du coût, si la direction du noeud actuel est différente de celle de son noeud parent, alors on augmente la valeur du coût. Ici j'ai arbitrairement ajouté une valeur de 10.
Ce qui a pour effet que le noeud choisi sera toujours dans la même direction que le noeud précédent, sauf en cas de rencontre d'obstacle, ou si le chemin devient vraiment plus rapide en tournant.


L'étape d'après a été de faire en sorte de ne pas prendre en compte les obstacles. Pour ça, rien de plus simple, lorsque l'on récupère les voisins d'un noeud, si l'un des voisins est un obstacle, on l'ignore.
Maintenant, on a des belles routes qui serpentent à travers la forêt.

Ensuite, j'ai créé une sublime texture de route via Gimp, et l'ai appliquée au préfab de route. Le résultat est plutôt pas mal, même si j'ignore pourquoi la bande blanche se répète sur les six faces du
pavé.

La super texture de route
La super route

Une fois fais, j'ai fais en sorte qu'à la création de la map, deux points soient sélectionnés aléatoirement, en faisant attention à ce que ce ne soient pas des obstacles, puis j'ai tracé une route entre ces deux points. Et voilà un exemple de résultat:

Random route

Sympa non? Pour les plus observateurs, il reste encore un léger souci: les routes sont toutes orientées dans le même sens, et du coup discontinues... Mince, comment faire? Oh zut je me demande...
Hé bien vous vous souvenez de cette variable direction ajoutée au noeud? Il suffit d'orienter la route en fonction de cette direction et le tour est joué :) Par défaut, la route est posée de telle sorte que sa longueur soit à l'horizontale. Pour les directions gauche et droite, il n'y a rien à faire en plaçant la route, et pour les directions haute et basse, une simple rotation de 90 degrés suffit. Ensuite on lance, et TADAAAA.

Random route mais mieux

Voilà, une vraie route (bon mis à part les angles mais on verra ça plus tard). Ca fait bien plaisir, et en seulement 9 jours de dev, on a un résultat visible, assez propre, et plutôt bien satisfaisant. La prochaine étape sera de mettre en place la sauvegarde de ces routes, puis de faire en sorte de pouvoir placer les routes avec un clic long de la souris. Et on aura fini avec les routes ! :)

Je suis assez excité pour ce qu'il y a à venir, et j'espère que vous aussi. Comme d'habitude, n'hésitez pas à me faire part de vos remarques ou questions si vous en avez, et si vous aussi voulez vous lancer un défi de ce genre, foncez, car ça fait vraiment du bien de voir un projet se construire ainsi.



Sur ce des bisous carabistouillés.