Bonjour,
J'ai voulu créer une mini-API pour faire de la GUI avec la SFML mais je me heurte avec l'argument 'style' du constructeur de sf::Window...
L'idée était de passer le paramètre à ma classe absWindow qui ensuite le transmettait à une sf::RenderWindow member. Seulement quand j'essaie de mettre un uint32 en paramètre, j'obtiens : error : 'Uint32' has not been declared.
J'ai essayé de le remplacer par un uint32_t mais là j'ai eu ça :
Arf.
Premièrement : sf::Style : une énumération anonyme ?! Pourquoi ? Je n'ai jamais compris l'intérêt de ces trucs. Quelqu'un peut me l'expliquer svp ?
Deuxièmement : comment passer ce...heu...(bah ça a pas de nom du coup) style en paramètre ?
OS : Windows 8.1 x64
IDE : Code::Blocks 13.12
Compilo : GCC 4.7.1
Le code :
absWindow.h
#ifndef ABSWINDOW_H
#define ABSWINDOW_H
#include <SFML/Graphics.hpp>
#include<functional>
#include <string>
#include <vector>
#include <stdexcept>
#include <iostream>
#include "ButtonsList.h"
namespace glan
{
class absWindow : sf::NonCopyable
{
friend class Button;
public:
absWindow(bool destrDeleteButtons = true, \
int x = 600, int y = 800, std::string const& title = "Window", uint32_t style = sf::Style::Default, sf::ContextSettings const& settings=sf::ContextSettings());
// Arguments :
//
// x : the height of the window.
//
// y : the width of the window.
//
// title : the title shown in the title bar of the window.
//
// destrDeleteButtons : sets deleteButtons, which defines if the destructor deletes the buttons of the 'buttons' member.
absWindow(bool destrDeleteButtons = true, \
sf::VideoMode const& videoMode = sf::VideoMode(800,600), std::string const& title = "Window", uint32_t = sf::Style::Default, sf::ContextSettings const& settings=sf::ContextSettings());
// Arguments :
//
// videoMode : the video mode of the window.
//
// title : the title shown in the title bar of the window.
//
// destrDeleteButtons : sets deleteButtons, which defines if the destructor deletes the buttons of the 'buttons' member.
virtual ~absWindow() = 0;
// Destructor. If 'resetRect' member is true, deletes all glan::Button in 'buttons' member.
virtual void show();
// Shows the window.
void useBtnsVect(int i = -1);
// Sets 'btnsVectShown' member at 'i'.
void close();
// Closes the window and destroys this.
virtual void update();
// Should call updateButtons().
protected:
void updateButtons();
// Drawn all buttons contained in 'buttons' member at(btnsVectShown), excepts these which are hidden. If buttons[btnsVectShown] is out of range, no button is
bool deleteButtons;
int btnsVectShown;
std::vector<ButtonsList> buttonsLists;
sf::RenderWindow window;
sf::Event event;
};
} // namespace glan
#endif // ABSWINDOW_H
absWindow.cpp :
#include "absWindow.h"
using namespace glan;
absWindow::absWindow(bool destrDeleteButtons, int x, int y, std::string const& title, uint32_t style, sf::ContextSettings const& settings) :
deleteButtons(destrDeleteButtons), btnsVectShown(-1), buttonsLists(), \
window(sf::VideoMode(x, y), title, style, settings)
{
window.setVisible(false);
}
absWindow::absWindow(bool destrDeleteButtons, sf::VideoMode const& videoMode, std::string const& title, uint32_t style, sf::ContextSettings const& settings) :
deleteButtons(destrDeleteButtons), btnsVectShown(-1), buttonsLists(), window(videoMode, title, style, settings), event()
{
window.setVisible(false);
}
absWindow::~absWindow()
{
if(deleteButtons)
{
for(int i(0) ; i < (int)buttonsLists.size() ; i++)
buttonsLists[i].clear();
}
}
void absWindow::show()
{
window.setVisible(false);
while(window.isOpen())
{
update();
while(window.pollEvent(event))
{
update();
if(event.type == sf::Event::Closed)
window.close();
}
}
}
void absWindow::close()
{
window.close();
delete this;
}
void absWindow::update()
{
window.clear();
updateButtons();
// Other drawings...
window.display();
}
void absWindow::updateButtons()
{
ButtonsList temp;
try
{
temp=buttonsLists.at(btnsVectShown);
}
catch (std::out_of_range const& expt)
{
std::cerr<<expt.what()<<std::endl<<"absWindow.cpp::updateButtons()"<<std::endl;
return;
}
for(int i(0) ; i < (int)temp.size() ; i++)
{
if(temp[i] != nullptr)
{
if(temp[i]->isEnabled())
temp[i]->checkClicked(event, window);
if(!temp[i]->isHidden())
window.draw(*temp[i]);
}
}
}
Je n'ai pas mis les fichiers de Button et ButtonsList, ça ne me semble pas nécessaire.
Merci d'avance.