Моя проблема в том, что функция не делает то, что я хочу. Эта функция «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;
}
Отделить логику программы и ее визуализацию. Ваша программа должна иметь состояние, не представленное только программным счетчиком, выходным буфером и некоторыми переменными, а структурой данных, которая хранит все ваши карты. Я не вижу этого здесь. О да, наверное, потому что это не ** MVCE **. Итак, вы просто не рисуете все карты ... PS: вы можете не называть 'sf :: Texture :: loadFromFile' каждый кадр. – LogicStuff
Я хочу вызвать loadFromFile каждый кадр, потому что я хочу нарисовать одно из 52 изображений, а затем я не вызываю loadFromFile, но я вызываю этот метод только тогда, когда я нажимаю H. Я думаю, что проблема должна быть в drawCard (), потому что, возможно, я перезаписываю предыдущую текстуру и спрайт. –
Вы рисуете только один спрайт/текстуру/изображение в кадре. Рамка очищается в начале. – LogicStuff