gpt4 book ai didi

C++ SFML Sprite 大小错误

转载 作者:太空宇宙 更新时间:2023-11-04 11:39:37 24 4
gpt4 key购买 nike

我正在使用 SFML 在 C++ 中编写一个小程序,锻炼自己并越来越熟悉 Sprites、纹理、文本和其他东西。

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

按剩余 Xps 排序

按当前 Xps 排序

按当前排名排序

返回

我的问题是,虽然按当前 Xps 排序可以正常显示所有 Sprite ,但按剩余 Xps 排序和按当前等级排序显示的图标尺寸错误。

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

图像:

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

按正确图片排序的列表

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

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

列表本身已正确排序。

代码很糟糕,但这里是操纵 Sprite 和/或纹理的部分:

缩放函数:

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);
}

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

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);
}

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

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

谢谢你的帮助

最佳答案

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

关于C++ SFML Sprite 大小错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21817316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com