• FEATURED

View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# Z-Layer change

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

2 replies to this topic

### #1DeliciousThaiCosine  Members

Posted 03 October 2013 - 12:24 AM

In a 2D isometric game, the player can be either behind a tree or in front of the tree.

I understand that in order to implement something like that, I need to draw the objects that are furthest away first and the objects that are closest to the screen last, but I don't know how to express that in C++.

How do I change the draw order of the objects during run time?

Like, when the player starts out behind the tree and then walks in front of the tree then I need to change "draw tree before player" to "draw tree after player"

I don't know how to write that at all.

(I'm using SFML and C++)

### #2DekuTree64  Members

Posted 03 October 2013 - 12:40 AM

Sort by Y position. In isometric, ignore the "altitude" of the sprite during the sorting, so jumping up doesn't affect the draw order, even though it does affect the Y position on screen. Any sorting algorithm will do. I keep my sprites in a linked list, and use an insertion sort where I traverse the list backward and rebuild it every frame, because it's simple and fast. If no sprites have changed order, it's linear time. Worst case is if they all completely reversed order, where it would be O(n2) time. But even that wouldn't be a big deal unless you have a ton of sprites, and most games it would never happen anyway.

void SpriteSystemYSort()
{
Sprite *activeListTail;

if (sprite == NULL || sprite->next == NULL)
return;    // No sorting to be done unless there's more than one sprite

// Start from the tail of the list, for minimal insert time if the order hasn't changed since last frame
while(sprite->next)
sprite = sprite->next;

// Rebuild the active list in Y sorted order. Start by adding the first sprite, to save a couple null checks in the loop
sprite = sprite->prev;
while(sprite)
{
Sprite *prev = sprite->prev;

while(insert != NULL && insert->pos.y > sprite->pos.y)
insert = insert->next;

if (insert == NULL)
{
sprite->prev = activeListTail;
sprite->next = NULL;
activeListTail->next = sprite;
activeListTail = sprite;

}
{
sprite->prev = NULL;
}
else
{
sprite->prev = insert->prev;
sprite->next = insert;
insert->prev->next = sprite;
insert->prev = sprite;
}

sprite = prev;
}
}

### #3Juliean  Members

Posted 03 October 2013 - 02:34 AM

Sort by Y position.

Or, if you want to avoid sorting for e.g. solid opague characters, you can do this to convert to a relative z-position:

float z = -(vPos.y - m_vScreenPos.y) / INT_MAX); // the "-" depends on how your viewport is set up


Where vPos is the position of the sprite/character, and m_vScreenPos is the position of the camera. Now you can just draw in random order with the z-buffer enabled, while for transparent sprite, you have little choice than to explicitely sort by y-position.

Edited by Juliean, 03 October 2013 - 02:35 AM.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.