【问题标题】:C++ SFML sprite wrong sizeC++ SFML sprite 大小错误
【发布时间】:2014-03-16 01:18:39
【问题描述】:

我正在使用 SFML 用 C++ 编写一个小程序,让自己变得更加自在,并且对 Sprite、纹理、文本和其他东西更加熟悉。

问题是,当我点击 1 个文本(订单)时,它会弹出一个新窗口,其中有 4 行:

按剩余 Xps 排序

按当前 Xps 排序

按当前排名排序

返回

我的问题是,虽然 Order by Current Xps 正常显示所有精灵,但 Order by Remaining Xps 和 Order by Current Rank 显示大小错误的图标。

(我注意到Total Level 图标和列表的第一个图标总是大小错误)

图片:

http://i60.tinypic.com/2n84wmc.png

按正确图像排序的列表

http://i58.tinypic.com/2agsp5f.png

如您所见,第一个图标和Total Level 旁边的图标大小错误。

列表本身已正确排序。

代码很糟糕,但这里有一些操作精灵和/或纹理的部分:

缩放功能:

void scaleSprite(int pixelsX, int pixelsY, sf::Sprite& sprite)
{
    auto tex = sprite.getTexture();
    if (!tex)    return;
    auto texSize = tex->getSize();
    auto newTexSize = sf::Vector2u(pixelsX, pixelsY);
    auto scaleX = newTexSize.x*1.00f/texSize.x;
    auto scaleY = newTexSize.y*1.00f/texSize.y;
    sprite.scale(scaleX, scaleY);
}

渲染窗口的代码(所有对精灵和纹理不做任何事情的代码都被省略了,从加载开始,但加载的纹理都是正确的)

void showWindowOrdered(std::vector<SkillData>& vec, showOption option, sf::RenderWindow& parent, sf::VideoMode vMode,\
                                                    const std::string& name, sf::Uint8 mode)
{
    sf::Font font;
    font.loadFromFile("fonts/runescape_chat_font.ttf");

    std::vector<sf::Texture> texVec;

    for(int i = 0; i < 27; ++i)
    {
        //load the textures
    }
    enFile.close();

    std::vector<sf::Sprite> sprVec;

    std::vector<sf::Text> textVec;

    for(int i = 0; i < texVec.size(); ++i)
    {
        sf::Sprite spr;
        spr.setTexture(texVec[i]);
        scaleSprite(28, 28, spr);
        spr.setPosition(1, i*28 + 1);
        sprVec.push_back(spr);
        sf::Text text;
        text.setFont(font);
        text.setColor(sf::Color::Yellow);
        text.setPosition(35, (i)*(28) + 1);
        text.setCharacterSize(25);
        textVec.push_back(text);
    }

    std::vector<sf::Text> textValVec;
    for(int i = 0; i < textVec.size(); ++i)
    {
        //...
    }

    //...

    if (option == showOption::sortXps)
    {
        //sort for showOption::sortXps
    }
    else if (option == showOption::sortRank)
    {
        //sort for showOption::sortRank
    }
    else
    {
        //sort for showOption::sortXpsRemaining
    }

    for(int i = 0; i < sorted.size(); ++i)
    {
        auto texIndex = findIndexNames(sorted[i].name);
        sprVec[i].setTexture(texVec[texIndex]);
        sprVec[i].setPosition(1, (i)*28 + 1);
    }

    //...

    sf::RenderWindow window(sf::VideoMode(offset+5, 800), "Sorted by" + s, sf::Style::Close | sf::Style::Titlebar);

    while(window.isOpen())
    {
        auto pos = sf::Mouse::getPosition(window);
        sf::Event e;
        while(window.pollEvent(e))
        {
            //...
        }
        auto bgColor = sf::Color(4, 18, 27);
        window.clear(bgColor);
        for(auto&& a : textVec)
            window.draw(a);

        for(auto&& a : textValVec)
        {
            window.draw(a);
        }

        for(auto&& a : sprVec)
            window.draw(a);

        window.draw(goBack);
        window.display();
    }
}

问题可能出在哪里?

    for(int i = 0; i < sorted.size(); ++i)
    {
        auto texIndex = findIndexNames(sorted[i].name);
        sprVec[i].setTexture(texVec[texIndex]);
        sprVec[i].setPosition(1, (i)*28 + 1);
    }

但如果没有它,我实际上无法对精灵的位置进行排序,除非手动移动它们,但列表不是确定性的

在此之前我还重新加载纹理,重新缩放精灵,它会创建相同的东西甚至更糟(Total Level 旁边的第一个精灵和精灵更奇怪)

感谢您的帮助

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    阅读scale() 的文档,它说“这个函数乘以对象的当前比例,不像setScale 覆盖它。”可能你想要后者。

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      相关资源
      最近更新 更多