Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème lors du redimensionnement de la fenêtre.

Mes composants guis ne se placent pas bien.

Sujet résolu
    9 octobre 2020 à 16:05:31

    Bonjour, je dessine sur ma fenêtre des menus comme ceci :

    #include "../../../../include/odfaeg/Graphics/GUI/menubar.hpp"
    namespace odfaeg {
        namespace graphic {
            namespace gui {
                MenuBar::MenuBar(RenderWindow& rw) :
                    LightComponent(rw, math::Vec3f(0, 0, 0), math::Vec3f(rw.getSize().x, 20, 0), math::Vec3f(0, 0, 0), -2) {
                    rect = RectangleShape(math::Vec3f(rw.getSize().x, 20, 0));
                    background = sf::Color(50, 50, 50);
                }
                void MenuBar::addMenu(Menu* menu) {
                    unsigned int posX = rect.getPosition().x;
                    for (unsigned int i = 0; i < menus.size(); i++) {
                        posX += menus[i]->getSize().x;
                    }
                    menu->setPosition(math::Vec3f(posX, 0, 0));
                    menus.push_back(menu);
                }
                void MenuBar::clear() {
                    if (background != rect.getFillColor())
                        rect.setFillColor(background);
                }
                void MenuBar::onDraw(RenderTarget& target, RenderStates states) {
                    target.draw(rect);
                }
                void MenuBar::onEventPushed(window::IEvent event, RenderWindow& window) {
                    if (&window == &getWindow()) {
                        getListener().pushEvent(event);
                    }
                }
            }
        }
    }
    #include "../../../../include/odfaeg/Graphics/GUI/menu.hpp"
    namespace odfaeg {
        namespace graphic {
            namespace gui {
                Menu::Menu(RenderWindow& rw, const Font* font, std::string t) :
                    LightComponent(rw, math::Vec3f(0, 0, 0), math::Vec3f(t.length() * 10, 20, 0), math::Vec3f(0, 0, 0), -2)
    {
                    text.setString(t);
                    text.setCharacterSize(15);
                    text.setFont(*font);
                    text.setColor(sf::Color::Black);
                    rect = RectangleShape(getSize());
                    rect.setOutlineThickness(1);
                    rect.setOutlineColor(sf::Color::Black);
                    core::Action a (odfaeg::core::Action::MOUSE_BUTTON_PRESSED_ONCE, window::IMouse::Left);
                    core::Command menuSelected (a, core::FastDelegate<void>(&Menu::onClick, this));
                    //La fonction connect n'est pas appelée.
                    getListener().connect("MenuSelected"+t, menuSelected);
                    background = sf::Color(50, 50, 50);
                }
                void Menu::clear() {
                    if (background != rect.getFillColor())
                        rect.setFillColor(background);
                }
                void Menu::addMenuItem(MenuItem* item) {
                    unsigned int yPos = getSize().y;
                    for (unsigned int i = 0; i < items.size(); i++) {
                        yPos += items[i]->getSize().y;
                    }
                    item->setPosition(math::Vec3f(getPosition().x, yPos, 0));
                    items.push_back(item);
                }
                void Menu::setPosition(math::Vec3f position) {
                    Transformable::setPosition(position);
                    text.setPosition(position);
                    rect.setPosition(position);
                    unsigned int yPos = getSize().y;
                    for (unsigned int i = 0; i < items.size(); i++) {
                        items[i]->setPosition(math::Vec3f(position.x, yPos, position.z));
                        yPos += items[i]->getSize().y;
                    }
                }
                void Menu::onDraw(RenderTarget& target, RenderStates states) {
                    rect.setPosition(getPosition());
                    rect.setSize(getSize());
                    text.setPosition(getPosition());
                    text.setSize(getSize());
                    target.draw(rect);
                    target.draw(text);
                }
                void Menu::onClick() {
                    if (isMouseOnMenu()) {
                        for (unsigned int i = 0; i < items.size(); i++) {
                            items[i]->setVisible(true);
                            items[i]->setEventContextActivated(true);
                        }
                    } else {
                        for (unsigned int i = 0; i < items.size(); i++) {
                            items[i]->setVisible(false);
                            items[i]->setEventContextActivated(false);
                        }
                    }
                }
                bool Menu::isMouseOnMenu() {
                    physic::BoundingBox bb = getGlobalBounds();
                    math::Vec2f mousePos = math::Vec2f(window::IMouse::getPosition(getWindow()).x, window::IMouse::getPosition(getWindow()).y);
                    if (bb.isPointInside(mousePos)) {
                        return true;
                    }
                    return false;
                }
                void Menu::onEventPushed(window::IEvent event, RenderWindow& window) {
                    if (&getWindow() == &window) {
                        getListener().pushEvent(event);
                    }
                }
            }
        }
    }

    Lorsque je lance mon application les menu s'affichent bien par contre lorsque je redimensionne la fenêtre les menus se décalent à gauche si j'agrandis la fenêtre en x, à droite si je rétréci la fenêtre en x, pourtant je met bien à jour le viewport lorsque je redimensionne la fenêtre :

    if (&getRenderWindow() == window && event.type == IEvent::WINDOW_EVENT && event.window.type == IEvent::WINDOW_EVENT_RESIZED) {
            getRenderWindow().getDefaultView().reset(BoundingBox(0, 0, getRenderWindow().getDefaultView().getPosition().z, event.window.data1, event.window.data2, getRenderWindow().getDefaultView().getDepth()));
            View view = getRenderWindow().getView();
            view.reset(BoundingBox(0, 0, getRenderWindow().getView().getPosition().z, event.window.data1, event.window.data2, getRenderWindow().getView().getDepth()));
            getRenderWindow().setView(view);
        }

    Et lorsque je dessine les guis je dois bouger la vue pour que la position (0, 0) soit en haut à gauche de la fenêtre et pas au centre comme c'est le cas par défaut.

    void RenderComponentManager::drawGuiComponents() {
                std::multimap<int, std::unique_ptr<Component>, std::greater<int>>::iterator it;
                for (it = components.begin(); it != components.end(); it++) {
                    if (dynamic_cast<LightComponent*>(it->second.get()) != nullptr && it->second->isVisible()) {
                        for (unsigned int i = 0; i < windows.size(); i++) {
                            if (windows[i] == &it->second->getWindow()) {
                                windows[i]->clearDepth();
                                View view = it->second->getWindow().getView();
                                View defaultView = it->second->getWindow().getDefaultView();
                                defaultView.setCenter(math::Vec3f(it->second->getWindow().getSize().x * 0.5f, it->second->getWindow().getSize().y * 0.5f, 0));
                                it->second->getWindow().setView(defaultView);
                                it->second->getWindow().draw(*it->second.get());
                                it->second->getWindow().setView(view);
                            }
                        }
                    }
                }
            }

    Si vous voulez voir plus de code vous pouvez aller sur le dépôt git du projet :

    ici

    Voilà si quelqu'un peut m'aider merci d'avance ça fait plusieurs jours que je suis bloqué sur ce problème.

    EDIT : j'ai trouvé! Il fallait aussi changé la perspective pour remettre à jour la matrice de projection!

    if (&getRenderWindow() == window && event.type == IEvent::WINDOW_EVENT && event.window.type == IEvent::WINDOW_EVENT_RESIZED) {
            getRenderWindow().getDefaultView().reset(BoundingBox(0, 0, getRenderWindow().getDefaultView().getPosition().z, event.window.data1, event.window.data2, getRenderWindow().getDefaultView().getDepth()));
            getRenderWindow().getDefaultView().setPerspective(-event.window.data1 * 0.5f, event.window.data1 * 0.5f, -event.window.data2 * 0.5f, event.window.data2 * 0.5f, getRenderWindow().getDefaultView().getViewport().getPosition().z, getRenderWindow().getDefaultView().getViewport().getSize().z);
            View view = getRenderWindow().getView();
            view.reset(BoundingBox(0, 0, getRenderWindow().getView().getPosition().z, event.window.data1, event.window.data2, getRenderWindow().getView().getDepth()));
            view.setPerspective(-event.window.data1 * 0.5f, event.window.data1 * 0.5f, -event.window.data2 * 0.5f, event.window.data2 * 0.5f, getRenderWindow().getView().getViewport().getPosition().z, getRenderWindow().getView().getViewport().getSize().z);
            getRenderWindow().setView(view);
        }

    Résolu!



    -
    Edité par OmbreNoire 9 octobre 2020 à 16:46:11

    • Partager sur Facebook
    • Partager sur Twitter

    Problème lors du redimensionnement de la fenêtre.

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown