Sort entities in draw order.
This commit is contained in:
parent
43ec9435f2
commit
9c6ada01dc
|
@ -35,6 +35,7 @@ static void moveToMap(float dx, float dy, PointF *position);
|
||||||
static int hasHitWorld(int mx, int my);
|
static int hasHitWorld(int mx, int my);
|
||||||
static void compareEnvironments(void);
|
static void compareEnvironments(void);
|
||||||
static int getMarkerType(void);
|
static int getMarkerType(void);
|
||||||
|
static int drawComparator(const void *a, const void *b);
|
||||||
|
|
||||||
static SDL_Rect srcRect;
|
static SDL_Rect srcRect;
|
||||||
static Entity *riders[MAX_RIDERS];
|
static Entity *riders[MAX_RIDERS];
|
||||||
|
@ -83,7 +84,7 @@ void doEntities(void)
|
||||||
if (self->w == 0 || self->h == 0)
|
if (self->w == 0 || self->h == 0)
|
||||||
{
|
{
|
||||||
r = &self->sprite[self->facing]->frames[self->spriteFrame]->rect;
|
r = &self->sprite[self->facing]->frames[self->spriteFrame]->rect;
|
||||||
|
|
||||||
self->w = r->w;
|
self->w = r->w;
|
||||||
self->h = r->h;
|
self->h = r->h;
|
||||||
}
|
}
|
||||||
|
@ -206,6 +207,10 @@ void doEntities(void)
|
||||||
addToQuadtree(self, &world.quadtree);
|
addToQuadtree(self, &world.quadtree);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (self->alive == ALIVE_DYING)
|
||||||
|
{
|
||||||
|
addToQuadtree(self, &world.quadtree);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
prev = self;
|
prev = self;
|
||||||
|
@ -214,11 +219,19 @@ void doEntities(void)
|
||||||
|
|
||||||
void drawEntities(int plane)
|
void drawEntities(int plane)
|
||||||
{
|
{
|
||||||
int x, y, draw, i;
|
int x, y, draw, i, t;
|
||||||
|
Entity **candidates;
|
||||||
|
|
||||||
|
candidates = getAllEntsWithin(camera.x, camera.y, SCREEN_WIDTH, SCREEN_HEIGHT, NULL);
|
||||||
|
|
||||||
|
/* counting entities to draw */
|
||||||
|
for (i = 0, self = candidates[i] ; self != NULL ; self = candidates[++i]) {};
|
||||||
|
|
||||||
|
qsort(candidates, i, sizeof(Entity*), drawComparator);
|
||||||
|
|
||||||
for (self = world.entityHead.next ; self != NULL ; self = self->next)
|
for (i = 0, self = candidates[i] ; self != NULL ; self = candidates[++i])
|
||||||
{
|
{
|
||||||
draw = self->isOnScreen && !(self->flags & EF_GONE) && self->plane == plane;
|
draw = !(self->flags & EF_GONE) && self->plane == plane;
|
||||||
|
|
||||||
if (draw)
|
if (draw)
|
||||||
{
|
{
|
||||||
|
@ -238,11 +251,11 @@ void drawEntities(int plane)
|
||||||
|
|
||||||
if (self->isMissionTarget)
|
if (self->isMissionTarget)
|
||||||
{
|
{
|
||||||
i = getMarkerType();
|
t = getMarkerType();
|
||||||
|
|
||||||
y -= (targetMarker[i].y + 5);
|
y -= (targetMarker[t].y + 5);
|
||||||
|
|
||||||
blitRect(atlasTexture->texture, x, y, &targetMarker[i].sprite->frames[i]->rect, 0);
|
blitRect(atlasTexture->texture, x, y, &targetMarker[t].sprite->frames[t]->rect, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -998,3 +1011,11 @@ void swapSelf(Entity *e)
|
||||||
oldSelf = NULL;
|
oldSelf = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int drawComparator(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
Entity *e1 = *((Entity**)a);
|
||||||
|
Entity *e2 = *((Entity**)b);
|
||||||
|
|
||||||
|
return e2->type - e1->type;
|
||||||
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ extern int isWalkable(int x, int y);
|
||||||
extern int isLiquid(int x, int y);
|
extern int isLiquid(int x, int y);
|
||||||
extern int isSolid(int x, int y);
|
extern int isSolid(int x, int y);
|
||||||
extern void terminateJetpack(void);
|
extern void terminateJetpack(void);
|
||||||
|
extern Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore);
|
||||||
|
|
||||||
extern Entity *self;
|
extern Entity *self;
|
||||||
extern Camera camera;
|
extern Camera camera;
|
||||||
|
|
Loading…
Reference in New Issue