Add draw sorting based on Y position
This commit is contained in:
50
game/main.c
50
game/main.c
@@ -148,6 +148,18 @@ ECS_DTOR(Path, path, {
|
||||
}
|
||||
})
|
||||
|
||||
int cmpPos(ecs_entity_t e1, const void *v1, ecs_entity_t e2, const void *v2) {
|
||||
const Position *pos1 = v1;
|
||||
const Position *pos2 = v2;
|
||||
|
||||
// NOTE: entities with lower Y are in front
|
||||
f32 dif = pos2->y - pos1->y;
|
||||
int cmpVal = 0;
|
||||
if (dif < 0) cmpVal = 1;
|
||||
else if (dif > 0) cmpVal = -1;
|
||||
return cmpVal;
|
||||
}
|
||||
|
||||
bool init(void *userData) {
|
||||
BZ_UNUSED(userData);
|
||||
SetExitKey(0);
|
||||
@@ -167,6 +179,16 @@ bool init(void *userData) {
|
||||
Game *game = ecs_singleton_get_mut(ECS, Game);
|
||||
game->screen = SCREEN_MAIN_MENU;
|
||||
game->font = LoadFontEx("assets/fonts/CompassPro.ttf", 92, NULL, 0);
|
||||
game->drawQuery = ecs_query(ECS, {
|
||||
.filter.terms = {
|
||||
{ ecs_id(Position) },
|
||||
{ ecs_id(Size) },
|
||||
{ ecs_id(Rotation) },
|
||||
{ ecs_id(TextureRegion) }
|
||||
},
|
||||
.order_by_component = ecs_id(Position),
|
||||
.order_by = cmpPos
|
||||
});
|
||||
|
||||
ECS_COMPONENT_DEFINE(ECS, InputState);
|
||||
ecs_singleton_set(ECS, InputState, {});
|
||||
@@ -228,12 +250,12 @@ bool init(void *userData) {
|
||||
|
||||
ECS_SYSTEM(ECS, renderDebugPath, EcsOnUpdate, Path);
|
||||
|
||||
ECS_SYSTEM(ECS, renderTerrain, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureTerrain);
|
||||
ECS_SYSTEM(ECS, renderBuildings, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureBuildings);
|
||||
ECS_SYSTEM(ECS, renderEntities, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureEntities);
|
||||
//ECS_SYSTEM(ECS, renderTerrain, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureTerrain);
|
||||
//ECS_SYSTEM(ECS, renderBuildings, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureBuildings);
|
||||
//ECS_SYSTEM(ECS, renderEntities, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureEntities);
|
||||
|
||||
ECS_SYSTEM(ECS, renderColliders, EcsOnUpdate, Position, Size);
|
||||
ECS_SYSTEM(ECS, renderRotationDirection, EcsOnUpdate, Position, Rotation, TextureEntities);
|
||||
ECS_SYSTEM(ECS, renderRotationDirection, EcsOnUpdate, Position, Rotation);
|
||||
|
||||
loadMap(game, "assets/maps/main_menu_01.tmj");
|
||||
|
||||
@@ -253,6 +275,7 @@ void deinit(void *userData) {
|
||||
|
||||
// Destroy queries
|
||||
ecs_query_fini(input->queries.selected);
|
||||
ecs_query_fini(game->drawQuery);
|
||||
|
||||
Game gameCopy = *game;
|
||||
InputState inputCopy = *input;
|
||||
@@ -314,9 +337,26 @@ static void renderGame(Game *game, float dt) {
|
||||
ClearBackground(RAYWHITE);
|
||||
BeginMode2D(game->camera);
|
||||
|
||||
// Map
|
||||
bzTileMapDraw(&game->map);
|
||||
|
||||
// Ground UI
|
||||
drawPlayerInputUIGround();
|
||||
// Entities
|
||||
ecs_iter_t it = ecs_query_iter(ECS, game->drawQuery);
|
||||
while (ecs_iter_next(&it)) {
|
||||
Position *p = ecs_field(&it, Position, 1);
|
||||
Size *s = ecs_field(&it, Size, 2);
|
||||
Rotation *r = ecs_field(&it, Rotation, 3);
|
||||
TextureRegion *t = ecs_field(&it, TextureRegion, 4);
|
||||
for (i32 i = 0; i < it.count; i++) {
|
||||
Rectangle dst = {p[i].x, p[i].y, s[i].x, s[i].y};
|
||||
Vector2 origin = {dst.width * 0.5f, dst.height * 0.5f};
|
||||
Rectangle src = t[i].rec;
|
||||
if (t[i].flipX) src.width *= -1.0f;
|
||||
if (t[i].flipY) src.height *= -1.0f;
|
||||
DrawTexturePro(t[i].texture, src, dst, origin, t[i].rotation, WHITE);
|
||||
}
|
||||
}
|
||||
|
||||
ecs_progress(ECS, dt);
|
||||
ecs_enable(ECS, renderDebugPathSystem, game->debugDraw.path);
|
||||
|
||||
Reference in New Issue
Block a user