[SFML 2.1] Szalejący licznik
Ostatnio zmodyfikowano 2013-09-21 11:11
Cielak Temat założony przez niniejszego użytkownika |
[SFML 2.1] Szalejący licznik » 2013-09-21 10:42:32 Witam ! Od wczoraj piszę prostą grę w kółko i krzyżyk, wszystko szło dość gładko i sprawnie, lecz nie jestem w stanie poradzić sobie z dość trywialną rzeczą. Mianowicie w przypadku wykrycia przez komputer wygranej,licznik zamiast po prostu dodać jeden punkt, nabija punkty w zastraszającym tempie i nie chce się zatrzymać. Oto kod: #include <SFML/Window.hpp> #include <SFML/Graphics.hpp> #include <SFML/Text.hpp> #include <iostream>
using namespace std;
class Game { private: bool kolko; bool krzyzyk; int gracz1; int gracz2; sf::RenderWindow okno; sf::Image ikolo; sf::Image iszach; sf::Image ikrzyz; sf::Texture tszach; sf::Texture tkolo; sf::Texture tkrzyz; sf::Sprite krzyz[ 10 ]; sf::Sprite kolo[ 10 ]; sf::Sprite szach; sf::Font font; sf::Text xtxt; sf::Text ytxt; sf::Text win; sf::Text wyn1; sf::Text wyn2; sf::Vector2i position; void process(); void update(); void render(); void clear(); string xmouse; string ymouse; bool leftpressed; bool mousemove; bool kratka[ 9 ]; int krata[ 9 ]; int rzad[ 8 ]; bool player; bool wygrana1; bool wygrana2; public: Game(); void run(); };
Game::Game() : okno( sf::VideoMode( 800, 600, 32 ), "Kolko i krzyzyk" ) , kolko( false ) , krzyzyk( false ) , leftpressed( false ) , mousemove( false ) , player( false ) , wygrana1( false ) , wygrana2( false ) , gracz1( 0 ) , gracz2( 0 ) { for( int i = 0; i < 9; i++ ) kratka[ i ] = false; for( int i = 0; i < 9; i++ ) krata[ i ] = 0; iszach.loadFromFile( "sprites/szach.png" ); ikolo.loadFromFile( "sprites/kolo.png" ); ikrzyz.loadFromFile( "sprites/krzyz.png" ); font.loadFromFile( "sprites/poseiAOE.ttf" ); ikolo.createMaskFromColor( sf::Color( 255, 255, 255 ), 0 ); ikrzyz.createMaskFromColor( sf::Color( 255, 255, 255 ), 0 ); iszach.createMaskFromColor( sf::Color( 255, 255, 255 ), 0 ); tszach.loadFromImage( iszach ); tkolo.loadFromImage( ikolo ); tkrzyz.loadFromImage( ikrzyz ); kolo[ 9 ].setTexture( tkolo ); kolo[ 9 ].setPosition( 0, 70 ); krzyz[ 9 ].setTexture( tkrzyz ); krzyz[ 9 ].setPosition( 700, 70 ); for( int i = 0; i < 3; i++ ) { for( int j = 0; j < 3; j++ ) { kolo[( 3 * i + j ) ].setTexture( tkolo ); kolo[( 3 * i + j ) ].setPosition( 170 +( i * 170 ), 70 + j * 160 ); } } for( int i = 0; i < 3; i++ ) { for( int j = 0; j < 3; j++ ) { krzyz[( 3 * i + j ) ].setTexture( tkrzyz ); krzyz[( 3 * i + j ) ].setPosition( 170 +( i * 170 ), 70 + j * 160 ); } } szach.setTexture( tszach ); szach.setPosition( 150, 50 ); xtxt.setFont( font ); xtxt.setCharacterSize( 50 ); ytxt.setFont( font ); ytxt.setPosition( 700, 0 ); ytxt.setCharacterSize( 50 ); wyn1.setFont( font ); wyn1.setPosition( 20, 50 ); wyn1.setCharacterSize( 400 ); wyn2.setFont( font ); wyn2.setPosition( 700, 50 ); wyn2.setCharacterSize( 400 ); win.setFont( font ); win.setCharacterSize( 160 ); win.setString( "Wygrana!" ); win.setPosition( 200, 300 ); }
void Game::clear() { for( int i = 0; i < 8; i++ ) rzad[ i ] = 0; }
void Game::process() { sf::Event zdarzenie; while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed ) okno.close(); if( zdarzenie.type == sf::Event::MouseButtonPressed && sf::Mouse::isButtonPressed( sf::Mouse::Left ) && !wygrana1 && !wygrana2 ) { player =!player; leftpressed = true; if( position.x < 300 && position.x > 150 && position.y > 50 && position.y < 210 ) { if( player ) krata[ 0 ] --; else krata[ 0 ] ++; } if( position.x < 300 && position.x > 150 && position.y > 220 && position.y < 370 ) { if( player ) krata[ 1 ] --; else krata[ 1 ] ++; } if( position.x < 300 && position.x > 150 && position.y > 375 && position.y < 540 ) { if( player ) krata[ 2 ] --; else krata[ 2 ] ++; } if( position.x > 310 && position.x < 480 && position.y > 50 && position.y < 210 ) { if( player ) krata[ 3 ] --; else krata[ 3 ] ++; } if( position.x > 310 && position.x < 480 && position.y > 220 && position.y < 370 ) { if( player ) krata[ 4 ] --; else krata[ 4 ] ++; } if( position.x > 310 && position.x < 480 && position.y > 375 && position.y < 540 ) { if( player ) krata[ 5 ] --; else krata[ 5 ] ++; } if( position.x > 490 && position.x < 640 && position.y > 50 && position.y < 210 ) { if( player ) krata[ 6 ] --; else krata[ 6 ] ++; } if( position.x > 490 && position.x < 640 && position.y > 220 && position.y < 370 ) { if( player ) krata[ 7 ] --; else krata[ 7 ] ++; } if( position.x > 490 && position.x < 640 && position.y > 375 && position.y < 540 ) { if( player ) krata[ 8 ] --; else krata[ 8 ] ++; } } if( zdarzenie.type == sf::Event::MouseButtonReleased ) leftpressed = false; if( zdarzenie.type == sf::Event::MouseMoved ) mousemove = true; if( zdarzenie.type != sf::Event::MouseMoved ) mousemove = false; } }
void Game::update() { if( mousemove ) { position = sf::Mouse::getPosition( okno ); xmouse = std::to_string( position.x ); ymouse = std::to_string( position.y ); xtxt.setString( "Gracz 1" ); ytxt.setString( "Gracz 2" ); } rzad[ 0 ] = krata[ 0 ] + krata[ 1 ] + krata[ 2 ]; rzad[ 1 ] = krata[ 0 ] + krata[ 3 ] + krata[ 6 ]; rzad[ 2 ] = krata[ 0 ] + krata[ 4 ] + krata[ 8 ]; rzad[ 3 ] = krata[ 2 ] + krata[ 5 ] + krata[ 8 ]; rzad[ 4 ] = krata[ 1 ] + krata[ 4 ] + krata[ 7 ]; rzad[ 5 ] = krata[ 6 ] + krata[ 7 ] + krata[ 8 ]; rzad[ 6 ] = krata[ 0 ] + krata[ 3 ] + krata[ 6 ]; rzad[ 7 ] = krata[ 2 ] + krata[ 4 ] + krata[ 6 ]; for( int i = 0; i < 8; i++ ) { if( rzad[ i ] == 3 ) { wygrana2 = true; } } wyn1.setString( std::to_string( gracz1 ) ); wyn2.setString( std::to_string( gracz2 ) ); }
void Game::render() { okno.clear(); for( int i = 0; i < 9; i++ ) { if( krata[ i ] != 0 ) { if( krata[ i ] ==- 1 ) okno.draw( kolo[ i ] ); if( krata[ i ] == 1 ) okno.draw( krzyz[ i ] ); } } okno.draw( kolo[ 9 ] ); okno.draw( krzyz[ 9 ] ); okno.draw( xtxt ); okno.draw( ytxt ); okno.draw( szach ); okno.draw( wyn1 ); okno.draw( wyn2 ); if( wygrana1 || wygrana2 ) { okno.draw( win ); wygrana2 = false; gracz2++; } okno.display(); }
void Game::run() { while( okno.isOpen() ) { process(); update(); render(); } }
int main() { Game game; game.run(); return 0; } |
|
akwes |
» 2013-09-21 11:04:57 if( wygrana1 || wygrana2 ) { okno.draw( win ); wygrana2 = false; gracz2++; }
To się wykonuje cały czas, jak myślisz czemu? |
|
Cielak Temat założony przez niniejszego użytkownika |
» 2013-09-21 11:11:34 Wydaję mi się, że to dzięki wcześniejszej pętli for, gdzie sprawdzam czy jakikolwiek rząd wynosi 3 lub -3, tam cały czas mi zmienia wartość na true. Zgadza sie ?
@edit Udało mi się zrozumieć w czym tkwi błąd, wszystko śmiga, dzięki :D |
|
« 1 » |