Myrne 6312

Un shooter en vue du haut et en coop, développé en 72h dans le cadre du 26e Ludum Dare

Song of the Myrne: What Lies Beneath

Un action-RPG en pixel-art

vendredi 29 novembre 2013

Trucs complètement random (et SotM aussi !)

Hello tout le monde !

Un billet complètement bordélique aujourd'hui vu que j'ai un peu tout et rien a vous dire mais que faire un billet différent pour chaque truc me semble un peu excessif (j'ai épuisé mon quota de billets débiles avec mes réflexions philosophiques :D).

On va commencer par The Divide. Un jour (un jour !), je vous en ferai une vraie critique. Mais en attendant voilà juste une musique que je ne peux pas m'empêcher d'écouter en boucle :


Puisque je vous parle de musique de films, une autre que j'ai découverte hier (merci Crossed^^) et qui déchire du pangolin en slip :




Niveau jeu-vidéo, j'ai là-aussi quelques trucs a vous dire. Si vous n'avez pas encore acheté le très excellent S.P.A.Z dont je vous parlais ici, et/ou que vous ne vous êtes toujours pas procuré le non moins sympathique Jamestown dont je vous chantais les louanges ici. Hé bien c'est votre jour de chance puisque vous pouvez tous les deux les choper (avec d'autres très bons titres) dans la Humble Weekly Sale de cette semaine.

Pour une fois que j'ai l'occasion de vous présenter une offre intéressante avant qu'elle ne soit terminé, je ne m'en prive pas^^.



Et pour terminer, vous ne pensiez tout de même pas que j'allais vous laisser partir sans vous gonfler avec Song of the Myrne et sans faire de grand mystères sur mon projet secret^^ (qui n'est plus vraiment secret en fait).

Donc pour commencer, la surprise dont je vous ai vaguement parlé il y a quelques temps approche a grands pas (si tout se passe bien, c'est un peu la poisse à ce niveau là^^'). Bon en fait c'est un truc qui est surtout cool pour moi (et pour SotM) mais bon... ...j'ai dit que c'était cool donc ça l'est !

Et puis enfin, un nouveau (et sans doute dernier) screen de mon projet secret: Song of the Myrne: What Lies Beneath. (houuu, carrément un nom, ça se précise^^)

Cliquez pour voir l'image en taille réelle blah blah blah...
WIP, je n'ai pas encore ajouté les détails, mobs, etc...
Remarquez aussi le fameux truc dont je vous parlais l'autre fois qui  me permet d'ajouter facilement des petits détails (fissure dans le mur, fenêtres mieux intégrées,...)

J'en suis à peu près à 50% de ce mini-projet.

Voilà voilà, @+ comme on disait quand j'étais encore un jeu  rebelle de la forêt (c'était une forêt de mon pays, donc on peux dire que j'ai fait Forest National, AH AH AH AH AH AH *S'enfuit en courant*).


mercredi 27 novembre 2013

La question philosophique du jour: Le retour !

Hello tout le monde !

Encore une question (sans réponse^^) sur "What the fuck is wrong with the videogame industry ?!" aujourd'hui :

Existe-t-il des gens qui aiment les QTE (Quick Time Event, ou le truc dans les jeux qui vous dit "appuyez sur X pour ne pas mourir") ?

Je n'y avais jamais pensé avant, je me suis toujours dit que les joueurs casuals devaient aimer ça, sans doute par pur masochisme et puis voilà.



Voici les faits :


  • Je fucking hates ces trucs, il m'est arrivé assez souvent de ne pas acheter (voir carrément de ne même pas prendre la peine de pirater) un jeu, juste parce que j'ai vu qu'il en contenait. Je peux les supporter s'il n'y en a pas trop mais en général ça me saoule, même si le reste du jeu me pousse a pardonner cette erreur de design (Hitman Absolution par exemple arrive a rester un bon jeu malgré ça).
  • Internet est rempli de gens qui râlent dessus. C'est souvent rapproché du mot DRM dans les discussions d'ailleurs. Je comprend qu'on puisse penser qu'un DRM est utile (certains le sont d'ailleurs), mais les QTE ?
  • Je ne connais personne dans mon entourage qui m'ait jamais dit apprécier ces trucs. En fait je n'ai jamais lu un seul avis sur un jeu où il était écrit quelque chose du genre "les graphismes sont assez sympas, le scénario bien écrit, et les QTE sont intenses et vraiment rafraîchissantes".

Et voilà, si les QTE sont votre trip, n'hésitez pas a dire pourquoi dans les commentaires, et j'essayerai de me retenir de vous balancer des cailloux dans les yeux. 

Je parle de gens qui aiment les QTE de manière "genuine", si vous les trouvez simplement "pas dérangeants" ou que vous trouvez qu'ils sont bons dans Heavy Rain uniquement, ça ne compte pas. Je cherche vraiment des gens qui se disent "chouette ! Ce jeu a l'air d'avoir de bonnes QTE, ça va définitivement jouer dans la balance de est-ce que je l'achète ou non".

PS: Moi mes préférées c'est quand on me demande d'appuyer 50 fois sur une touche pour ouvrir une porte, c'est définitivement un truc que j'ai envie de faire tous les 10 mètres !


La question philosophique du jour

Un truc vient soudain de me traverser l'esprit.

On connait tous un sacré paquet de jeux développés par une ou deux personnes. Certains de ces projets sont fait par des mecs bourrés de talent (genre Cube World).

Qu'est-ce qu'il se passerait si au lieu de mettre 100 millions de dollars dans un jeu genre Tomb Raider, un mec qui tient un bon gros studio de développement prenait sa pelle et allait déterrer 4 de ces mecs talentueux sur des forums.


On propose à chacun des gars de bosser pour la boite en leur filant directement 1 million, cash comme ça hop, cadeau si tu acceptes de bosser pour nous. Bien entendu les mecs touchent en plus un salaire.

On leur donne la totale liberté sur ce qu'ils vont faire comme projets (un chacun) et chacun de ces mecs reçoit un budget de 1 million pour son projet.

Laissez mijoter pendant 4 ans...

Ma théorie trop incroyable de la mort :

Le studio possède désormais 4 jeux probablement géniaux et a économisé un peu moins de 98 PUTAINS DE MILLIONS DE DOLLARS !!!

...J'ai du zappé un truc, personne ne cracherait sur de l'argent facile... si ?


mardi 26 novembre 2013

Song of the Myrne: Projet WLB - Ça se précise !

Hello les lecteurs !

Je vous ai appris a lire mes roadmaps l'autre jour.

Aujourd'hui, travail pratique^^

La petite nouveauté (la diagonale dans les carrés) représente l'avancement des musiques

J'en suis à une semaine de travail et comme vous le voyez, ce mini projet avance assez bien.

Une fois les trois tiers d'avancement atteints, je vous donnerai tous les détails, c'est promis.

A la prochaine les gens (et désolé encore pour ce teasing qui traîne en longueur, j'ai été pas mal pris la semaine dernière) !


dimanche 24 novembre 2013

Quick Review: RimWorld (pre-alpha)

Hello mes lecteurs préférés ! (sauf toi là, dans le fond)

Aujourd'hui c'est [Jour quelconque de la semaine] et ça fait [5000 ans] que je n'en ai plus posté. C'est donc l'heure d'une Quick Review, yay !

Si vous n'aimez pas perdre 180% de productivité, quittez tout de suite cet article, car aujourd'hui je vais vous parler de RimWorld.



Présentation


RimWorld c'est un mix entre Dwarf Fortress et FTL.
C'est donc un jeu où vous allez devoir créer et gérer une colonie sur une autre planète. Comme dans Dwarf Fortress, vous n'aurez pas le contrôle total de vos colons (c'est carrément sale ><).

Voyons tout de suite pourquoi ce jeu rox du "muffalo" (les poneyz locaux) :

Quick Review

  • Le mix entre contrôle direct et indirect
Comme je l'ai dit, on a un peu plus de contrôle sur sa population que dans DF. En fait dans RimWorld on laisse généralement ces persos se débrouiller (l'IA est très convaincante), et on se contente de leur donner un petit ordre de temps en temps ("tiens toi là qui passe près de ce metal avant de rentrer au camps, prends en avec toi !").

Ce mec... >< 
Il pète un câble avant une bataille et devient ennemi, j'arrive a le faire prisonnier... Il ne trouve rien de mieux a faire que de profiter de l'attaque pour fuir... Je ne donne pas de seconde chance.

Mais on peux aussi les passer en contrôle total (on dit alors qu'ils sont "drafted") pour les combats. Une fois drafted, un colon ne peux plus découvrir l'Amérique, manger, dormir, travailler, etc... C'est vraiment un mode combat.

  • Les combats... sont... GENIAUX !
Les combats justement. Dans RimWorld ils sont vraiment jouissifs. Bon, je n'ai jamais joué aux X-Com ou à d'autres jeux de combats stratégiques, donc mon avis est p'tet biaisé, mais je n'ai jamais vu de combats aussi cools que dans RimWorld. Apparemment le dev du jeu a réutilisé un système qu'il avait conçu à la base pour un jeu de combat tactique.

C'est super jouissif. Déjà il y a un petit choix d'armes assez sympa malgré que le jeu n'est pas encore très loin dans le développement. L'arsenal va du simple pistolet au lance grenade, en passant par l'uzi et la mitraillette.

Ce qui est super avec les combats de RimWorld c'est que le jeu offre un système de couverture très bien foutu, on peux construire des sacs de sable pour se planquer derrière, se positionner au coin d'un mur pour pouvoir tirer sans être une cible trop facile, etc...

Les affrontements sont extrêmement brutaux et sanglants, généralement il y a du feu partout et surtout l'issue d'une bataille peux changer en une seule seconde d’inattention, l'excès de confiance est définitivement a proscrire pour jouer à ce jeu.

Voilà pourquoi je hais les ennemis à lance-grenade...

Alors, pourquoi est-ce qu'un combat gagné d'avance peut subitement tourner au drame en si peu de temps:

    • On possède généralement peu de persos (j'ai jamais dépassé les 8 colons, en 2-3 jours de jeu), la moindre perte humaine fait donc fameusement pencher la balance
    • Si généralement se prendre trop de balles ne tue pas directement les colons mais les incapacite tout simplement (ils mourront si personne ne les traîne vers un lit et ne s'occupe d'eux), la mort peut survenir malgré tout très subitement : explosion d'une tourelle de défense à côté d'un perso, être incapacité dans un incendie, lance-grenade,...
    • Un événement spécial peut se dérouler. Genre une éruption solaire qui désactive tous les appareils électriques (tourelles y-compris)
Bref, pour finir avec les combats, ce qui est jouissif c'est d'élaborer de petites stratégies, genre empêcher l'avancée des ennemis avec deux tireurs, pendant qu'un troisième fait discrètement le tour du bâtiment pour les prendre à revers; faire fuir les bandits à coups de cocktails molotov en cramant toute sa base parce que de toute façon tout semble perdu et qu'on a plus qu'un seul perso; faire progresser notre groupe de tireurs dans les rues pour repousser les ennemis en s'aidant des bâtiments pour se protéger, etc...

  • Les Storytellers
C'est un concept inventé par RimWorld. En gros les événements (orages, attaques de bandits (ou d'écureuils fous^^),...) ne sont pas gérés aléatoirement comme dans les autres jeux du genre. Ici on a le choix entre différents Storytellers. Un Storyteller est une IA qui va gérer les événements. Il y en a des plus sympas que d'autres, des violents, un random pour un feeling Dwarf Fortress, etc... Il y en aura des plus spécifiques plus tard dans le développement du jeu.

Il y en a pour tous les styles de jeu

Alors, quelle est la différence avec un truc aléatoire me direz-vous. Tout simplement qu'un Storyteller va tenter de raconter une histoire (comme son nom l'indique^^). Par exemple l'IA de base (la seule que j'ai testé pour l'instant) va commencer léger pour vous laisser vous développer, pour ensuite augmenter progressivement la difficulté et faire en sorte que la partie prenne des proportions épiques.

  • La prise en main
Et pour finir, un gros point fort du jeu. C'est sa facilité d'apprentissage.

RimWorld est ridiculement simple a prendre en main, contrairement à Dwarf Fortress par exemple dont les puristes ont beau défendre l'interface, il n'en reste pas moins qu'il faut lire des tutos pour réussir a faire des tâches de base, ce qui en fait une interface moisie selon mes critères.

Dans RimWorld quasiment tout se fait à la souris et vous devriez rapidement vous débrouillez. Si vous êtes un peu perdu, un petit guide super bien fait, le codex, est disponible directement dans le jeu (je n'en ai eu besoin qu'une fois, pour comprendre comment fonctionne le système de capture de prisonniers).

Le codex contient aussi pas mal d'infos diverses et utiles

C'est un de ces fameux jeux, "easy to play, hard to master".

L'avenir du jeu


Comme je l'ai dit, RimWorld n'est encore qu'en pre-alpha. Le développeur du jeu prévoit d'ajouter du contenu sous forme de modules en mettant les modules les plus demandés par la communauté en priorité.


Ça promet bien du plaisir.


Conclusion


RimWorld est mon gros coup de cœur du moment. C'est un jeu extremement prenant, super bien réalisé, alors qu'il n'est encore qu'en pre-alpha (je n'ai pas rencontré un seul bug jusqu'ici à part les bandits qui freeze parfois quand ils sont censé quitter la carte).

Si vous aimez Dwarf Fortress et/ou Prison Architect et/ou FTL, n'hésitez pas une seule seconde^^.

Vous pouvez l'acheter ici pour 30 dollars (ça fait toujours un peu mal quand le jeu n'est qu'en pre-alpha, mais il les vaut).

Vous pouvez aussi ne pas voter pour lui sur Greenlight, vu qu'il a déja été Greenlighté ;)

Et vous pouvez ne pas le backer sur Kickstarter puisqu'il a réussi son objectif haut la main en récoltant 268 000 dollars, alors qu'il n'en demandait que 20 000, ça fait une petite différence^^.

Ah oui, une petite remarque, les graphismes vous rappellent sans doute un certain Prison Architect, pas d'inquiètude, ce sont des placeholders (donc les graphismes vont changer, le mec va engager un artiste) et les développeurs de Prison Architect sont tout a fait ok avec cet emprunt provisoire.

Amusez-vous bien !

vendredi 22 novembre 2013

Song of the Myrne: mon petit projet secret en musique

Hello les lecteurs !

Désolé de faire durer le suspens suite à mon petit teasing de l'autre jour.

J'ai été pas mal pris cette semaine et du coup j'ai pas su avancer aujourd'hui ni hier. Et demain s'annonce chaud vu que je dois aller jusque Bruxelles en train (2h) pour passer un exam de 4h puis revenir :/

Mais promis vous en saurez bientôt plus sur ce projet.

En attendant voilà une nouvelle musique pour me faire pardonner :



N'oubliez pas que vous pouvez retrouver toutes mes musiques sur mon Soundcloud.

A la prochaine !

mardi 19 novembre 2013

Song of the Myrne: Le petit teaser du matin

Hello les gens !

Je n'ai pas grand chose a vous dire sur l'avancement de SotM aujourd'hui.

A part bien-sûr que ça avance super lentement :'(

Mais trêve de pessimisme !

Voilà le petit teaser inattendu du matin ;)

Vous en saurez plus un jour, le plus tôt possible j'espère^^

Ne vous creusez pas trop la tête au fait, il n'y a pas de trucs cachés dans cette image, le seul truc à voir est en plein centre :D

A plus pour de nouvelles aventures !

vendredi 15 novembre 2013

Song of the Myrne: l'Optimisation of the Doom


Hello tout le monde !

Une toute petite news sur un aspect tout con du jeu (j'ai modifié deux lignes de codes).

Les projectiles devraient maintenant être indépendants du framerate.

Oh non, il parle encore en japonais !

Bon... En bon français ça donne ça : "si ton PC ramme comme une poubelle, ça n'affectera plus la portée des attaques".

Donc même à 40 FPS (au lieu des 60-70 qui sont idéals), le jeu reste parfaitement jouable bien qu'étant moins fluide.
A 2 FPS les projectiles terminent bien leur course à la même distance du joueur, ils font juste ça en deux sauts plutôt qu'en ligne droite :D

J'en connais un qui sera content^^.

mercredi 13 novembre 2013

Song of the Myrne: Roadmap et quelques infos sur la sortie du jeu

Hello les lecteurs !

Aujourd'hui j'ai un truc assez sympa (pour les plus courageux) a vous montrer.

Mais d'abord on va jeter un oeil sur ce que j'ai fait aujourd'hui, ça va aller super vite puisque j'avais formation et n'ai donc pas pu bosser des masses.

Fait aujourd'hui et hier tard le soir




  • Harmonisation des menus
Hier je vous montrais le nouveau menu principal. Aujourd'hui j'ai principalement retravaillé les autres menus: création du perso, options, chargement de partie, etc,... pour que l'ensemble soit cohérent et non pas l'espèce de patchwork auquel vous étiez habitués jusqu'ici (mention spéciale au menu de chargement de partie qui était complètement fugly).

  • Un peu de contenu quand-même: un dialogue + quête liée écrite sur papier
Parce que oui, faut pas déconner, de jolis menus c'est cool, un jeu fini, c'est carrément mieux.

  • Mise à jour d'Unity
Ils ont sorti une grosse maj dédiée à la 2D, ça promet bien du plaisir.

En chipotant un peu dans les nouveautés, j'en ai profité pour ajouter un effet de "flickering" (intensité de la lumière qui change) aux torches, ça renforce bien l'atmosphère des sous-sols et donne un peu plus de vie au jeu. Je dois l'ajouter sur toutes les sources lumineuses à base de feu, mais faut que j'écrive un script qui fait ça proprement. Actuellement j'utilise le système d'animation d'Unity, qui change les valeurs de la source lumineuse de manière fixe. Ça ne m'arrange pas, parce que les torches n'ont pas la même intensité que les bougies par exemple.



Bref, j'ai rien foutu quoi :D

Mais pour me faire pardonner j'ai fait un truc très à la mode en ce moment (du smurf !!).

La roadmap


On me demande souvent (et je me le demande aussi en fait :D) où en est le développement de SotM. J'ai tenté de donner une réponse.


/!\ DISCLAIMER /!\
Un BAC+40 en langues étrangères option "Esprit de Beldir" est nécessaire pour comprendre le contenu qui va suivre

/!\ DISCLAIMER /!\

Hum... Donc, heu... la voilà... :S


Ôo
....
.... C'est une blague ?

Non, non, c'est tout a fait sérieux. Mais arrêtez donc de paniquer, je vais vous expliquer comment lire ce machin.

En fait les petits carrés et les rectangles colorés forment une espèce de carte qui suit plus ou moins la géographie du jeu.

Alors, on a deux parties quasi identiques.

La partie haute est une représentation simplifiée de la carte du jeu, elle est principalement là pour m'aider a m'y retrouver, et pour montrer la délimitation des zones. Chaque zone colorée représente un level dans Unity (ou presque j'ai fait une ou deux erreurs que je corrigerai en la mettant à jour).

C'est sa copie, en bas qui va nous indiquer le degré de complétion du jeu. Et là c'est réellement simple.

En bleu clair, c'est ce qui est terminé (toujours sujet à changements bien entendu mais en gros 95-100% du travail est fait sur ces maps). Quand une zone est totalement bleue, je ne vous fait pas de dessin. Mais bien souvent une zone ne possède qu'un quart bleu (c'est flagrant sur les deux carrés beiges côte à côte, en bas, qui représentent "Syl" au passage^^), ce sont les maps pour lesquelles le level-design est totalement (ou presque) terminé mais où il manque dialogues et quêtes. Quand la zone bleue ne couvre pas tout mais plus (+) qu'un quart, c'est qu'une partie des dialogues est écrite.

En bleu très foncé, ce sont les zones qui sont à 0%. Les maps n'existent pas sous Unity et en général elles ne possèdent également aucune quête écrite sur le papier. Comme vous le voyez c'est principalement la zone de droite, qui est mise à part. En fait cette zone est vaguement décrite dans mes notes, parce qu'on y fait un petit passage pour la quête principale. Mais concrètement rien n'est encore décidé et je pourrais même l'enlever du jeu si le développement traîne trop en longueur, j'aimerais release SotM en 2014). Mais bon, elle devrait aller vite, c'est une zone très "donjon", il n'y a pas tellement de PNJ vivants là-bas, et "Arx Fatalis" m'a prouvé qu'on pouvait faire de la moitié de son jeu un dungeon-crawler sans prévenir et que ce n'était absolument pas gênant (ce jeu est awesome !).

Enfin, en bas à droite de ma roadmap, on trouve une barre de progression générale du jeu. J'y reviens après, mais ne faites pas confiance à cette barre.



En conclusion, ce graphique, si vous arrivez a le lire^^, est a prendre avec des pincettes, des toutes fines même. De plus, il ne représente qu'une estimation de ce que j'appelle le "contenu" : c'est à dire les quêtes, dialogues, niveaux, etc... Mais pas l'interface, l'IA, l'optimisation, le debug, etc etc...

Donc pour revenir à cette barre de progression, elle ne représente pas l'avancement du jeu, mais celui du contenu du jeu. Le jeu est bien plus avancé que ça puisque les features (se déplacer, lancer des skills, les mobs, le journal de quêtes, l'inventaire, etc etc) sont pour ainsi dire terminées.

J'essayerai de trouver une petite place spéciale sur le blog où mettre cette roadmap, mais de toute façon je vous en reparlerai de temps en temps quand je la mettrai à jour. Puisqu'elle ne représente que le "contenu", il est possible qu'elle n'avance pas du tout durant certaiens périodes. Ce ne sera pas parce que je glande, mais simplement que je travaille sur des "features" (IA, interface, etc). Dans les prochains jours j'aimerais mettre un gros, gros coup de cravache sur l'IA, je n'en peux plus de voir ces pauvres bougres mettre trois plombes a passer une ouverture dans un mur.



Voilà voilà. J'espère que vous ne m'en voudrez pas trop pour cette roadmap plus qu'obscure. Je l'ai volontairement faite assez abstraite pour qu'elle me serve à moi et à vous, sans que ça ne spoile le jeu.

Et je pense que maintenant vous comprenez un petit peu pourquoi "alors ton jeu, il en est où ?", est LA question que redoutent tous les développeurs de jeu-vidéo :D

C'est difficile d'avancer un pourcentage d'un truc qui n'est au final, pas mesurable.

mardi 12 novembre 2013

Song of the Myrne: Nouveau menu


 - Quel saoulant ce Beldir, il arrête pas de nous spammer aujour'h~ 

 - Nom de Myrne ! Le rev'là ! Courrez !!




Hey hey ! Re-re-salut les lecteurs !

Comme promis, j'ai revu le menu principal du jeu. C'est la première chose que le joueur voit en arrivant après tout.



Cliquez dessus pour le voir en plus grand, you know you want it...

J'espère que ça vous plait, parce que dans le cas contraire, je m'en fous :D

Cette fois c'est promis, je ne poste plus rien pour cette nuit.


lundi 11 novembre 2013

Song of the Myrne: l'image du jour

Hello tout le monde !

Je me suis fait une petite to-do list cette nuit de petits changements à faire par-ci par-là sur SotM. Et vu que l'écriture de mon tuto d'aujourd'hui m'a vachement crevé, c'est le bon moment pour faire ces petits trucs pas trop fatigants^^.

J'ai commencé avec un petit truc, ce genre de détails qui prennent 10 minutes a coder mais qui changenet tout :

Cliquez pour voir en plus grand
Attention, c'est subtil^^

J'ai ajouté de petites barres de vie aux mobs qui sont blessés.

Je sais que ça peut en gêner certains, et je suis toujours très précautionneux quand il s'agit des trucs qui touchent à l’immersion dans le jeu.

Je les ait donc faites très transparentes pour que ça ne gêne pas trop la visibilité et on pourra sans doute les désactiver dans les options.

Personnellement ça m'a toujours énervé de ne pas savoir à quel moment va mourir un ennemi. Surtout depuis qu'ils sont plus résistants. Les combattre avec cette petite barre donne l'impression que le combat va plus vite, et ça permet aussi de définir quelle cible attaquer en priorité.

C'est aussi un premier pas vers la suppression des indications textuelles de dégâts. Ces chiffres qui dégringolent de partout me posent problème pour plusieurs raisons:


  • Ils ne vont pas à la même vitesse dans l'éditeur et dans le jeu compilé :/
Le pourquoi du comment est un mystère complet
  • Ça fait bordélique, ça nuit à l'immersion et niveau lisibilité on repassera
Je vais essayer de trouver une alternative à ça, j'ai déjà une ou deux pistes. Je pourrais simplement les supprimer mais le joueur risque alors de ne pas bien se rendre compte que certains monstres sont plus vulnérables à certains types de dégâts.

To be continued... donc^^.

Prochaine étape, rendre le menu principal un peu plus joli !


Tutorial Unity3D: Construire ses propres outils - Partie 3

Hello tout le monde.

Avec seulement 6 mois de retard (continue de sourire, ça va passer), voici la partie 3 de cette suite de tutos.

Dans cette partie, on va apprendre a modifier Unity en intégrant nos propres outils directement dans son interface (ce n'est pas sale !). L'idée de modifier Unity peut paraître effrayante et/ou difficile. Mais on va voir que ce n'est pas bien différent des scripts que vous êtes habitués a écrire.

Comme d'habitude je préviens que ce tutorial n'a en rien la prétention d'être complet. Son but est surtout de vous aider a vous lancer tout en vous expliquant les bases. Pour le reste la documentation d'Unity vous tend les bras^^.

Allez, c'est parti !




Ce qu'on va réaliser



Pour avoir un cadre de travail, on va coder quelque chose de bien concret, un "éditeur de niveaux" très basique. Ce petit éditeur permet de copier/coller, déplacer et orienter des objets très facilement et de manière précise. Ça permet par exemple de placer des murs à la suite l'un de l'autre très rapidement en étant sûr qu'il n'y aura pas d'overlaps.

Il ressemble à ça, perso je l'utilise tous les jours.



Il est axé 2D mais comme vous le voyez, il y a deux petites rajoutes 3D (Y Up et Y Down) que j'avais faites pour mon prototype de Spacesim.

Vous aurez sans doute aussi besoin de changer les axes utilisés si vous n'utilisez pas les mêmes que moi. J'utilise toujours l'axe Y comme axe vertical. Ce qui fait que les coordonnées de "Song of the Myrne" se font en (X, Z) et non pas en (X, Y) comme certains font.

L'interface



On va commencer par la partie visuelle. Je vais vous apprendre a créer une fenêtre, y placer du texte, des boutons, etc...

Vous allez voir que c'est presque la même chose que de faire une interface normale. La principale différence c'est qu'on va généralement éviter de travailler avec des Rect, on préférera souvent que les éléments se placent à la suite l'un de l'autre dans la fenêtre plutôt qu'en donnant des dimensions et un positionnement fixe à nos éléments.

Notez qu'on peux quand-même le faire, dans ce cas on utilisera les GUI.Button, GUI.Label,... habituels.

Créer une fenêtre

Commençons par créer un script (je travaille en javascript). Mais attention ! Pas n'importe où. Les scripts qui modifient Unity, soit l'éditeur, se placent dans le dossier "Assets/Editor". Si vous ne le mettez pas là, et uniquement là (ou dans un sous-dossier de celui-ci), ça ne fonctionnera pas. On appelle ces scripts des EditorScripts.

Une fois votre script créé, appelons-le "Editor2D.js" par exemple, on va y écrire le code de base pour la création d'une fenêtre:

  • Pour commencer on crée une classe "Editor2D" qui se base sur la classe EditorWindow :

class Editor2D extends EditorWindow {
}


  • Dans cette classe on va ajouter une des fameuses commandes @ vues dans la partie 2 du tuto.
@MenuItem ("Window/Editor2D")

Cela va permettre d’appeler notre fenêtre dans Unity, parce que faire une fenêtre, c'est cool, mais si on ne peux pas y accéder, ça sert un peu à rien^^.

  • Bien, maintenant on peux créer la fenêtre proprement dite (le nom de la fonction n'a pas d'importance):
static function Init ()
    {  
        var window = ScriptableObject.CreateInstance.();
        window.Show();
    }


  • On ajoute une fonction OnGUI() et puis c'est bon !
A ce stade, votre script doit ressembler à ça:


Dans Unity, si vous allez dans le menu Window et que vous cliquez sur Editor2D, il devrait vous ouvrir une fenêtre vide.

On va bientôt ajouter du contenu à cette fenêtre, Unity est un peu capricieux et ne veux pas toujours rafraîchir le contenu de la fenêtre (de mon temps, il ne le faisait pas du tout automatiquement, ne vous plaignez pas^^), voilà donc ce qu'il faut faire pour la rafraîchir:

  • Simplement cliquer ou double-cliquer sur la fenêtre pour prendre le focus, en général ça la rafraîchit et vous pouvez voir l'effet de vos modifications dedans.
  • Si ça ne fonctionne pas, redimensionnez-là, en principe ça marche à tous les coups
  • Si vraiment ça ne fonctionne pas, pensez a ajouter un bouton appelant la fonction Repaint(); ou fermez puis ré-ouvrez la fenêtre.
Bien, elle est bien cool notre fenêtre, mais elle fait un peu vide.

Le contenu de l'interface


C'est ici qu'un bon 90% du travail est fait.

Ce qu'il faut savoir avant de commencer, c'est qu'Unity va remplir notre fenêtre de haut en bas, dans l'ordre de ce qu'il trouvera dans le OnGUI (puisque comme je l'ai dit, on ne va pas donner de positions fixes à nos éléments).

Outils



Voici la liste des outils qu'on va utiliser pour quand-même mettre un peu d'ordre dans notre fenêtre:

GUILayout.BeginHorizontal();
GUILayout.EndHorizontal();

Ces deux commandes vont nous permettre d'ouvrir puis de fermer une zone horizontale. C'est à dire que tout le contenu entre ces deux lignes va s'aligner de gauche à droite et non plus de haut en bas. Comme vous l'avez vu sur le screen de notre éditeur, nos "tableaux de contrôle" (Move, Rotation et Copy) sont placés les uns à côtés des autres, c'est grâce à ces commandes.

GUILayout.Space(tailleEnPixel);

Cette ligne-ci va ajouter un espace vide entre deux éléments. Cet espace sera vertical par défaut, mais horizontal si la ligne se trouve entre un BeginHorizontal et un EndHorizontal.

Au niveau des boutons, labels, etc, on va chaque fois utiliser la classe GUILayout plutôt que la classe GUI. Ce qui comme je l'ai dit, nous permettra de ne pas donner de position fixe à nos éléments.

Ainsi, GUI.Button(Rect(posX, posY, sizeX, sizeY), "Click me") deviendra GUILayout.Button("Click me");

Rien de bien nouveau ici.

Sauf que par défaut, les boutons, les labels,... prendront toute la largeur disponible (la largeur de la fenêtre si le bouton est seul, la moitié s'il y en a deux, etc). Comme ce n'est pas forcément joli, on utilisera GUILayout.Width(tailleEnPixel) pour donner une taille à un élément.

Exemple: GUILayout.Button("Click me", GUILayout.Width(sizeX));

Bien, vous avez tout bien retenu ? Alors c'est parti !

Promis, cette fois on tape du code !

Pour commencer, déclarez la variable var sizeOfObject:int = 10; au tout début de la classe Editor2D. Cette variable va permettre de préciser à notre éditeur la taille des objets qu'on manipule. En gros, si je la laisse par défaut, à 10 (c'est la taille de mes petits carrés dans Song of the Myrne), et que j'appuie sur "Move Right" avec un objet sélectionné, cet objet va être déplacé de 10 unités sur la droite.

A partir d'ici, tout se passe dans la fonction OnGUI si je ne précise rien.

On va donc écrire notre interface en commençant par le haut, On a donc les options (l'option unique en fait^^) de l'éditeur.

// Ces trois variables serviront plus tard
var sizeButtons:int = 130;
var ecartPanneaux:int = 30; // L'écart entre nos panneaux de contrôles
var ecartTitles:int = sizeButtons; // L'écart entre le titre "Move" et le bord gauche de la fenêtre

// Le deuxième argument permet simplement de mettre le texte en gras
GUILayout.Label ("Base Settings", EditorStyles.boldLabel);
     
GUILayout.Space(10); // Cet espace n'est pas dans une zone Horizontale, il sera donc vertical
     
// On commence une zone horizontale pour que la suite s'affiche en ligne et pas en colonne
GUILayout.BeginHorizontal();      
sizeOfObject = EditorGUILayout.IntField("Size of Object", sizeOfObject, GUILayout.Width(250));
if(GUILayout.Button("-", GUILayout.Width(40)))
{
     if(sizeOfObject > 10)
     sizeOfObject -= 10;
}
if(GUILayout.Button("+", GUILayout.Width(40)))
sizeOfObject += 10;
GUILayout.EndHorizontal();

L'étape suivante consiste a afficher les trois panneaux de contrôles. Y'a vraiment rien de nouveau ici donc je vous donne le code complet de la fonction OnGUI. Je pense avoir déjà expliqué tout ce qui s'y trouve.

function OnGUI ()
    {
    var sizeButtons:int = 130;
    var ecartPanneaux:int = 30;
    var ecartTitles:int = sizeButtons;
   
        GUILayout.Label ("Base Settings", EditorStyles.boldLabel);
     
        GUILayout.Space(10);
     
        GUILayout.BeginHorizontal();      
        sizeOfObject = EditorGUILayout.IntField("Size of Object", sizeOfObject, GUILayout.Width(250));
        if(GUILayout.Button("-", GUILayout.Width(40)))
        {
        if(sizeOfObject > 10)
        sizeOfObject -= 10;
        }
if(GUILayout.Button("+", GUILayout.Width(40)))
sizeOfObject += 10;
GUILayout.EndHorizontal();
     
GUILayout.Space(10);
     
        GUILayout.BeginHorizontal();
        var decalTitre:int[] = new int[3];
        decalTitre[0] = -25;
        decalTitre[1] = -decalTitre[0]+ecartPanneaux-20;
        decalTitre[2] = -decalTitre[0]-decalTitre[1]+ecartPanneaux+40;
        GUILayout.Space(ecartTitles+decalTitre[0]);
        GUILayout.Label ("Move", EditorStyles.boldLabel, GUILayout.Width(sizeButtons));
        GUILayout.Space(ecartTitles+decalTitre[1]);
        GUILayout.Label ("Rotation", EditorStyles.boldLabel, GUILayout.Width(sizeButtons));
        GUILayout.Space(ecartTitles+decalTitre[2]);
        GUILayout.Label ("Copy", EditorStyles.boldLabel, GUILayout.Width(sizeButtons));
        GUILayout.EndHorizontal();
     
        GUILayout.Space(10);
     
        GUILayout.BeginHorizontal();
        GUILayout.Space(sizeButtons/2);
        if(GUILayout.Button("Up", GUILayout.Width(sizeButtons))) //Move Up
        Move("Up");
        GUILayout.Space(sizeButtons + ecartPanneaux);
        if(GUILayout.Button("0", GUILayout.Width(sizeButtons))) //Rotation 0
        SetRotation(0);
        GUILayout.Space(sizeButtons + ecartPanneaux);
        if(GUILayout.Button("Up", GUILayout.Width(sizeButtons))) //Copy Up
        Copy("Up");
        GUILayout.EndHorizontal();
     
        GUILayout.BeginHorizontal();
        if(GUILayout.Button("Left", GUILayout.Width(sizeButtons))) //Move Left
        Move("Left");
        if(GUILayout.Button("Right", GUILayout.Width(sizeButtons))) //Move Right
        Move("Right");
       
        GUILayout.Space(ecartPanneaux);
       
        if(GUILayout.Button("-90", GUILayout.Width(sizeButtons))) //Rotation -90
        SetRotation(-90);
        if(GUILayout.Button("90", GUILayout.Width(sizeButtons))) //Rotation 90
        SetRotation(90);
       
        GUILayout.Space(ecartPanneaux);      
        if(GUILayout.Button("Left", GUILayout.Width(sizeButtons))) //Copy Left
        Copy("Left");
        if(GUILayout.Button("Right", GUILayout.Width(sizeButtons))) //Copy Right
        Copy("Right");
        GUILayout.EndHorizontal();
       
GUILayout.BeginHorizontal();
GUILayout.Space(sizeButtons/2);
        if(GUILayout.Button("Down", GUILayout.Width(sizeButtons))) //Move Down
        Move("Down");
        GUILayout.Space(sizeButtons + ecartPanneaux);
        if(GUILayout.Button("180", GUILayout.Width(sizeButtons))) //Rotation 180
        SetRotation(180);
        GUILayout.Space(ecartPanneaux + sizeButtons);
        if(GUILayout.Button("Down", GUILayout.Width(sizeButtons))) //Copy Down
        Copy("Down");
        GUILayout.EndHorizontal();
       
        GUILayout.Space(15);
       
GUILayout.BeginHorizontal();
GUILayout.Space(sizeButtons/2);
        if(GUILayout.Button("Y Up", GUILayout.Width(sizeButtons))) //Move UP on Y
        Move("Y Up");
        GUILayout.Space(sizeButtons*3 + ecartPanneaux*2);
        if(GUILayout.Button("Y Up", GUILayout.Width(sizeButtons))) //Copy UP on Y
Copy("Y Up");
        GUILayout.EndHorizontal();
       
GUILayout.BeginHorizontal();
GUILayout.Space(sizeButtons/2);
if(GUILayout.Button("Y Down", GUILayout.Width(sizeButtons))) //Move Down on Y
Move("Y Down");
GUILayout.Space(sizeButtons*3 + ecartPanneaux*2);
        if(GUILayout.Button("Y Down", GUILayout.Width(sizeButtons))) //Copy Down on Y
Copy("Y Down");
GUILayout.EndHorizontal();
    }

Voilà, en principe avec ça, l'interface devrait être complète.

Horreur ! Ça ne compile plus ! Espèce de vile engeance du démon ! Tu m'a donné du code pété !

Mais non, pas de panique, ce code appelle les fonctions qu'il nous reste a coder. Mettez les appels de fonctions en commentaire si vous voulez voir ce que donne votre interface.

Les fonctions



Bon, avoir une belle coquille toute vide, c'est bien joli. Mais ça sert un peu à rien.

C'est pourquoi on va maintenant coder les 3 fonctions Move(), Copy() et SetRotation() qui vont faire tout le boulot dès qu'on appuiera sur un bouton de l'interface.

Elles sont bien sûr a placer dans la classe Editor2D. Ça peut paraître évident mais bon, perso je n'écris jamais le "classe machinTruc{}" sauf pour mes fenêtres, alors...

On va commencer par les deux fonctions les plus simples: Move() et SetRotation(). Ici il n'y a qu'un seul truc nouveau. Il s'agit de la classe "Selection".

En gros c'est tout con, si on veux accéder aux Transforms qui sont sélectionnés dans l'éditeur Unity, on utilisera:

for(var trans:Transform in Selection.transforms)

Rien de bien difficile ici. Voilà le code des fonctions:

function Move(direction:String)
    {
    if(direction == "Left")
    {
    for(var trans:Transform in Selection.transforms)
    trans.position.x -= sizeOfObject;
    }
    else if(direction == "Right")
    {
    for(var trans:Transform in Selection.transforms)
    trans.position.x += sizeOfObject;
    }
    else if(direction == "Up")
    {
    for(var trans:Transform in Selection.transforms)
    trans.position.z += sizeOfObject;
    }
    else if(direction == "Down")
    {
    for(var trans:Transform in Selection.transforms)
    trans.position.z -= sizeOfObject;
    }
    else if(direction == "Y Up")
    {
    for(var trans:Transform in Selection.transforms)
    trans.position.y += sizeOfObject;
    }
    else if(direction == "Y Down")
    {
    for(var trans:Transform in Selection.transforms)
    trans.position.y -= sizeOfObject;
    }
    }

function SetRotation(rot:float)
{
for(var objet:GameObject in Selection.gameObjects)
   {
    objet.transform.localEulerAngles.y = rot;
   }
}

La fonction Copy() ajoute une nouveauté à cause de la relation des objets avec leurs Prefabs. J'ai donc deux versions de cette fonction, choisissez celle que vous préférez ou ajouter les toutes les deux à l'éditeur avec une petite option de choix.

La première version ne contient pas la nouveauté, voilà déjà son code.

function Copy(direction:String)
    {    
    for(var objet:GameObject in Selection.gameObjects)
    {
    var instObj:GameObject = GameObject.Instantiate(objet, objet.transform.position, objet.transform.rotation);
    instObj.name = objet.gameObject.name; // évite d'avoir (Clone) dans le nom
    }
   
    Move(direction);
    }

L'inconvénient de cette version, c'est que si l'objet qu'on clone est lié à un prefab, la copie (qui en plus se met à la place précédemment occupée par cet objet) ne sera pas du tout liée à ce prefab. Autrement dit, si vous clonez un mur 500 fois, puis que vous ajoutez un script au préfab de ce mur, aucun de ces murs ne subira la modification. Vraiment pas conseillé...

Pour palier à ce problème j'ai écrit une seconde version de la fonction. Cette deuxième version utilise la classe PrefabUtility et va créer un nouvel objet à partir du prefab de l'objet qu'on veux cloner.

La voici :

function Copy(direction:String)
{
   for(var objet:GameObject in Selection.gameObjects)
   {
    var instObj:GameObject;
   
    var prefab:GameObject;
    if(PrefabUtility.GetPrefabParent(objet))
    {
    prefab = PrefabUtility.GetPrefabParent(objet);
        instObj = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
       }
       else
        instObj = Instantiate(objet,objet.transform.position,Quaternion.identity);
       instObj.transform.position = objet.transform.position;
       instObj.transform.rotation = objet.transform.rotation;

       instObj.name = objet.name; // évite d'avoir "(Clone)" dans le nom
   }
   Move(direction);
}

Elle n'est pas sans défaut elle non plus. Comme je l'ai dit, elle crée un objet à partir du prefab de cet objet, et ne tient finalement pas compte de l'objet lui-même.

Le soucis avec ça c'est que si vous avez, par exemple changé la texture d'un mur lié à un prefab, et que vous clonez ce mur, le mur cloné (qui une fois encore prendra la place de l'ancien mur, gardez le en tête si vous utilisez l'éditeur tel quel^^) ne possédera pas la nouvelle texture mais l'ancienne (celle du prefab donc). Dans cette situation, je créerais un nouveau prefab pour le mur possédant une texture différente, mais c'est pas toujours faisable, on ne va pas créer 500 préfabs pour un même objet^^.

Voilà voilà. En principe votre éditeur devrait fonctionner et votre code ressembler à ça:

http://i.imgur.com/gX2L4XI.png

Vous pouvez aussi télécharger mon script complet à cette adresse.

Une dernière petite astuce pour la route



Vous voilà, intrépides codeurs, prêts à conquérir le monde avec vos propres scripts. Et très vite vous allez vous retrouvez a modifier les valeurs d'un script, depuis un EditorScript. Alors retenez bien ceci ! Ne retenez pas forcément la commande ni quoi que ce soit, mais rappelez-vous que dans un coin obscur du web, un mec qu'on appelle Beldarak vous en a parlé, et alors à ce moment là vous pourrez revenir ici, et les yeux larmoyants, me remercier du fond du coeur pour les heures de galère que je vais vous épargner dans quelques instants.

Unity, n'aime pas trop qu'on modifie les valeurs d'un script (attaché à un objet donc) depuis un de nos propres EditorScripts. Il va alors faire un truc très chiant :

  • Dans un premier temps, tout va fonctionner
  • Vous allez ensuite appuyer sur "Play" et tester le jeu... Et vous rendre compte (ou pas, c'est là toute la perfidie du truc) qu'en fait votre modification n'a pas été prise en compte.
Pourquoi ? Parce que si dans un premier temps, Unity aura bien fait le changement des valeurs du script que vous modifiez depuis un EditorScript, il ne l'a en fait pas enregistré. Et donc dès qu'on appuie sur Play, il "oublie" le changement.

Une commande va donc vous sauver la vie, même si vous ne le savez pas encore^^

EditorUtility.SetDirty(leScriptModifié);

Ce que fais cette commande, c'est de dire à Unity que vous avez modifié votre script, et qu'il doit donc le sauvegarder. Appelez là de la manière que vous voulez, quand vous voulez (mais avant d'appuyer sur Pause ou de quitter Unity), mais appelez-là !

Elle prend un script comme argument. Donc par exemple, si vous venez de modifier un objet "Porte" pour que son script "Door" soit en position "ouverte" (un boolean donc), on devrait retrouver ça dans votre EditorScript:

porte.GetComponent(Door).open = true;
EditorUtility.SetDirty(porte.GetComponent(Door));

Et voilà, cette astuce vous sera probablement utile un jour.

Conclusion



Et voilà, c'est tout pour cette partie 3. Encore désolé pour le délai entre cette partie et la deuxième, au moins ça m'aura permis d'apprendre un peu le html entre temps et d'améliorer un peu la mise en page^^.

Voici quelques pistes pour aller plus loin et voir ce qu'il y a moyen de faire avec les EditorScripts (et qu'en principe vous devriez être capables de faire désormais) :


  • Lancer des fonctions toutes simples depuis l'éditeur, genre positionner le joueur sur l'objet sélectionné
Je ne l'ai pas encore dit mais pour lancer une fonction depuis l'éditeur, il suffit d'écrire un EditorScript (n'oubliez pas de le mettre dans le dossier "Assets/Editor") qui n'ouvre pas de fenêtre et de mettre: @MenuItem ("Mes Scripts Persos/Ma Fonction Trop Bien") juste avant la déclaration de la fonction qu'on souhaite exécuter depuis l'éditeur. En fait, c'est ce qu'on a fait tantôt avec la fonction Init() qui appelait la fenêtre de notre éditeur 2D.

Ces petites fonctions peuvent faire gagner un temps fou sur le long terme.

  • Un éditeur de niveaux bien complet (ça j'ai encore jamais tenté^^)
  • Un éditeur de dialogues intégré dans Unity (ça non plus)
Et cetera et cetera,... Les possibilités sont infinies.

Voilà, sur ce, je vous laisse. 

Codez bien, les enfants !



vendredi 8 novembre 2013

Song of the Myrne: Un petit tour dans les coulisses

Hello tout le monde !

Billet technique aujourd'hui, donc si le processus de création de SotM ne vous intéresse pas du tout, et qu'en plus m'entendre parler d'Unity vous file des boutons, passez votre chemin^^

Pour ceux qui sont encore là, c'est partiiiiii !

Aujourd'hui je me suis codé un nouveau petit outil pour m'aider dans la création du jeu. Cet outil concerne un "problème" (plus une perte de temps qu'un vrai problème à vrai dire) bien particulier que j'ai parfois lorsque je crée des bâtiments, murs, etc...

En fait la plupart du temps, les murs, sols, façades, etc se "construisent" automatiquement au lancement du niveau. Par exemple, lorsque je crée un nouveau style de façade, je me contente de dessiner la texture complète du bâtiment dans un atlas de textures puis de poser les "plaques" qui constituent le bâtiment dans l'éditeur, sans trop me poser de questions.

Ce qui fait que dans l'éditeur, avant qu'on appuie sur "Play", la charmante petite ville que je vous ai montré il y a deux jours ressemble à ça:

Ah oui c'est sûr, c'est tout de suite moins sexy^^

Ce qu'il se passe au moment où le level est lancé ingame, c'est que chaque morceau de bâtiment va jeter un oeil à ses voisins ("Ah tiens, salut "Mur qui porte le même nom que moi !", "Hey, salut "Porte", t'es nouvelle dans le quartier ?"). Il va ensuite adopter une texture de l'atlas adéquate à son environnement, selon ce que lui-même est (un morceau de façade? De toit? De mur intérieur ?) et selon ses voisins. Genre si je suis une façade, que je n'ai pas de voisin en dessous de moi et qu'à droite, je vois une porte, je vais devenir un bas de bâtiment avec un pourtour de porte sur la droite, je vais aussi prendre en compte le fait que j'ai un voisin à gauche par exemple.

Tout ça fonctionne à merveille dans la plupart des cas.

Mais parfois, il arrive que j'ai besoin de spécifier moi-même la position d'un élément dans l'atlas de texture. Parce que cet élément appartient à un ensemble complexe (genre un phare qui possède une partie haute avec l'éclairage plutôt qu'un toit), ou pour apporter un peu de variation, comme ici par exemple:

En analysant ses voisins directs, un élément de cette bande ne saurait pas dire qu'il délimite un second étage, il sait juste qu'il ne touche ni le toit, ni le sol

Du coup je dois rentrer à la main les coordonnées de l'atlas que doit adopter un de ces blocs spéciaux (et dans l'exemple ci-dessus j'ai 3 coordonnées différentes puisqu'il y a les côtés du bâtiment). Faire attention de bien spécifier qu'il ne doit pas la choisir lui-même, ne pas me gourer en tapant les coordonnées, et bien entendu je dois souvent afficher une grille sur la texture dans Photoshop pour bien compter les colonnes et les lignes (pour les façades ça se voit à l'oeil nu, mais pour les murs intérieurs c'est une autre histoire^^).

Rien de compliqué, ça ne me prend que 20-30 secondes... plusieurs fois par jour...

Du coup, comme l'informatique c'est un domaine dans lequel la paresse est une qualité. Je me suis codé ce petit éditeur pour m'économiser ces centaines de secondes perdues chaque jour.

Cliquez sur l'image pour la voir en plus grand

J'ai juste a cliquer sur la partie que je veux que l'objet (ou les objets) affiche(nt), "et voilà" comme disent les anglais qui friment en parlant français.

Il va aussi me permettre d'ajouter un peu plus de variations sur les bâtiments, genre des fenêtres mieux intégrées dedans (actuellement, les fenêtres du jeu sont des objets que je pose par dessus le bâtiment), une partie du mur un peu décrépite ou sale, etc... Comme vous le voyez, il y a plein de places libres dans mes atlas de façade et la création de cet outil était une belle occasion de repasser dans mes scripts et permettre des tailles d'atlas variables pour les murs intérieurs (on est vraiment à l'étroit dans ces atlas là vu que mes scripts ne prenaient en charge que le 8 case x 8 case avant aujourd'hui).

Voilà voilà, j'espère que ce genre de billets vous plait. Personnellement j'adore voir comment fonctionnent les coulisses des jeux en développement que je suis... C'est ma deuxième passion dans la vie après raconter ma vie sur un blog (et faire des jeux-vidéos !)^^

A la prochaine les asticots !

mercredi 6 novembre 2013

Song of the Myrne: Cité Rempart

Salut tout le monde !

L'autre jour je vous disais que tout n'était pas verdoyant avec des petits lapins qui courent partout dans SotM. J'avais mis une toute petite image pour ne pas trop spoiler de lieux du jeu.

Aujourd'hui je reviens avec une nouvelle ville assez sombre et surtout un screen un peu plus grand (c'est pas le même endroit) :

La Cité Rempart


Cliquez pour voir l'image en grand
C'est encore très vide, je suis seulement en train de placer les bâtiments

Rempart est une ville sous-terraine (presque) totalement coupée du reste du monde. Ce qui signifie qu'on y trouve des habitants bien singuliers, une culture très différente, etc.

Je me suis inspiré d'Arx Fatalis pour le design des bâtiments et pour le concept. Et puisqu'on parle d'Arx Fatalis, il n'est pas exclu que la Cité Rempart et le monde du dessous fassent l'objet d'un de mes jeux un jour (dans longtemps^^), la vue du dessus ne permet pas de rendre le sentiment d'oppression et de claustrophobie dû au plafond de la grotte qui est assez bas.

dimanche 3 novembre 2013

Song of the Myrne: des mobs un peu plus intelligents


Hello tout le monde !

Vous vous demandez sans doute ce que je fais depuis la sortie de la démo de SotM, comment ça non ?

Je me suis remis à 90% sur le contenu et j'ai commencé une très chouette quête/donjon inspirée par Arx Fatalis.

Quand aux 10 pourcents restants, ça consiste a améliorer deux trois trucs sur base des feadbacks que je reçois suite à la démo.

J'ai donc optimisé un peu plus le jeu pour que l'éclairage hors-écran se désactive automatiquement.

Et puis aujourd'hui je me suis attaqué un peu à l'IA. "Intelligence" reste un gros mot pour ces mobs et PNJ complètement idiots, mais au moins maintenant ils arrivent a éviter des obstacles simples tels que les arbres et les rochers.

Voilà voilà, je voulais vous faire une vidéo comparative des PNJs avant/après mais mon programme de capture vidéo continue a faire la gueule. J'ai lancé le download de nouveaux softs pour remédier un peu à tout ça.