Что это?
- библиотека графической сцены на базе SDL1.2 или SDL2
А попроще?
- просто создаем объекты Window, и при этом, не вдаваясь во все внутренние подробности библиотеки SDL, наша сцена DisplayScene автоматически
обрабатывает все нужные события и доносит их до получателей
Что такое Window?
- Window это базовый графической примитив, который можно поместить на сцену DisplayScene.
он не содержит каких либо текстур спрайтов, это простейшая невидимая область Rect на сцене DisplayScene
class Window : public SignalMember
{
Rect gfxpos;
Window* parent;
BitFlags state;
int result;
};
Как начать?
- инициализируем графическую сцену
SWE::Engine::init();
SWE::Display::init(std::string title,
SWE::Size geometry);
- создаем базовый объект Window на всю доступную область, это первый элемент сцены, все последующие элементы будут потомками от него
{
protected:
bool mouseMotionEvent(
const SWE::Point & pos, u32 buttons)
override {
VERBOSE("mouse coord: " << pos.toString());
return true;
}
{
if(key.keycode() == Key::ESCAPE)
{
setVisible(false);
return true;
}
return false;
}
public:
{
setVisible(true);
}
void renderWindow(void) override
{
renderClear(SWE::Color::Gray);
}
};
- переопределяем нужные виртуальные функции
bool userEvent(int event, void* data) override;
void tickEvent(u32 ms) override;
void windowCreateEvent(void);
bool textInputEvent(const std::string & str);
void mouseFocusEvent(void);
void mouseLeaveEvent(void);
void mouseTrackingEvent(
const SWE::Point & pos, u32 buttons);
bool mouseMotionEvent(
const SWE::Point & pos, u32 buttons);
bool scrollUpEvent(void);
bool scrollDownEvent(void);
- минимальные требования для получения events это иметь размерность и определить видимость
void Window::setVisible(true);
- Для того чтобы его увидеть на сцене не забываем про основной код отрисовки объекта
void renderWindow(void) override
{
}
- создаем множество других объектов, с родителем MainWindow
{
protected:
void mouseFocusEvent(void) override
{
VERBOSE("focused!");
}
public:
{
setPosition(pos);
setModality(false);
setVisible(true);
}
void renderWindow(void) override
{
renderClear(SWE::Color::Red);
}
};
{
protected:
{
auto dsz = SWE::Display::size();
setPosition(SWE::Tools::rand(0, dsz.w - width()), SWE::Tools::rand(0, dsz.h - height()));
}
public:
HaosWindow(
const std::string & file,
SWE::Window & parent) :
SWE::Window(& parent)
{
sprite = SWE::Display::createTexture(file);
setSize(sprite.size());
setModality(false);
setVisible(true);
}
void renderWindow(void) override
{
}
};
- стартует сцена очень просто
MainWindow1 win1;
int result = win1.exec();
if(2 == result)
{
MainWindow2().exec();
}
else
{
MainWindow3().exec();
}
- для большего ознакомления см examples
- examples\test_fps - тест fps рендера 5000 спрайтов
- examples\test_gui - пример построения простейших элементов GUI
- examples\test_term_gui - пример графического терминала, возможности
- examples\test_term_cmd - пример графического терминала, файловый браузер