Problème de depth

cs_gunwolf Messages postés 1 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 6 janvier 2005 - 6 janv. 2005 à 14:41
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 - 6 janv. 2005 à 18:32
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.

1 réponse

pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
6 janv. 2005 à 18:32
étant le créateur de cette source, je pourrais t'expliquer, mais il va déjà falloir que tu comprennes que cette source gère 2 choses : le déplacement logique et le déplacement physique ...

Pour la logique, c'est simple, il ne faut rien changer.

Pour le physique, c'est là qu'il faut tout revoir de A à Z !

- Changer le modèle d'affichage de la grille
- Modifier le principe de déplacement du personnage (nombre magique : 26.656°)
- Modifier les changements de profondeur du personnage. Pour celà, tu dois te baser sur un alignement en diagonale de tes blocs et pas en ligne horizontale comme indiqué dans la source. il faut donc aligner tes blocs en diagonale aussi lors de ta création de carte.

Je précise ici que le principe de jeu en 3D iso requiers une bien plus grande maîtrise de Flash et que si je me suis basé sur un Zelda-Like, c'est bien parce que ce principe est plus simple pour débuter !
Alors étudie en profondeur ma source avant de te lancer dans l'ISO, car c'est plutôt niveau expert qu'il faut être pour tout bien comprendre. Je n'ai fait que donner les bases du logique/physique.

Peg'
0
Rejoignez-nous