私の問題は、関数が私の望むことをしないということです。 この "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;
}
プログラムのロジックとレンダリングを区切ります。あなたのプログラムは、プログラムカウンタ、出力バッファ、およびいくつかの変数だけではなく、あなたのすべてのカードを格納するデータ構造だけで表される状態を持つべきです。私はここにはいない。ああ、おそらくこれはMVCE **ではないからです。さて、すべてのカードを描画しているだけではありません... PS:フレームごとに 'sf :: Texture :: loadFromFile'を呼びたくないかもしれません。 – LogicStuff
私は52フレームのうち1フレームを描画したいので、フレームごとにloadFromFileを呼び出す必要があります。その後、フレームごとにloadFromFileを呼び出さないで、Hを押したときにのみこのメソッドを呼び出します。 問題はdrawCard以前のテクスチャとスプライトを上書きする可能性があります)。 –
フレーム内に1つのスプライト/テクスチャ/イメージしか描画していません。フレームは最初に消去されます。 – LogicStuff