dimanche 5 septembre 2010

04 - Jonction des salles - Position initiale du Héros

Aujourd'hui j'ai poursuivi la création du Donjon en me penchant sur la résolution du problème évoqué la dernière fois : Comment joindre les différentes salles entre elles ?

Chacune de ces salles est séparée par une colonne de briques. Ce que je souhaite, c'est assurer la jonction entre deux salles en remplaçant une de ces briques par une dalle.
J'ai suivi la méthode suivante : Pour chaque colonne de séparation de salles, j'étudie ligne par ligne la colonne précédente et la colonne suivante ; si, pour une ligne donnée, il y a une dalle dans la colonne précédente ET dans la colonne suivante, alors il est possible de joindre ces deux salles en remplaçant une brique de la colonne de séparation par une dalle. J'ajoute donc les coordonnées de cette brique à la liste des jonctions potentielles. Une fois toutes les lignes possibles étudiées, je tire au sort une valeur dans la liste des jonctions potentielles afin de déterminer quelle brique je vais remplacer par une dalle.

Exemple :
  • Pour la colonne 4 il n'existe qu'une seule possibilité : remplacer la brique de la ligne 3 par une dalle ;
  • Pour la colonne 8 il y a 2 possibilités : la ligne 1 et la ligne 3 ;
  • Pour la colonne 12 il y a 4 possibilités : les lignes 1, 3, 4 et 5 ;
  • Pour la colonne 16 il y a 3 possibilités : les lignes 1, 3 et 5.

Après tirage au sort, j'obtiens le tracé suivant :

Si j'effectue un nouveau tirage au sort, il y a de grandes chances pour que je tombe sur un tracé différent, comme celui-ci par exemple :

La question des jonctions entre les salles semble donc réglée... Pourtant, il reste encore un cas à envisager : Et si le nombre de jonctions potentielles entre deux salles est égal à zéro ?

L'image ci-dessus présente plusieurs paires de salles pour lesquelles la jonction sera impossible si on applique la méthode que je viens de vous présenter.

Il existe en fait 4 paires de salles concernées par ce problème : -1, -7, 14 et 17.
Pour ces 4 cas particuliers, je décide que la jonction s'effectuera selon un chemin bien précis que j'aurai déterminé à l'avance et qui nécessitera de transformer deux briques en dalles et non une seule.

Ce qui donne au final le tracé suivant :


La question du tracé est maintenant quasi réglée : Il ne reste plus qu'à s'occuper de la position initiale du Héros.
Quand le Héros arrive dans un nouvel étage, on est confronté à une des deux situations suivantes :
  • La position du Héros est la même qu'à l'étage précédent ; dans ce cas on doit s'assurer que la tile sur laquelle il se trouve n'est pas une brique, et pour ce faire on impose qu'elle soit de type dalle.
  • Le Héros commence son exploration dans la salle la plus à droite de l'étage ; dans ce cas la position initiale du Héros dépend de la nature de la salle (j'illustrerai ce point dans le billet suivant).

mardi 31 août 2010

03 - Inventaire (suite) - Génération du Donjon

Hier je n'avais pas tout à fait fini l'Inventaire ; je m'étais occupé des objets consommables, mais il me restait encore une catégorie d'objets : ceux à usage multiples.
Contrairement aux consommables, ces objets n'existent qu'en un seul exemplaire. Par conséquent il n'y a pas de compteur de quantité dans le coin supérieur gauche de l'icone.

L'ajout de ces 4 derniers objets a été très rapide, et je me retrouve donc avec un Inventaire opérationnel, à un détail près : Les objets sont affichés, certes, mais pour l'instant inutilisables ! Néanmoins je n'ai pas l'intention de m'occuper de ça pour l'instant. Non, aujourd'hui j'ai décidé de m'attaquer à un gros morceau : La génération des donjons !

Chaque étage du donjon est composé d'un assemblage de tiles (des blocs carrés de 16 pixels de côté qui représentent soit les dalles sur lesquelles les personnages peuvent marcher, soit les murs qui les empêchent de passer) formant un grand rectangle de 34 tiles de long et 7 tiles de haut.

L'étage est représenté par une variable de type tableau à 2 dimensions (un indice pour indiquer la colonne, et un pour indiquer la ligne) : chaque case du tableau représente une tile, et possède soit la valeur 0 (mur) soit la valeur 1 (dalle).

Chaque étage peut être vu comme une succession de salles ayant une forme prédéfinie qui sont reliées entre elles par des couloir.
Dans un premier temps j'ai rempli toutes les cases du tableau avec des 0. Puis, en fonction du type de salle que je souhaite avoir, je modifie les cases pour faire apparaitre les dalles qui donneront à la salle la forme souhaitée.

map[c]=[0,1,0,0,0,1,0];
/*
la première colonne est remplie comme suit, de haut en bas:
brique, dalle, brique, brique, brique, dalle, brique.
*/
map[c+1]=[0,1,1,1,1,1,0];
// on fait de même pour la colonne suivante...
map[c+2]=[0,0,0,0,0,1,0];
//... et pour celle d'après.
/*
on obtient donc une salle ayant cette forme :
XXX
OOX
XOX
XOX
XOX
OOO
XXX
*/

Une fois mon tableau rempli, je n'ai plus qu'à dupliquer mes Clips en les plaçant au bon endroit et en affichant la frame adéquate (brique ou dalle). J'ai ainsi obtenu le résultat suivant :

Comme vous pouvez le constater, les différentes salles sont bien affichées, mais il y a un léger souci : Elles sont toutes séparées par des colonnes de brique !
La prochaine étape consistera donc à relier les salles entre elles...

Le jeu propose 7 environnements graphiques différents, c'est à dire 7 paires "brique-dalle" de couleurs et d'aspects différents.
Lors de la phase de recherches graphiques j'avais réalisé le design de ces 14 éléments. Cependant, une fois assemblés sous forme de donjon, j'ai pu constater certains défauts qui m'ont poussé à modifier légèrement l'apparence et les couleurs de mes sprites afin d'avoir un rendu visuel plus agréable à l'oeil.

Ancienne version (trop terne) :

Nouvelle version (plus colorée) :

lundi 30 août 2010

02 - Inventaire

Outre le Score en haut de l'écran et les stats du personnage en bas à gauche, il reste encore un élément important de l'interface à ajouter avant de s'attaquer à la partie "jouable" de l'affichage : l'Inventaire.

Chaque objet consommable (potions de regain de PM, viandes rendant des PV) est accompagné d'un chiffre en haut à gauche indiquant sa quantité ; comme je n'ai pas trouvé de typo adéquate, j'ai dû dessiner moi-même les 10 chiffres de notre système numérique.
Si la quantité d'un objet consommable est égale à zéro, l'icone de l'objet apparait en niveaux de gris.

Les différentes icones d'objets et les différentes valeurs des quantités ont été rassemblées au sein d'un seul et même Movie Clip qui est ensuite dupliqué aux coordonnées adéquates. À chaque duplication j'indique quelle frame de l'icone et quelle frame de la quantité sont affichées.

// affiche potion 15 :
name = "potion15";
/* la variable "_global.potion15" a pour valeur
le nombre de potions rendant 15 PM présentes
dans l'inventaire ; comme "potion15" est aussi le
nom du Movie Clip qui affiche l'icone de cette
potion, je crée une variable "name" qui me permet
d'alléger mon code et de le réutiliser facilement
pour les autres objets. */
item_icon.duplicateMovieClip(name, 1);
_root[name]._x = 339;
_root[name]._y = 347;
if (_global[name]==0){
// quantité nulle : icone en niveaux de gris
_root[name].icone.gotoAndStop(2);
}
else{
// au moins 1 objet de ce type : icone colorée
_root[name].icone.gotoAndStop(1);
}
_root[name].qte.gotoAndStop(_global[name] + 1);

dimanche 29 août 2010

01 - Fichiers de sauvegarde - Affichage des stats

Ça y est, après des semaines de préparation, je me lance enfin dans la programmation !

J'ai entamé les recherches graphiques au début du mois d'août (mise au point de l'interface, design des personnages, iconographie... ), et hier j'ai mis au point les dialogues des PNJ. Bref, je suis fin prêt pour attaquer le code, et malgré mon appréhension (cela fait 6 mois que je n'ai pas touché à SWISH Max 3) je décide d'arrêter de procastriner pour enfin commencer à concrétiser ce projet.

La première chose que j'ai faite, c'est mettre au point le système de sauvegarde des données du jeu ; ces sauvegardes s'effectuent sous la forme de cookies, un cookie par personnage jouable et un pour les données globales du jeu.
Il m'a aussi fallu initialiser les variables, ce qui implique entre autres de mettre au point les stats de départ de chacun des personnages.

Puis je me suis occupé de l'affichage de ces stats, qui sont visibles au moment du choix du fichier à charger, mais aussi durant le jeu ; pour gagner du temps, j'ai dupliqué la scène "playerSelect" pour créer la scène "donjon" : J'ai effacé les éléments inutiles, et la magie du copier-coller a fait le reste.