如何在不做一些改动的情况下在SFML的非固定视图中显示自定义光标?

时间:2019-03-23 22:43:24

标签: c++ sfml

我是问答网站上的新手,所以如果我做的不好,请保持警惕。

我已经使用c ++和SFML玩了几周了,以制作一个小游戏(未完成),并且我试图通过用sprite替换它来定制鼠标光标。 但是,我使用的sf :: View调整了大小,以适应全屏中不同大小的屏幕,并移动以跟随角色,因此我在wiki上找到的教程不适用于我的情况。

我决定做一些数学运算,并编写了此函数来移动光标精灵:

void MyClass::updateCursor()
{
    /*
      Moves cursor so that it goes where it should be
    */

    sf::View windowView = window.getView(); // Get window view
    sf::Vector2f viewSize = windowView.getSize(); // Get view size
    sf::Vector2f viewCenter = windowView.getCenter(); // Get view center
    sf::Vector2u windowSize = window.getSize(); // Get window size
    sf::Vector2i mousePosition = sf::Mouse::getPosition(window); // Get mouse position

    cursor_sprite.setPosition( // Set cursor sprite position to what it should be
        ((double)mousePosition.x * ((double)viewSize.x) / (double)windowSize.x) + (double)viewCenter.x - (double)viewSize.x/2.f,
        ((double)mousePosition.y * ((double)viewSize.y) / (double)windowSize.y) + (double)viewCenter.y - (double)viewSize.y/2.f
    );

    window.draw(cursor_sprite);
}

但是,这似乎有点骇人听闻,可能有些迟钝,而且,要修复移动光标精灵的错误,我必须更改此提示:

    cursor_sprite.setPosition( // Set cursor sprite position to what it should be
        ((double)mousePosition.x * ((double)viewSize.x) / (double)windowSize.x) + (double)viewCenter.x - (double)viewSize.x/2.f,
        ((double)mousePosition.y * ((double)viewSize.y) / (double)windowSize.y) + (double)viewCenter.y - (double)viewSize.y/2.f
    );

为此(请注意第二行和第三行末尾的“ -16”):

    cursor_sprite.setPosition( // Set cursor sprite position to what it should be
        ((double)mousePosition.x * ((double)viewSize.x) / (double)windowSize.x) + (double)viewCenter.x - (double)viewSize.x/2.f - 16,
        ((double)mousePosition.y * ((double)viewSize.y) / (double)windowSize.y) + (double)viewCenter.y - (double)viewSize.y/2.f - 16
    );

编辑:修复了“ -16”问题:我使用的是32x32纹理,仅右下角填充了一些像素,现在我使用16x16的纹理。

您知道使用带有某些移动和缩放视图的自定义光标精灵的方法吗?

0 个答案:

没有答案