2017-02-16 2 views
1

Моя проблема в том, что функция не делает то, что я хочу. Эта функция «CreateWindow» имеет основной цикл. В основном цикле я хочу фиксированный фон, и каждый раз, когда я нажимаю кнопку H, я хочу нарисовать карту (спрайт) на фоне. В чем проблема? Моя функция рисует карты, но когда я нажимаю H, предыдущая карта удаляется, а следующая карта рисуется. Это что-то об этом событии, я думаю, потому что каждый раз, когда происходит событие (я двигаю мышь, я нажать на другую клавишу и т.д.) предыдущая карта удаляется ... Я использую SFML 2.0Sfml pollEvent, каждое новое изображение удаляет предыдущий

Вот моя реализация графического класса

#include "Graphic.h" 
#include "SFML/Graphics.hpp" 
#include <iostream> 
#include <string> 
#include "Card.h" 
#include <string> 
#include <sstream> 

Graphic::Graphic(int offset) 
{ 
    this->offset = offset; 
} 

Graphic::~Graphic() 
{ 
    //dtor 
} 

int Graphic::CreateWindow(sf::RenderWindow& window, Deck &deck0) 
{ 
    sf::Vector2i screenDimensions(800, 600); 

    //Dimensioni della window 
    window.create(sf::VideoMode(screenDimensions.x, screenDimensions.y), "BlackJack", sf::Style::Titlebar | sf::Style::Close); 

    int index = 0; 
    window.setKeyRepeatEnabled(false); 

    //settare il background 
    sf::Texture bTexture; 
    sf::Sprite bImage; 
    if(!bTexture.loadFromFile("Background.png")) 
     std::cout << "Error" << std::endl; 
    bImage.setTexture(bTexture); 
    bImage.setScale(1.0, (float)screenDimensions.y/bTexture.getSize().y); 

    //MAIN LOOP---------------------- 
    while(window.isOpen()) 
    { 
     sf::Event Event; 

     while(window.pollEvent(Event)) 
     { 
      window.clear(); 
      window.draw(bImage); // this is the function which draw the background 

      if (Event.type == sf::Event::Closed) 
      { 
       window.close(); 
      } 

      if(Event.key.code == sf::Keyboard::H) 
      { 

       Card * y = deck0.dealFirst(); 
       drawCard(window,y->graphNumber,y->getSeed(),offset); 
       offset = offset + 50; 
      } 

      window.display(); 

     } 
    } 
} 

int Graphic::drawCard(sf::RenderWindow &window, int graphNumber, string seed, int offset) 
{ 
    std::ostringstream oss; 
    oss << graphNumber << seed << ".png"; 
    std::string var = oss.str(); 

    sf::Texture QHTexture; 
    sf::Sprite QHImage; 
    if(!QHTexture.loadFromFile(var)) 
     std::cout<< "Error" <<std::endl; 
    QHImage.setTexture(QHTexture); 
    QHImage.setScale(0.5, 0.5); 
    QHImage.setPosition(offset + 100, 400); 
    window.draw(QHImage); //this is the function which draw the card's sprite 
    return 0; 
} 
+0

Отделить логику программы и ее визуализацию. Ваша программа должна иметь состояние, не представленное только программным счетчиком, выходным буфером и некоторыми переменными, а структурой данных, которая хранит все ваши карты. Я не вижу этого здесь. О да, наверное, потому что это не ** MVCE **. Итак, вы просто не рисуете все карты ... PS: вы можете не называть 'sf :: Texture :: loadFromFile' каждый кадр. – LogicStuff

+0

Я хочу вызвать loadFromFile каждый кадр, потому что я хочу нарисовать одно из 52 изображений, а затем я не вызываю loadFromFile, но я вызываю этот метод только тогда, когда я нажимаю H. Я думаю, что проблема должна быть в drawCard (), потому что, возможно, я перезаписываю предыдущую текстуру и спрайт. –

+0

Вы рисуете только один спрайт/текстуру/изображение в кадре. Рамка очищается в начале. – LogicStuff

ответ

1

Alright вы не должны быть рисунок внутри вашего while(window.pollEvent()) цикла, вы должны рисовать что-то вроде этого:

while(window.isOpen()) 
    { 
    sf::Event Event; 
    while(window.pollEvent(Event)) 
    { 
     if (Event.type == sf::Event::Closed) 
     { 
      window.close(); 
     } 

     if(Event.key.code == sf::Keyboard::H) 
     { 

      Card * y = deck0.dealFirst(); 
      drawCard(window,y->graphNumber,y->getSeed(),offset); 
      offset = offset + 50; 
     } 
    } 

    window.clear(); 
    window.draw(bImage); // this is the function which draw the background 

    window.display(); 
} 

, как вы рисовали свой вызов отрисовки будет произойдет только в случае SFML-события и будет только когда-либо очищаться, если есть событие sfml (это нормально, если вы не хотите, чтобы он постоянно отображал каждый кадр ... и не планировал никаких анимаций ...) ,

Итак, когда вы нажимаете H, событие sfml было триггерами, которые называли вашу функцию карты розыгрыша, однако, поскольку ваша карта является локальной переменной для функции, которую вы написали, в конце функции она очищается. Вам нужно хранить карты где-нибудь, например, вектор или список sf :: Sprite. Таким примером может служить:

#include "Graphic.h" 
#include "SFML/Graphics.hpp" 
#include <iostream> 
#include <string> 
#include "Card.h" 
#include <string> 
#include <sstream> 

Graphic::Graphic(int offset) 
{ 
    this->offset = offset; 
} 

Graphic::~Graphic() 
{ 
    //dtor 
} 

int Graphic::CreateWindow(sf::RenderWindow& window, Deck &deck0) 
{ 
    sf::Vector2i screenDimensions(800, 600); 

    //Dimensioni della window 
    window.create(sf::VideoMode(screenDimensions.x, screenDimensions.y), "BlackJack", sf::Style::Titlebar | sf::Style::Close); 

    int index = 0; 
    window.setKeyRepeatEnabled(false); 

    //settare il background 
    sf::Texture bTexture; 
    sf::Sprite bImage; 
    if(!bTexture.loadFromFile("Background.png")) 
     std::cout << "Error" << std::endl; 
    bImage.setTexture(bTexture); 
    bImage.setScale(1.0, (float)screenDimensions.y/bTexture.getSize().y); 

    //MAIN LOOP---------------------- 
     while(window.isOpen()) 
    { 
    sf::Event Event; 
    while(window.pollEvent(Event)) 
    { 
     if (Event.type == sf::Event::Closed) 
     { 
      window.close(); 
     } 

     if(Event.key.code == sf::Keyboard::H) 
     { 

      Card * y = deck0.dealFirst(); 
      drawCard(window,y->graphNumber,y->getSeed(),offset); 
      offset = offset + 50; 
     } 
    } 

    window.clear(); 
    window.draw(bImage); // this is the function which draw the background 

    for(int i = 0; i < cardList.size(); ++i) 
    { 
     window.draw(cardList[i]); 
    } 

    window.display(); 
    } 

} 

int Graphic::drawCard(sf::RenderWindow &window, int graphNumber, string seed, int offset) 
{ 
    std::ostringstream oss; 
    oss << graphNumber << seed << ".png"; 
    std::string var = oss.str(); 

    sf::Texture QHTexture; 
    sf::Sprite QHImage; 
    if(!QHTexture.loadFromFile(var)) 
     std::cout<< "Error" <<std::endl; 
    QHImage.setTexture(QHTexture); 
    QHImage.setScale(0.5, 0.5); 
    QHImage.setPosition(offset + 100, 400); 
    cardList.push_back(QHImage); //this adds the sprite to our list 
    return 0; 
} 
Смежные вопросы