A small game engine for 2D games based of Raylib
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

61 linhas
1.9 KiB

#include <iostream>
#include "components/panel_component.h"
#include "entity.h"
#include "raylib.h"
#include "render_state.h"
ant::components::ui::panel_component::panel_component(
int layer,
Color color,
ant::core::Vec2<> size,
ant::core::Vec2<> scale
)
: m_layer(layer)
, m_size(size)
, m_scale(scale)
, m_color(color)
{}
void ant::components::ui::panel_component::initialize() {
auto parent = owner()->parent();
while(parent) {
if(auto panels = parent->find_components("panel_component"); not panels.empty()) {
m_parent_panel = dynamic_pointer_cast<panel_component>(panels.front());
break;
}
parent = parent->parent();
}
}
ant::core::Vec2<> ant::components::ui::panel_component::scale() {
if(auto parent = m_parent_panel.lock(); parent) {
return parent->scale()*m_scale;
}
return m_scale;
}
void ant::components::ui::panel_component::render() {
auto pos = (*owner()).world_transform().position;
auto size = m_size*scale();
auto layer = [&]()-> float {
if(auto panel = m_parent_panel.lock()) {
auto parent_layer = -panel->m_layer;
auto bottom = static_cast<float>(std::floor(parent_layer));
auto climb = static_cast<float>(parent_layer) - bottom;
return -(bottom + 1 - (1 - climb) / 2);
}
return static_cast<float>(m_layer);
}();
auto color = m_color;
// TODO: add a warning for drawing a big panel in a smaller panel
ant::render::schedule_in_frame(layer, [pos, size, color] () {
std::cout << pos.X << " " << pos.Y << " " << size.X << " " << size.Y << " | " << (int)color.r << " " << (int)color.g << " " << (int)color.b << std::endl;
DrawRectangle(pos.X, pos.Y, size.X, size.Y, color);
});
}
void ant::components::ui::panel_component::update(std::chrono::duration<double>) {
}