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.