2017-02-16 10 views
1

私の問題は、関数が私の望むことをしないということです。 この "CreateWindow"関数にはメインループがあります。メインループでは固定の背景が必要で、Hボタンを押すたびに背景にカード(スプライト)を描きたい。 ここで問題は何ですか?私の機能はカードを描くが、Hを押すと前のカードが削除され、次のカードが描かれる。 これは、前のカードが削除されたイベントが発生するたびに(私は他のキーなどを押して、マウスを動かす)ので... 私はここにあるSFML 2.0Sfml 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(); 
} 

あなたのドローコールをします描画された方法:グラフィッククラスの私の実装、あなたのwhile(window.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

私は52フレームのうち1フ​​レームを描画したいので、フレームごとにloadFromFileを呼び出す必要があります。その後、フレームごとにloadFromFileを呼び出さないで、Hを押したときにのみこのメソッドを呼び出します。 問題はdrawCard以前のテクスチャとスプライトを上書きする可能性があります)。 –

+0

フレーム内に1つのスプライト/テクスチャ/イメージしか描画していません。フレームは最初に消去されます。 – LogicStuff

答えて

1

さてさて、あなたはこのような何かを描画する必要がありますSFMLイベントが存在する場合にのみ発生し、sfmlイベントが存在するかどうかを常に確認します(これは常にフレームごとにレンダリングする必要はなく、アニメーションを計画していません...) 。

だから、Hを押すと、あなたのカードを関数と呼ぶトリガになっていますが、あなたのカードはあなたが書いた関数のローカル変数なので、関数の最後にクリアされます。ベクトルや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; 
} 
関連する問題