Files
school_stm32/game_engine/ecs/ge_render_system.h
ZZY b5b2c90e75 feat(game_core): 重构游戏引擎并添加新功能
- 重构了游戏引擎的核心逻辑和架构
- 添加了新的实体组件系统(ECS)
- 实现了简单的碰撞检测和响应
- 新增了地图和子弹功能
- 优化了输入处理和渲染逻辑
- 调整了游戏控制方式
2025-07-02 12:14:57 +08:00

96 lines
2.8 KiB
C

#ifndef __GE_RENDER_SYSTEM_H__
#define __GE_RENDER_SYSTEM_H__
#include "ge_entity.h"
#include "ge_render_component.h"
#include <pynic_log/pynic_log.h>
typedef struct ge_render_system {
ge_render_t* render;
ge_ecs_storage_t* ecs;
} ge_render_system_t;
static inline void
ge_render_system_init(ge_render_system_t* ctx, ge_render_t* render) {
Assert(ctx != NULL && render != NULL);
ctx->render = render;
}
#define _GE_RENDERABLE_MASK (GE_RENDERABLE_MASK | GE_COMPONENT_ACVIVE)
static inline void
ge_render_system_draw_basic(
ge_render_system_t* ctx,
ge_render_component_t* comp,
ge_render_pos2_t* pos) {
Assert(comp->type < GE_RENDER_COMP_TYPE_SIZE);
switch (comp->type) {
case GE_RENDER_COMP_TYPE_POINT:
ctx->render->func_draw_point(
ctx->render,
pos,
comp->data.point.color
);
break;
case GE_RENDER_COMP_TYPE_RECT:
ctx->render->func_draw_rect(
ctx->render,
&(ge_render_rect_t) {
*pos,
comp->data.rect.size,
},
comp->data.rect.color
);
break;
case GE_RENDER_COMP_TYPE_TEXT:
TODO();
break;
case GE_RENDER_COMP_TYPE_RECOURCE:
TODO();
break;
default:
LOG_WARN("render component not set Avaliable type %d at [%d,%d]",
comp->type, pos->x, pos->y);
break;
}
}
static inline void
ge_render_system_draw_all(ge_render_system_t* ctx) {
Assert(ctx != NULL);
ge_ecs_storage_t* ecs = ctx->ecs;
Assert(ecs != NULL);
for (int i = 1; i <= ecs->count && i < GE_ECS_MAX; ++i) {
ge_entity_t* entity = &ecs->entities[i];
ge_ecs_mask_t mask = entity->component_mask;
if ((mask & _GE_RENDERABLE_MASK) != _GE_RENDERABLE_MASK) continue;
ge_render_pos2_t pos = {
entity->position.x,
entity->position.y,
};
ge_render_component_t* comp = &entity->renderable;
Assert(comp != NULL);
if (comp->type != GE_RENDER_COMP_TYPE_TILEMAP) {
ge_render_system_draw_basic(ctx, comp, &pos);
continue;
}
for (int y = 0; y < comp->data.tilemap.map_size.y; y++) {
for (int x = 0; x < comp->data.tilemap.map_size.x; x++, pos.x += comp->data.tilemap.tile_size) {
ge_render_component_t* tile = (comp->data.tilemap.components)
[y * comp->data.tilemap.map_size.x + x];
if (tile == NULL || tile->type == GE_RENDER_COMP_TYPE_NONE) {
continue;
}
ge_render_system_draw_basic(ctx, tile, &pos);
}
pos.x -= comp->data.tilemap.map_size.x * comp->data.tilemap.tile_size;
pos.y += comp->data.tilemap.tile_size;
}
}
}
#endif // __GE_RENDER_SYSTEM_H__