Sfml pollEvent,每个新图像都删除前一个图像

时间:2017-02-16 15:16:32

标签: c++ sfml polling

我的问题是该功能没有做我想要的。 这个“CreateWindow”函数有主循环。在主循环中我想要一个固定的背景,每次按下H按钮,我想在背景上画一张卡片(精灵)。 这有什么问题?我的功能是绘制卡片,但是当我按下H时,前一张卡片被删除,下一张卡片被绘制出来。 这是关于我认为的事件,因为每次事件发生时(我移动鼠标,我按另一个键等),前一张卡被删除... 我正在使用sfml 2.0

这是我对Graphic类的实现

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

1 个答案:

答案 0 :(得分:1)

好吧你不应该在你的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(); } 循环中画画,你应该画这样的东西:

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

绘制绘图调用的方式只会在有SFML事件的情况下发生,并且只有在有sfml事件时才会清除(如果您不希望它不断渲染每一帧,那就没问题了......不计划任何动画......)。

所以当你点击H时,sfml事件就是调用你的绘图卡函数的触发器,但是因为你的卡是你编写的函数的局部变量,所以在函数结束时它被清除掉了。您需要将卡存储在某处,例如矢量或sf :: Sprite列表。所以一个例子是:

exists