2014-02-16 5 views
1

Im, пишущий небольшую программу на C++, используя SFML, вызывая себя и становясь более комфортным с помощью Sprites, Textures, Texts и т. Д.C++ SFML спрайт неправильный размер

Проблема, когда я нажимаю на 1 текст (Order), всплывает новое окно, которое имеет 4 строки:

Сортировать по Оставаясь Xps

Заказ по току Xps

Заказать по Current Rank

Вернуться

Моя проблема в том, что в то время как Сортировать по Current Xps показывает все спрайты нормально, как и должно быть, Приказ Remainin g 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); 
} 

код, который отображает окно (весь код, который не делает ничего с спрайтов и текстур опущен, apprart от загрузки, но загруженные текстуры все правильно)

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 еще более странно)

Спасибо за вашу помощь

ответ

1

Читая документацию scale() , он говорит, что «эта функция умножает текущий масштаб объекта, в отличие от setScale, который перезаписывает его». Возможно, вы хотите последнего.

+0

Я пробовал оба, тот же результат – Creris

Смежные вопросы