<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tweenpix &#187; z-sorting</title>
	<atom:link href="http://blog.tweenpix.net/tag/z-sorting/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tweenpix.net</link>
	<description>Behind the mask</description>
	<lastBuildDate>Wed, 02 Mar 2011 22:54:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>isométrie et z-sorting</title>
		<link>http://blog.tweenpix.net/2003/10/11/isometrie-et-z-sorting/</link>
		<comments>http://blog.tweenpix.net/2003/10/11/isometrie-et-z-sorting/#comments</comments>
		<pubDate>Sat, 11 Oct 2003 07:06:12 +0000</pubDate>
		<dc:creator>Francis Bourre</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[isometric]]></category>
		<category><![CDATA[z-sorting]]></category>

		<guid isPermaLink="false">http://blog.tweenpix.net/?p=394</guid>
		<description><![CDATA[En m&#8217;intéressant de près à l&#8217;isométrie, je me suis aperçu que les méthodes pronées par Jobe Makar (Flash MX Games Design Demystified) et consorts au sujet du z-sorting n&#8217;étaient pas du tout adaptées pour un moteur 3D isométrique dont l&#8217;objectif final serait d&#8217;afficher des animations. Je vous propose de partager aujourd&#8217;hui la solution que j&#8217;utilise. [...]]]></description>
			<content:encoded><![CDATA[<p>En m&#8217;intéressant de près à l&#8217;isométrie, je me suis aperçu que les méthodes pronées par Jobe Makar <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0201770210/103-0421988-5159053?v=glance" hreflang="uk">(Flash MX Games Design Demystified)</a> et consorts au sujet du z-sorting n&#8217;étaient pas du tout adaptées pour un moteur 3D isométrique dont l&#8217;objectif final serait d&#8217;afficher des animations.</p>
<p>Je vous propose de partager aujourd&#8217;hui la solution que j&#8217;utilise. Elle vous permettra de gérer les profondeurs sans bug d&#8217;affichage dans un moteur 3d isométrique animé.</p>
<p>Le concept récurrent pour gérer la profondeur d&#8217;un objet dans un tileworld isométrique est d&#8217;assigner un z-sorting incrémenté de gauche à droite sur l&#8217;axe des x, puis de bas en haut sur l&#8217;axe des y comme indiqué sur le schéma ci-dessous&nbsp;:</p>
<p><img src="http://www.tweenpix.net/img/zsshots/zs0.gif" alt="" /></p>
<p>Ce système fonctionne à merveille tant que l&#8217;on se contente du fait que chaque objet se trouvant à une position (x,y) se déplacera sur une case voisine d&#8217;un seul jet, sans interpolation de mouvement, autrement dit sans se trouver à un instant t à cheval entre deux cases.<br />
Pourquoi me direz vous&nbsp;?</p>
<p>Considérons l&#8217;exemple ci-dessous&nbsp;:</p>
<p><img src="http://www.tweenpix.net/img/zsshots/zs1.gif" alt="" /></p>
<p>Un personnage se trouvant à la position 1,1 et voulant se rendre à la position 1,0 va devoir choisir son camp. S&#8217;il garde 4 comme profondeur le temps de l&#8217;animation pour se rendre sur la case destination, il va passer devant l&#8217;objet qui se trouve en 2,0.</p>
<p>S&#8217;il choisit de prendre directement sa profondeur d&#8217;arrivée (1), il sera le temps de son trajet affiché derrière l&#8217;objet se trouvant en 2,0.</p>
<p><img src="http://www.tweenpix.net/img/zsshots/zs2.gif" alt="" /></p>
<p>On est confronté au même probléme dans le sens inverse comme vous pouvez le remarquer&nbsp;:</p>
<p><img src="http://www.tweenpix.net/img/zsshots/zs3.gif" alt="" /></p>
<p>La plupart des moteurs utilisant ce système réussissent à tricher en jouant sur la taille des objets à l&#8217;intérieur des cases et sur l&#8217;instant ou la valeur z-sorting de l&#8217;objet en mouvement est modifiée. Mais ces solutions au bout du compte ne sont vraiment pas satisfaisantes pour gérer l&#8217;affichage de façon propre et logique.</p>
<p>D&#8217;où l&#8217;idée d&#8217;opter pour une organisation comme celle-ci, avec un z-sorting incrémenté en diagonales&nbsp;:</p>
<p><img src="http://www.tweenpix.net/img/zsshots/zs5.gif" alt="" /></p>
<p>Cette fois-ci les animations sur l&#8217;axe des y peuvent-être gérées sans bug d&#8217;affichage&nbsp;:</p>
<p><img src="http://www.tweenpix.net/img/zsshots/zs4.gif" alt="" /></p>
<p>Mais les esprits judicieux auront remarqué que le probléme est maintenant répercuté sur l&#8217;axe des x&nbsp;:</p>
<p><img src="http://www.tweenpix.net/img/zsshots/zs6.gif" alt="" /></p>
<p>Sans plus attendre, voici la solution finale, le même tableau mais avec des intervalles en dizaine&nbsp;:</p>
<p><img src="http://www.tweenpix.net/img/zsshots/zs7.gif" alt="" /></p>
<p>Hum &#8230; Quoi de mieux me direz-vous&nbsp;?<br />
L&#8217;idée est d&#8217;incrémenter de 15 la profondeur d&#8217;un personnage voulant se déplacer vers la droite sur l&#8217;axe des x (50 dans l&#8217;exemple devient 65) et de lui donner à la fin de son parcours la profondeur de la case d&#8217;arrivée (80 dans l&#8217;exemple ci-dessous)&nbsp;:</p>
<p><img src="http://www.tweenpix.net/img/zsshots/zs8.gif" alt="" /></p>
<p>Même chose dans l&#8217;autre sens, on enléve 15 à la profondeur d&#8217;un personnage voulant se déplacer vers la gauche sur l&#8217;axe des x (50 devenant 35 dans le cas précis) et on lui attribue à la fin de son trajet la profondeur de la case destination (il passe donc de 35 à 20 en profondeur une fois arrivé)&nbsp;:</p>
<p><img src="http://www.tweenpix.net/img/zsshots/zs9.gif" alt="" /></p>
<p>Dernier point, quelle méthode utiliser pour calculer la profondeur d&#8217;un objet en connaissant la largeur et la hauteur de la grille ainsi que sa position x et y&nbsp;?<br />
C&#8217;était le sujet d&#8217;un précédent thread, et je remercie Didier d&#8217;avoir trouvé une solution très élégante et rapide pour gérer cette problématique.<br />
Voici le code que j&#8217;utilise&nbsp;:</p>
<pre> <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _sum<span style="color: #66cc66;">&#40;</span>n:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">Number</span> <span style="color: #66cc66;">&#123;</span>

         <span style="color: #b1b100;">return</span> <span style="color: #66cc66;">&#40;</span>n * <span style="color: #66cc66;">&#40;</span>n + <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> / <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
   <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> calculDepth<span style="color: #66cc66;">&#40;</span>x:<span style="color: #0066CC;">Number</span>, y:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>

         <span style="color: #000000; font-weight: bold;">var</span> r:<span style="color: #0066CC;">Number</span> = _sum<span style="color: #66cc66;">&#40;</span>x + y<span style="color: #66cc66;">&#41;</span> + x + <span style="color: #cc66cc;">1</span>;
         r = <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>x + y<span style="color: #66cc66;">&#41;</span> &gt; <span style="color: #66cc66;">&#40;</span>grid.<span style="color: #006600;">x</span>-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> ? r -= _sum<span style="color: #66cc66;">&#40;</span>x + y - <span style="color: #66cc66;">&#40;</span>grid.<span style="color: #006600;">x</span>-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> : r;
         r = <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>x + y<span style="color: #66cc66;">&#41;</span> &gt; grid.<span style="color: #006600;">y</span><span style="color: #66cc66;">&#41;</span> ? r -= _sum<span style="color: #66cc66;">&#40;</span>x + y - grid.<span style="color: #006600;">y</span><span style="color: #66cc66;">&#41;</span> : r;
         <span style="color: #b1b100;">return</span> <span style="color: #66cc66;">&#40;</span>r*<span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span></pre>
<p>Voila, j&#8217;espère que le concept que j&#8217;ai développé et utilise couramment pourra contribuer à remplir un peu le vide auquel je me suis confronté lors de mes investigations sur le sujet.</p>
<p>Je tiens à remercier tout particulièrement Joan pour ses idées et Didier pour son algorithme de calcul remarquable ainsi que Jean-Louis pour la conversion en AS.<br />
Comme d&#8217;habitude, vos questions, commentaires ou critiques sont les bienvenue.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tweenpix.net/2003/10/11/isometrie-et-z-sorting/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

