sfml. наверно дело в loadfromfile
Подскажите , что не так ? выдаёт: An internal OpenGL call failed in Texture.cpp(98). Expression: glFlush() Error description: GL_INVALID_OPERATION The specified operation is not allowed in the current state. и эти картиночки не рисуются. складывается ощущение , что не так что-то с loadfromFile. может надо всё в одном файле jpg иметь и читать всё с него, меняя только параметры setTextureRect ?
#include <iostream>
#include <SFML/Graphics.hpp>
#include <vector>
const int QUESTFONTSIZE = 50;
const int TEXTFRAMHEIGHT = 150;
const int IMGPADDINGLEFT = 350;
const int BUTTONPADDINGTOP = 1200;
const float THICKNESS = 8.0f;
enum types {
square = 4, //квадрат
circle = 0, //круг
rectangle = 40, //прямоугольник
trianglei = 3, //треугольник по трем вершинам
};
struct pica {
enum types type;
int r;
float x0;
float y0;
float x1;
float y1;
float x2;
float y2;
sf::Color FillColor;
sf::Color outlineColor;
float OutlineThickness;
float angle;
float width;
float height;
};
const std::vector<pica> flower = {
{circle, 30,148,125,0,0,0,0,sf::Color(255, 96, 114) , sf::Color(0,0,0) ,THICKNESS, 2.0f },
{circle,30,21,20,0,0,0,0,sf::Color(107, 177, 0) , sf::Color(0,0,0) ,THICKNESS, 2.0f },
{circle,30,148,20,0,0,0,0,sf::Color(107, 177, 0) , sf::Color(0,0,0) ,THICKNESS, 2.0f},
{circle,30,18,125,0,0,0,0,sf::Color(181, 72, 213) , sf::Color(0,0,0) ,THICKNESS, 2.0f },
{circle,45,70,57,0,0,0,0,sf::Color(255, 220, 156) , sf::Color(0,0,0) ,THICKNESS, 2.0f },
{trianglei,10,0.0f,230.0f,80.0f,230.0f,40.0f,260.0f, sf::Color(253, 255, 5) , sf::Color(0,0,0) ,THICKNESS},
{trianglei,10,140.0f,230.0f,220.0f,230.0f,180.0f,260.0f, sf::Color(253, 255, 5) , sf::Color(0,0,0) ,THICKNESS},
{rectangle,0,105,160,0,0,0,0,sf::Color(42, 170, 205) , sf::Color(0,0,0) ,THICKNESS, 0,10,180}
};
const std::vector<pica> tree = {
{circle, 10,15,155,0,0,0,0,sf::Color(255, 96, 114) , sf::Color(0,0,0) ,THICKNESS, 2.0f },
{circle, 10,245,155,0,0,0,0,sf::Color(107, 177, 0) , sf::Color(0,0,0) ,THICKNESS, 2.0f },
{circle, 10,-45,224,0,0,0,0,sf::Color(107, 177, 0) , sf::Color(0,0,0) ,THICKNESS, 2.0f},
{circle,10,315,224,0,0,0,0,sf::Color(181, 72, 213) , sf::Color(0,0,0) ,THICKNESS, 2.0f },
{circle,10,131,10,0,0,0,0,sf::Color(255, 220, 156) , sf::Color(0,0,0) ,THICKNESS, 2.0f },
{trianglei,10,0.0f ,150.0f+60.0f,290.0f ,150.0f + 60.0f,145.50f ,90.0f + 60.0f, sf::Color(60, 255, 5) , sf::Color(0,0,0) ,THICKNESS},
{trianglei,10,50.0f ,80.0f +60.0f,230.0f ,80.0f + 60.0f,140.0f ,30.0f + 60.0f, sf::Color(60, 255, 5) , sf::Color(0,0,0) ,THICKNESS},
{trianglei,10,80.0f ,23.0f +60.0f,200.0f ,23.0f + 60.0f,140.0f ,0.0f + 40.0f, sf::Color(60, 255, 5) , sf::Color(0,0,0) ,THICKNESS},
{rectangle,0,137,100,0,0,0,0,sf::Color(42, 170, 205) , sf::Color(0,0,0) ,THICKNESS, 0,10,180}
};
class NumberButtons {
int qtyButton;
std::vector<sf::Texture> MyTexture;
std::vector<sf::Sprite> Buttons;
public:
NumberButtons(int qtyButton);
std::vector<sf::Sprite>& getButtons() { return Buttons; }
int getqtyButton() { return qtyButton; }
};
NumberButtons::NumberButtons(int qtyButton){
this->qtyButton = qtyButton;
std::string fileName;
for (int i = 1; i < qtyButton+1; i++){
MyTexture.emplace_back(sf::Texture());
Buttons.emplace_back(sf::Sprite());
fileName = "pica\\digit" + std::to_string(i) + ".jpg";
Buttons.back().setTexture(MyTexture.back());
Buttons.back().setScale(0.15f, 0.15f);
Buttons.back().setTextureRect(sf::IntRect(0, 0, 500, 500));
Buttons.back().move(i*100+305, 0);
MyTexture.back().loadFromFile(fileName);
//Buttons.back().getTexture
}
}
class SimpleImage {
int padding;
std::vector<sf::CircleShape> CircleBaseFigure;
std::vector<sf::RectangleShape> RectangleFigure;
std::vector<sf::ConvexShape> TriangleiFigure; //равнобедренный треугольник
int CircleBaseFigureQTY;
int RectangleFigureQTY;
int TriangleiBaseFigureQTY;
public: SimpleImage(const std::vector<pica> & fig, int paddingleft);
int getCircleBaseFigureQTY() { return CircleBaseFigureQTY; }
int getRectangleFigureQTY() { return RectangleFigureQTY; }
int getGetTriangleiFigureQTY() { return TriangleiBaseFigureQTY; }
std::vector<sf::CircleShape>& GetCircle() { return CircleBaseFigure; }
std::vector<sf::RectangleShape>& GetRectangleFigure() { return RectangleFigure; }
std::vector<sf::ConvexShape>& GetTriangleiFigure() { return TriangleiFigure; }
};
SimpleImage::SimpleImage(const std::vector<pica>& fig, int paddingleft) {
//(*fig)[0]
CircleBaseFigureQTY = 0; RectangleFigureQTY = 0; TriangleiBaseFigureQTY = 0;
for (int i = 0; i < fig.size(); i++)
{
switch (fig[i].type)
{
case circle: CircleBaseFigure.emplace_back(sf::CircleShape(fig[i].r)); CircleBaseFigureQTY++;
CircleBaseFigure.back().move(fig[i].x0+ paddingleft, fig[i].y0 + TEXTFRAMHEIGHT);
CircleBaseFigure.back().setFillColor(fig[i].FillColor);
CircleBaseFigure.back().setOutlineColor(fig[i].outlineColor);
CircleBaseFigure.back().setOutlineThickness(fig[i].OutlineThickness);
CircleBaseFigure.back().rotate(fig[i].angle);
break;
case trianglei: TriangleiFigure.emplace_back(sf::ConvexShape(3)); TriangleiBaseFigureQTY++;
TriangleiFigure.back().setPoint(0, sf::Vector2f(fig[i].x0 , fig[i].y0 ));
TriangleiFigure.back().setPoint(1, sf::Vector2f(fig[i].x1 , fig[i].y1 ));
TriangleiFigure.back().setPoint(2, sf::Vector2f(fig[i].x2 , fig[i].y2 ));
TriangleiFigure.back().setFillColor(fig[i].FillColor);
TriangleiFigure.back().setOutlineColor(fig[i].outlineColor);
TriangleiFigure.back().setOutlineThickness(fig[i].OutlineThickness);
TriangleiFigure.back().move(paddingleft, TEXTFRAMHEIGHT);
break;
case rectangle: RectangleFigure.emplace_back(sf::RectangleShape(sf::Vector2f(fig[i].width, fig[i].height))); RectangleFigureQTY++;
RectangleFigure.back().move(fig[i].x0 + paddingleft, fig[i].y0 + TEXTFRAMHEIGHT);
//RectangleFigure.back().move(fig[i].x + paddingleft, fig[i].y + TEXTFRAMHEIGHT);
RectangleFigure.back().setFillColor(fig[i].FillColor);
RectangleFigure.back().setOutlineColor(fig[i].outlineColor);
RectangleFigure.back().setOutlineThickness(fig[i].OutlineThickness);
RectangleFigure.back().rotate(fig[i].angle);
break;
//case trianglei: TriangleiFigure.emplace_back(sf::CircleShape(fig[i].r, 3)); CircleBaseFigureQTY++;
// CircleBaseFigure.back().move(fig[i].x + paddingleft, fig[i].y + TEXTFRAMHEIGHT);
// CircleBaseFigure.back().setFillColor(fig[i].FillColor);
// CircleBaseFigure.back().setOutlineColor(fig[i].outlineColor);
// CircleBaseFigure.back().setOutlineThickness(fig[i].OutlineThickness);
// CircleBaseFigure.back().rotate(fig[i].angle);
// break;
default:
break;
}
}
}
class TextFrameBase {
int size;//размер шрифта
std::string question;
sf::Text text;
sf::Font font;//шрифт
public:
TextFrameBase(int size,const wchar_t* quest) ;
sf::Text gettext(){ return text; }
};
TextFrameBase::TextFrameBase(int size, const wchar_t* quest) {
this->size = size;
font.loadFromFile("Arial_Narrow.ttf");
text = sf::Text("", font, size);
text.setFillColor(sf::Color::Black);
text.setString(quest);
text.setPosition(10, 10);
}
class Window {
static bool first;
sf::RenderWindow* window; //сам экран
int width; //ширина
int height; //высота экрана
int space;
int number; //номер вопроса
TextFrameBase textFrame;
SimpleImage img1;
SimpleImage img2;
NumberButtons Buttons;
public: Window(int w, int h , const wchar_t* quest, const std::vector<pica>& fig1, const std::vector<pica>& fig2, int qtyButtons ) : width(w), height(h), textFrame(QUESTFONTSIZE, quest), img1(fig1,30), img2(fig2, IMGPADDINGLEFT), Buttons(qtyButtons){
sf::RectangleShape List(sf::Vector2f(width, height));
List.setPosition(0, 0);
List.setFillColor(sf::Color::White);
if (!first) {
window = new sf::RenderWindow(sf::VideoMode(w, h), "Game");
first = true;
}
while (window->isOpen()) {
sf::Event event;
while (window->pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window->close();
}
}
window->clear();
window->draw(List);
window->draw(textFrame.gettext());
int cQTY1 = img1.getCircleBaseFigureQTY();
std::vector<sf::CircleShape>& C1 = img1.GetCircle();
for (int i = 0; i < cQTY1; i++)
window->draw(C1[i]);
std::vector<sf::RectangleShape>& R1 = img1.GetRectangleFigure();
int rQTY1 = img1.getRectangleFigureQTY();
for (int i = 0; i < rQTY1; i++)
window->draw(R1[i]);
int tQTY1 = img1.getGetTriangleiFigureQTY();
std::vector<sf::ConvexShape> G1 = img1.GetTriangleiFigure();
for (int i = 0; i < tQTY1; i++)
window->draw(G1[i]);
std::vector<sf::CircleShape>& C2 = img2.GetCircle();
int cQTY2 = img2.getCircleBaseFigureQTY();
for (int i = 0; i < cQTY2; i++)
window->draw(C2[i]);
int rQTY2 = img2.getRectangleFigureQTY();
std::vector<sf::RectangleShape>& R2 = img2.GetRectangleFigure();
for (int i = 0; i < rQTY2; i++)
window->draw(R2[i]);
int tQTY2 = img2.getGetTriangleiFigureQTY();
std::vector<sf::ConvexShape> G2 = img2.GetTriangleiFigure();
for (int i = 0; i < tQTY2; i++)
window->draw(G2[i]);
std::vector<sf::Sprite> &B = Buttons.getButtons();
for (int i = 0; i < Buttons.getqtyButton(); i++)
window->draw(B[i]);
//window->draw(Buttons.getButtons()[i]);
window->display();
}
}
};
bool Window::first = false;
class QuestionBase {
TextFrameBase txt;
};
int main(int count, char** arr) {
Window w(1280, 752,L"testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest", flower,tree,10);
}