Forums Développement Multimédia

Aller au contenu

MovieClip et Depth

Definir une portée CODE

10 réponses à ce sujet

#1 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 06 July 2012 - 22:39 PM

Bonjour a tous,

Mon problème est assez simple, je souhaite ajouter des enfants a un movieClip a différentes profondeurs (depth), pour ce faire je vaise utiliser la fonction addChildAt (enfant, depth). Mais voilà, il est impossible d'ajouter un enfant a la depth 20 s'il n'y a pas au minimum 19 enfants deja présent, cela renvoie une erreur index out of bound.

Je souhaiterais donc pouvoir définir la portée de profondeur disponibles sur mon MovieClip sans avoir a rajouter un enfant pour représenter chaque ligne de portée. Cela est-il possible ?

Merci.

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 06 July 2012 - 22:44 PM

Salut,

Je ne me suis jamais penché sur le problème mais ça me semble logique que ça hurle, la DisplayList est gérée par empilement, la réorganisation de la pile est automatique (si tu retire un objet à l'index 3, l'index 4 devient le 3, ect...). Je ne sais pas si c'est possible mais je dirais non, a mon sens il te faut réfléchir à ton problème autrement, par exemple en utilisant un tableau pour gérer la profondeur de tes objets et l'utiliser pour afficher la displaylist (qui elle reste un simple empilement).

#3 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 06 July 2012 - 23:02 PM

En fait j'aurais aimé éviter ça pour économiser des ressources, et eviter d'ajouter un enfant qui sert de conteneur pour chaque niveau de profondeur. Mais bon si j'ai pas le choix, alors j'ai pas le choix ^^

Merci pour ta réponse !

#4 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 06 July 2012 - 23:08 PM

Citation

En fait j'aurais aimé éviter ça pour économiser des ressources, et eviter d'ajouter un enfant qui sert de conteneur pour chaque niveau de profondeur.

J'ai pô compris, désolé il est tard la semaine à été dure, tu peux préciser ?
Pourquoi un enfant qui sert de conteneur, la displaylist empile ce que tu lui donne à manger sans faire la difficile en général.
Et en quoi le fait de passer par un tableau pour trier tes objets avant de les afficher va te bouffer tant que ça de ressources ?

#5 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 06 July 2012 - 23:19 PM

Bon je vais rentrer un peu plus en detail dans ce que j'essaie de faire.

Je crée une carte où un personnage pourra se déplacer en x et en y.
Sur cette carte je souhaite générer des terrains aléatoires en disposant des éléments de décors au fur et a mesure que le personnage avance.

Pour palier au problème des profondeurs, je divise ma carte virtuellement en carrés de 10 pixels dans un tableau que je génère comme suit :


private var tileSize:int = 10;           // taille d'une tile sur la carte
 
// le sol
private var sol:BaseGround = new BaseGround ();
 
// la map
private var map:Array = [];
           
for (var i:int = 0; i < (sol.height / tileSize); i ++)
{
var pixelLine:Array = new Array ();
       
for (var j:int = 0; j < (sol.width / tileSize); j++)
{
  pixelLine.push(i);
}
       
map.push (pixelLine);
}
   
 

J'ai donc après mon calcul, un tableau qui va de 10 pixels en 10 pixels m'informant de la profondeur a utiliser (et plus tard d'autres informations). Ce qui me permet, en ajoutant un enfant et en comparant sa position en x et y dans le tableau 'map' de savoir quelle depth lui donner :


var testBarriere:barriere = new barriere ();
testBarriere.x = 200;
testBarriere.y = 100;
sol.addChildAt(testBarriere, map[testBarriere.x / tileSize][testBarriere.y / tileSize]);
 

Ensuite je souhaite créer un générateur de terrain intélligent, mais ça ce n'est pas encore en route.

#6 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 06 July 2012 - 23:22 PM

Ps : L'idée c'est aussi que le personnage puisse passer de plan en plan sans avoir a changer de parent

#7 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 06 July 2012 - 23:27 PM

Pourquoi tu fais pas un Zbuffer tout simplement ?
Tu place toutes les tuiles dans un tableau (la map), avec un paramètre de profondeur.
Tu trie le tableau en fonction de la profondeur des tuiles et tu affiche le tout (ou juste la partie qui t'intéresse).
Tu crée un tableau de profondeur trié selon les profondeurs trouvées dans la map.
Tu affiche ta map en gérant la displaylist via le tableau de profondeur.

Quand tu as besoin d'ajouter un objet tu regarde juste ton tableau de profondeur pour savoir si il est devant ou derrière la tuile.
Pour le perso tu limite la recherche de profondeur dans le tableau à la taille du perso.

Je s'rai parti là dessus en tout cas.

[Edit] me suis corrigé.

#8 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 06 July 2012 - 23:41 PM

Je n'ai pas bien compris ta proposition.

Je crée un tableau où chaque case vaut 0.
Lorsque j'ajoute mon premier enfant, disons la case x=20, y=20 devient la profondeur de l'enfant, ici 1.

Ensuite si j'ajoute un second enfant, je fais quoi?



Edit apres ta correction :

Ok, tu propose de calculer qui doit se placer devant ou derrière avant l'affichage, puis de gérer l'ajout des enfants en fonction après toutes les vérifications c'est ça?

#9 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 06 July 2012 - 23:55 PM

Citation

Ok, tu propose de calculer qui doit se placer devant ou derrière avant l'affichage, puis de gérer l'ajout des enfants en fonction après toutes les vérifications c'est ça?

Vi très grossièrement un z-buffer : http://fr.wikipedia.org/wiki/Z-buffer
Ou algorythme du peintre : http://fr.wikipedia....thme_du_peintre

Tu te fais un tableau de profondeur non pas sur les pixels mais sur les tuiles de ta map.
Puis tu utilise ce tableau pour savoir qui est devant ou derrière qui.

#10 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 07 July 2012 - 00:21 AM

Hello !

Citation

En fait j'aurais aimé éviter ça pour économiser des ressources, et eviter d'ajouter un enfant qui sert de conteneur pour chaque niveau de profondeur.

Si tu veux gagner en ressource, le mieux est de d'avoir un seul DisplayObject dans lequel tu dessines tout via beginBitmapFill & drawTriangles (drawTriangle n'est pas absolument nécessaire, mais il permet, en plus de tout dessiner dans le même Graphics, de tout dessiner d'un seul coup ce qui fait gagner encore plus en ressources)

EDIT: c'est la même technique que Spi sauf qu'au lieu de mettre à jour la display-list, tu re-desssines tout les éléments du plus loin au plus prés. Le traitement peut paraitre plus lourd, mais c'est en fait beaucoup plus optimisé car c'est exactement ce que fais la display-list de flash sans toutes les méthodes inutile (pour ton projet) des displayObject qui alourdissent considérablement l'animation.

#11 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 07 July 2012 - 17:47 PM

Merci pour votre aide et pour les pistes. Si jamais vous tombez un jour sur comment définir une fourchette de profondeur je serais quand même intérréssé de savoir :)



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)