0

最初に言っておきたいのは、タイトルが適切かどうかはわかりませんが、それが唯一の論理的な説明です。

私がやろうとしているのは、スプライトをクリックしてウィンドウを移動することです (タイトルバーをシミュレートするようなものです)。マウスボタンを離すまで、すべて正常に動作し、新しいマウスイベントが発行される速度ははるかに低く、その間に1.5〜2秒の大きな一時停止があります。

sf::Mouse::isBUttonPressed がキューをいっぱいにしている可能性はありますか、それとも別の問題ですか?

編集: ウィンドウ クラスには sf::Event オブジェクトがあり、それを各オブジェクトのイベント ハンドラに渡します。スプライト クラスには、次の形式のイベント ハンドラがあります。

bool object::handleEvents(sf::Event& event)
{
    switch(event.type)
    {
        case sf::Event::MouseMoved:
        case sf::Event::MouseButtonPressed:
        case sf::Event::MouseButtonReleased:
        {
            auto mouse_pos = sf::Mouse::getPosition(*this->parent);

            if(this->isPointInside(mouse_pos))
            {
                if(event.type == sf::Event::MouseMoved)
                {
                    this->hovering = true;

                    if(this->callback["onHover"])
                        this->callback["onHover"](this, nullptr);

                    return true;
                }
                else if(event.type == sf::Event::MouseButtonPressed)
                {
                    this->clicked = true;
                    this->focused = true;

                    if(event.mouseButton.button == sf::Mouse::Left)
                        if(this->callback["onLClick"])
                            this->callback["onLClick"](this, ref(mouse_pos));

                    if(event.mouseButton.button == sf::Mouse::Right)
                        if(this->callback["onRClick"])
                            this->callback["onRClick"](this, ref(mouse_pos));

                    return true;
                }
                else if(event.type == sf::Event::MouseButtonReleased && this->clicked)
                  {
                        this->clicked = false;

                        if(event.mouseButton.button == sf::Mouse::Left)
                            if(this->callback["onLClickReleased"])
                                this->callback["onLClickReleased"](this, ref(mouse_pos));

                        if(event.mouseButton.button == sf::Mouse::Right)
                            if(this->callback["onRClickReleased"])
                                this->callback["onRClickReleased"](this, ref(mouse_pos));

                        return true;
                  }
                }
            else
            {
                if(this->hovering)
                {
                    if(this->callback["onHoverLost"])
                        this->callback["onHoverLost"](this, nullptr);
                    this->hovering = false;
                }
            }
        }break;

        default: ;
    }
    return false;
}

ウィンドウの移動を担当するコード:

titlebar->callback["onLClick"] = [&](object* obj, void* data)
{
    sf::Vector2i* relpos = (sf::Vector2i*)(data);
    while(sf::Mouse::isButtonPressed(sf::Mouse::Left))
    {
        sf::Vector2i abspos = sf::Mouse::getPosition();
        window.setPosition(sf::Vector2i((abspos.x - relpos->x),(abspos.y - relpos->y)));
    }
    titlebar->clicked = false;
};
4

1 に答える 1

0

sf::Mouseクラスとイベントシステムには接続されsf::Keyboardていませんが、完全に独立しているため、イベントに影響を与えることはsf::Joystick不可能です。isButtonPressed

コードの本当の問題は、マウスの左ボタンが押されたときの「無限」ループです。マウスの左ボタンを押すと、アプリケーションで発生することはすべて、ウィンドウが移動することです。イベントのディスパッチ(=処理)は発生せず、その時間内に発生するすべてのイベントは、イベントキューにピルされます。したがって、イベントの処理に戻ると、通常よりもキューが長くなり、最も古いイベントでディスパッチが開始されます。したがって、ウィンドウを2秒間移動すると、2秒に相当するキューがいっぱいになり、それ以降の処理が遅れる可能性があります。

この問題を解決するには、ウィンドウを移動している間にすべてのイベントをディスパッチする必要があります。

于 2013-02-13T04:11:24.750 に答える