Ostatnio zabrałem się za projekt z c++. Mianowicie mam zrobić grę i wpadłem na pomysł żeby zrobić coś na kształt quizu. Jako że pierwszy raz mam styczność z biblioteką SFML a i z c++ przygodę zacząłem nie dawno trochę średnio mi to idzie. Mam nadzieję że trafiłem na odpowiednie forum i ktoś chociaż wyhaczy kilka błędów które popełniam.
Więc zacznę od opisania jak to mniej więcej ma działać.
Funkcja "bool klik" zwraca true jak kliknę na sprita(chodzi o wybór odpowiedzi przy pytaniu w quizie)
Metoda wczytaj wczytuje pytania z pliku txt(które są ułożone tak, że najpierw jest treść pytania, potem 4 odpowiedzi i opodwiedź prawidłowa i potem schemat się powtarza, jest w sumie 5 pytań) i zapisuje poszczególne linijki do zmiennych w klasie.
Metoda sprawdz sprawdza czy podana odpowiedź jest zgodna z tą poprawną.
Potem w mainie deklaruję wszystkie potrzebne przyciski.
I problem (tak mi się przynajmniej wydaje) zaczyna się w pętli for, gdzie próbuję wczytać pytania, wyświetlić je i sprawdzić czy wybrana przyciskiem odpowiedź (litera A,B,C,D w spricie) jest zgodna z prawidłową.
Pętla for od razu przelatuje mi 5 razy, nie potrafię jej zatrzymać aż do kliknięcia w przycisk odpowiedzi, tak, żeby tekst z pytaniem i odpowiedziami cały czas był wyświetlony na ekranie. Jeśli ktoś znajdzie jakikolwiek błąd będę naprawdę bardzo wdzięczny, a wiem że błędów może być masa.Jeśli źle sformułowałem jakieś pytanie piszcie, postaram się jak najszybciej doprecyzować o co mi dokładnie chodzi.
#include "SFML\Graphics.hpp"
#include <SFML/Audio.hpp>
#include <iostream>
#include <cmath>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;
bool klik( sf::Sprite & av_Sprite, sf::RenderWindow & av_Window )
{
int mouseX = sf::Mouse::getPosition().x;
int mouseY = sf::Mouse::getPosition().y;
sf::Vector2i windowPosition = av_Window.getPosition();
if( mouseX > av_Sprite.getPosition().x + windowPosition.x && mouseX <( av_Sprite.getPosition().x + av_Sprite.getGlobalBounds().width + windowPosition.x )
&& mouseY > av_Sprite.getPosition().y + windowPosition.y + 30 && mouseY <( av_Sprite.getPosition().y + av_Sprite.getGlobalBounds().height + windowPosition.y + 30 ) )
{
if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
{
return true;
}
return false;
}
return false;
}
class Pytanie
{
public:
string tresc;
string a, b, c, d;
int nr_pytania;
string poprawna;
string odpowiedz;
int punkt;
void wczytaj();
void sprawdz();
};
void Pytanie::wczytaj()
{
fstream plik;
plik.open( "quiz.txt", ios::in );
if( plik.good() == false )
{
cout << "Blad otwarcia pliku";
exit( 0 );
}
int nr_linii =( nr_pytania - 1 ) * 6 + 1;
int aktualny_nr = 1;
string linia;
while( getline( plik, linia ) )
{
if( aktualny_nr == nr_linii ) tresc = linia;
if( aktualny_nr == nr_linii + 1 ) a = linia;
if( aktualny_nr == nr_linii + 2 ) b = linia;
if( aktualny_nr == nr_linii + 3 ) c = linia;
if( aktualny_nr == nr_linii + 4 ) d = linia;
if( aktualny_nr == nr_linii + 5 ) poprawna = linia;
aktualny_nr++;
}
plik.close();
}
void Pytanie::sprawdz()
{
if( odpowiedz == poprawna )
{
punkt = 1;
}
else punkt = 0;
}
int main()
{
sf::RenderWindow window( sf::VideoMode( 800, 600 ), "QUIZ v1.0" );
sf::Font font;
if( !font.loadFromFile( "UnrealT.ttf" ) ) {
cout << "nie zaladowano czcionki\n";
}
sf::Texture przycisk1;
if( !przycisk1.loadFromFile( "A.png" ) ) {
}
sf::Texture przycisk2;
if( !przycisk2.loadFromFile( "B.png" ) ) {
}
sf::Texture przycisk3;
if( !przycisk3.loadFromFile( "C.png" ) ) {
}
sf::Texture przycisk4;
if( !przycisk4.loadFromFile( "D.png" ) ) {
}
sf::Sprite przycisk11;
przycisk11.setTexture( przycisk1 );
sf::Sprite przycisk22;
przycisk22.setTexture( przycisk2 );
sf::Sprite przycisk33;
przycisk33.setTexture( przycisk3 );
sf::Sprite przycisk44;
przycisk44.setTexture( przycisk4 );
przycisk11.setPosition( sf::Vector2f( 50, 400 ) );
przycisk22.setPosition( sf::Vector2f( 200, 400 ) );
przycisk33.setPosition( sf::Vector2f( 350, 400 ) );
przycisk44.setPosition( sf::Vector2f( 550, 400 ) );
sf::String tresc;
sf::String odpa;
sf::String odpb;
sf::String odpc;
sf::String odpd;
Pytanie p[ 5 ];
int suma = 0;
string sumastring;
sumastring = to_string( suma );
sf::String wynik;
sf::Text wynik1( sumastring, font, 30 );
wynik1.setPosition( sf::Vector2f( 620, 400 ) );
for( int i = 0; i < 5; i++ )
{
while(( klik( przycisk11, window ) == true ) ||( klik( przycisk22, window ) == true ) ||( klik( przycisk33, window ) == true ) ||( klik( przycisk44, window ) == true ) )
{
p[ i ].nr_pytania = i + 1;
p[ i ].wczytaj();
sf::Text text1( p[ i ].tresc, font, 30 );
sf::Text text2( p[ i ].a, font, 30 );
sf::Text text3( p[ i ].b, font, 30 );
sf::Text text4( p[ i ].c, font, 30 );
sf::Text text5( p[ i ].d, font, 30 );
text1.setPosition( sf::Vector2f( 20, 20 ) );
text2.setPosition( sf::Vector2f( 20, 60 ) );
text3.setPosition( sf::Vector2f( 20, 100 ) );
text4.setPosition( sf::Vector2f( 20, 140 ) );
text5.setPosition( sf::Vector2f( 20, 180 ) );
text1.setColor( sf::Color::Black );
text2.setColor( sf::Color::Black );
text3.setColor( sf::Color::Black );
text4.setColor( sf::Color::Black );
text5.setColor( sf::Color::Black );
text1.setString( p[ i ].tresc );
text2.setString( p[ i ].a );
text3.setString( p[ i ].b );
text4.setString( p[ i ].c );
text5.setString( p[ i ].d );
window.draw( text1 );
window.draw( text2 );
window.draw( text3 );
window.draw( text4 );
window.draw( text5 );
if( klik( przycisk11, window ) == true )
{
p[ i ].odpowiedz = p[ i ].a;
}
else if( klik( przycisk22, window ) == true )
{
p[ i ].odpowiedz = p[ i ].b;
}
else if( klik( przycisk33, window ) == true )
{
p[ i ].odpowiedz = p[ i ].c;
}
else if( klik( przycisk44, window ) == true )
{
p[ i ].odpowiedz = p[ i ].d;
}
p[ i ].sprawdz();
suma += p[ i ].punkt;
i++;
}
}
while( window.isOpen() )
{
sf::Event Event;
while( window.pollEvent( Event ) )
{
switch( Event.type )
{
case sf::Event::Closed:
window.close();
break;
}
}
window.clear( sf::Color( 200, 200, 200 ) );
window.draw( przycisk11 );
window.draw( przycisk22 );
window.draw( przycisk33 );
window.draw( przycisk44 );
window.draw( wynik1 );
window.display();
}
}