Bonjour à tous et tout d'abord merci de prendre la peine de me lire.
Par plaisir personnel je me suis mis à coder en flash. J'ai suis donc
venu ici et j'ai récupérer les sources pour faire un RPG en vue à la
zelda. Après avoir a peu près assimiler le truc j'ai entrepris de
partir de cette base pour construire la même chose mais en vue
isométrique. Je pense que c'est une bonne façon d'apprendre que de
partir d'un cas qui marche de le changer un peu tout en se posant des
problèmes simples au début plutôt que de partir d'une page vierge.
La situation : J'ai un plateau de jeu en vue isométrique. Dessus j'ai disposé un obstacle et mon personnage.
Mon but : Le personnage doit être visible devant l'obstacle et caché derrière.
Le problème : Lorsque je change la depth du personnage il est
invisible derriere l'obstacle comme prévu mais si je descend plus bas
il donne l'impression de s'enfoncer dans le sol jusqu'à sortir du
plateau par le dessous.
Mon code :
/********************************************************/
/* Cette source est la première d'une série de XX */
/* Elle explique comment créer un décor paramétrable, */
/* pour un jeu basé sur une "grille" genre Zelda */
/* libre de droits, elle est créée pour le site */
/*
www.FlashKod.com
*/
/* pour me contacter : chevalier.pegase31@wanadoo.fr */
/********************************************************/
// Initialisation des variables importantes :
LargMap = 10; /*Défini le nombre de blocs horizontaux de la grille d'ecran*/
HautMap = 22; /*Défini le nombre de blocs verticaux de la grille d'ecran*/
LargTile = 60.0; /*Défini la largeur en pxl d'une case (tile) de la grille*/
HautTile = 30.0; /*Défini la hauteur en pxl d'une case (tile) de la grille*/
LargPerso = 16; /*Défini la largeur en pxl du Personnage*/
HautPerso = 12; /*Défini la hauteur en pxl du Personnage*/
/*Petit détail interessant : LargMap*LargTile = 512 (la largeur de l'animation)*/
CoordPerso = [11,11]; /*Coordonnees du personnage à la création en terme de matrice*/
CoordPerso[0] = (CoordPerso[0]*(LargTile/2)); /*Passage du codage matrice au codage pixel sur X*/
CoordPerso[1] = (CoordPerso[1]*(HautTile/2));/*Passage du codage matrice au codage pixel sur Y*/
Hspeed = 4; /*Vitesse de déplacement Horizontale du perso (en Pxl)*/
Vspeed = 2.2; /*Vitesse de déplacement Verticale du perso (en Pxl)*/
BlocArret = 10;
// Définition de la Map dans un tableau à 2 dimensions :
Map = [[1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,3,1,1,1,1,1],
[1,1,1,4,4,1,1,1,1,1],
[1,1,1,3,3,3,1,1,1,1],
[1,1,4,4,4,4,1,1,1,1],
[1,1,3,3,3,3,3,1,1,1],
[1,4,4,4,4,4,4,1,1,1],
[1,3,3,3,3,3,3,3,1,1],
[4,4,4,4,4,4,4,4,1,1],
[1,3,3,3,3,3,3,3,3,1],
[1,4,4,4,4,4,4,4,4,1],
[1,1,3,3,3,3,3,3,3,3],
[1,1,4,4,4,4,4,4,4,4],
[1,1,1,3,3,3,3,3,3,3],
[1,1,1,4,4,5,4,4,4,1],
[1,1,1,1,3,3,3,3,3,1],
[1,1,1,1,4,4,4,4,1,1],
[1,1,1,1,1,3,3,3,1,1],
[1,1,1,1,1,4,4,1,1,1],
[1,1,1,1,1,1,3,1,1,1],
[1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1]];
// Création de la grille permettant d'afficher la carte :
/* On crée une double boucle permettant de créer la grille du jeu */
var Depth = 0;
for (var j=0; j<HautMap; j++) /*début de boucle des ligne*/
{
for (var i=0; i<LargMap; i++) /*début de la boucle de colonne*/
{
Decor.Bloc.duplicateMovieClip("Case"+i+"_"+j,Depth);
if ((j%2)==0)
{
Decor["Case"+i+"_"+j]._x =
(i*LargTile);
}
else
{
Decor["Case"+i+"_"+j]._x =
(i*LargTile)+(LargTile/2);
}/*et on le place en X suivant la ligne ou l on est*/
Decor["Case"+i+"_"+j]._y = (j*(HautTile/2)); /*puis
on le place sur Y*/
Depth++;
} // Fin de boucle des lignes
Depth++;
} // Fin de boucle des colonnes
Affich_Map(); /*On affiche la map*/
// Fonction permettant d'afficher la Map sur la Grille
function Affich_Map() {
/*on réutilise la même double-boucle de la création de la grille pour afficher
chaque Bloc en référence au n° contenu sur la carte */
for(var j=0; j<HautMap; j++) { /*début de boucle des colonnes*/
for (var i=0; i<LargMap; i++) { /*début de la boucle de lignes*/
var Frame = Map[j][i]; /*on va chercher la valeur de la case sur MAP*/
Decor["Case"+i+"_"+j].gotoAndStop(Frame); /*et on envoie le bloc à
cette frame*/
} // Fin de boucle des lignes
} // Fin de boucle des colonnes
}//Affich_Map
/*****************************************************************/
/********** Partie Gestion du déplacement du personnage **********/
/*****************************************************************/
// Gestionnaire d'évènement Clavier :
this.onEnterFrame = function() { /*à chaque image affichée (soit 30fois/sec)*/
if(Key.isDown(Key.RIGHT)) { /*détection de la touche HAUT*/
Xadd = Hspeed;
Yadd = Vspeed; /*On définis la
suppression à Y de la valeur de Speed, soit un déplacement vers le
Haut*/
} else if (Key.isDown(Key.LEFT)) { /*détection de la touche BAS*/
Xadd = -Hspeed;
Yadd = -Vspeed; /*On définis
l'ajout à Y de la valeur de Speed, soit un déplacement vers le bas*/
} else if(Key.isDown(Key.UP)) { /*détection de la touche HAUT*/
Xadd = Hspeed;
Yadd = -Vspeed; /*On définis la
suppression à Y de la valeur de Speed, soit un déplacement vers le
Haut*/
} else if (Key.isDown(Key.DOWN)) { /*détection de la touche BAS*/
Xadd = -Hspeed;
Yadd = Vspeed; /*On définis
l'ajout à Y de la valeur de Speed, soit un déplacement vers le bas*/
} else {
Xadd = 0;
Yadd = 0; /*Si aucune des touches
Verticales ne sont appuyées, on ne crée aucun déplacement en Y*/
}
Test_Mouv(); /*On lance la fonction de test de déplacement du perso*/
}
// Fonction permettant de tester le déplacement du personnage
function Test_Mouv () {
/*On affiche le perso à sa nouvelle place et on met à jour ses coordonnée*/
CoordPerso[0] += Xadd; /*incrémente la coordonnée X du perso*/
CoordPerso[1] += Yadd; /*incrémente la coordonnée Y du perso*/
Decor.Perso._x = CoordPerso[0]; /*affichage du perso en X*/
Decor.Perso._y = CoordPerso[1]; /*affichage du perso en Y*/
/*On lui change sa profondeur, correspondant à la ligne actuelle*/
var x=Math.floor(CoordPerso[0]); //je met la coordonnée en X du personnage dans une variable
var y=Math.floor(CoordPerso[1]); // je met celle en Y dans une autre
var profondeur=Decor.Bloc.Casex_y.getDepth(); //j
essaye de recuperer la valeur de la profondeur de la case ou se trouve
le personnage
Decor.Perso.swapDepths(profondeur); // et j en fais la nouvelle valeur pour le personnage
}
Si quelqu'un pouvait m'expliquer ce que j'ai raté et comment me sortir de cela j'apprécierai énormément.
Je n'ai pas de grosses prétentions. Je commence petit, je cherche juste à comprendre et à rajouter les difficultés une par une.
Merci de m'avoir lu. Bonne fin de journée.