Depth
Sorting
         by senocular

So what do you get when you have a space that goes not only side to side but back and forth as well... having depth? What you get is the nuisance of making sure that you have your movieclips overlap properly as to correctly represent their position in that space. With an isometric plane, that issue arises, especially when you are moving things about crazily as in the previous example.

Consider the 3 following characters as movieclips:

As you can see, though each image shows the characters in the exact same locations, the one on the left represents the characters in an arrangement which does not conform to their proper places on the isometric plane, while the rightmost does.

In basic terms, depth sorting is quite easy. All you have to do is realizes that the top most objects in an isometric plane are those which are closer to you, which, visually, translates to those objects which are further down the screen.

This means those movieclips with the highest _y value get the highest depth and are told to be above those with the lower depths. The easiest way to do this is simply using swapDepths on a movieclip with that movieclip's _y as the input value.

this.swapDepths(this._y);

The lower the clip is on the screen, the higher its _y value hence the higher its depth therefore making it above all the clips which are technically behind it.

This technique is not without its flaws. There are some things to know about depths in Flash that will help complicate how you handle depth positioning and may make you wish it was always as simple as this.swapDepths(this._y);

  • You can only swapDepths between -16384 and 2130690045
     
  • swapping outside the range of 0 to 1048575 will make the movieclip unable to be removed (unless swapped back)
     
  • swapping depths at a currently occupied depth will switch the depths of the two clips - clips cannot share the same depth
     
  • creating or attaching a new clip within the depth currently occupied by a movieclip will replace that old clip with the newly created or attached clip
     
  • swapDepths cannot swap between different parent clips. If a clip is within one movieclip, swapDepths can not swap it to be within another

These aren't so bad right? Not really. The worst ones are the 3rd and 4th where you have to worry about clips swapping each other out to the other's last depth and newly placed clips completely killing your existing clips.

When dealing with an isometric plane, you're dealing with many different positions which are set at a rotated and scaled perspective. This rotation is 45 degrees making diagonal spaces lined up with each other horizontally on the screen:

What this means is that the center point of each one of those squares - the point at which a movieclip would be placed if occupying that space, all have the same _y position as the diagonal (seen horizontally) that they're in.

So what happens when you have certain objects within that same horizontal? They are all going to replace each other's depths and only one clip (the last swapped clip) will actually be occupying that arrangement. This is a problem. Why? Well, what if you are attaching 5 clips to be placed on those locations dynamically? Well, first off, you would have to attach them at some errant depth as to prevent attaching them over and therefore replacing any currently existing clips.

Then position them into those grid spaces and then use swapDepths to arrange. However, in swapping depths, after the first is set, the second one replaces it, causing the first one to go into the second one's original attached depth who knows where... then the third does the same to the second, then the 4th comes in followed by the 5th which is the only one which gets swapped properly leaving the other 4 back to the original attaching depths!

What to do? One solution is taking into account the horizontal positioning and figure that into the depth swapping. Here, instead of each depth being swapped through by _y positioning, it would be based on both the _y and _x which, in the aforementioned example, would leave each of those clips with separate depths. So in doing that, you have to take into account the maximum width of your isometric plane and make each _y position contain that many depths between them (for each _x position). Then, assuming the leftmost _x is 0, you get:

this.swapDepths(this._x + this._y*isoPlane_width);

Since at its max, the _x will only reach the isoPlane_width and never interfere with the next step up in the _y positioning.

Now, when it comes to 3D swapping in isometry, you then have to worry about that extra z plane of possible depths - where then, another factor comes into play and your possible depth positions start to sky-rocket.

Stay tuned, some basic 3D movement will be covered next.

Senocular




SUPPORTERS:

kirupa.com's fast and reliable hosting provided by Media Temple.