pw1602 Temat założony przez niniejszego użytkownika |
[SFML] Brak czyszczenia okna i wyświetlenia sprajtów » 2015-08-27 16:09:18 Siemka. Po utworzeniu konstruktora: Gra( RenderWindow & win ) oraz przypisaniu wskaźnikowi okna: window = & win; próbuję oczyścić okno i wyświetlić piłkę, oraz paletkę: window->clear();
window->draw( paletka ); window->draw( pilka );
window->display(); jednak nic takiego się nie dzieje i nie mam pojęcia dlaczego. W osobnym pliku od menu mam stworzone coś takiego: void Engine::Menu() { while( stan_gry != KONIEC ) { switch( stan_gry ) { case StanGry::MENU: Uruchom_Menu(); break; case StanGry::GRA: Pojedynczy_Gracz(); break; } } }
void Engine::Pojedynczy_Gracz() { Gra gra( okno ); gra.Uruchom_Gre(); stan_gry = MENU; } W momencie kiedy klikam na przycisk "Graj" w menu to nic się nie dzieje mimo, iż dałem, że stan_gry = GRA; . Po zmianie na stan_gry = KONIEC; przycisk działa normalnie i zamyka okno. Co może być tego powodem? |
|
kmlkamilek |
» 2015-08-27 16:29:51 Umieściłeś rysowanie tej piłki i paletki w jakiejś pętli? |
|
pw1602 Temat założony przez niniejszego użytkownika |
» 2015-08-27 16:35:00 Tak. Metoda jest w pętli odpowiedzialnej za działanie paletki oraz piłki i tylko zamknięcie okna lub wyjście do menu po przez ESC zatrzymuje pętle. |
|
kmlkamilek |
» 2015-08-27 17:47:39 Umieść cały kod |
|
pw1602 Temat założony przez niniejszego użytkownika |
» 2015-08-27 18:39:10 Main.cpp #include "Engine.h"
int main() { Engine silnik; silnik.Menu(); } Engine.h #include <SFML/Graphics.hpp> #include <iostream> #include <Windows.h> #include <SFML\Audio.hpp>
using namespace std; using namespace sf;
class Engine { Font czcionka; RenderWindow okno; enum StanGry { MENU, GRA, KONIEC }; StanGry stan_gry; void Uruchom_Menu(); public: Engine( void ); ~Engine( void ); void Menu(); void Pojedynczy_Gracz(); }; Engine.cpp #include "Engine.h" #include "Gra.h"
Engine::Engine( void ) { ContextSettings settings; settings.antialiasingLevel = 8; stan_gry = KONIEC; if( !czcionka.loadFromFile( "data\\fonts\\arial.ttf" ) ) MessageBox( NULL, "Nie znaleziono pliku arial.ttf!", "BLAD", NULL ); okno.create( VideoMode( 1024, 728, 32 ), "Noid", Style::Default, settings ); stan_gry = MENU; }
Engine::~Engine( void ) { }
void Engine::Menu() { while( stan_gry != KONIEC ) { switch( stan_gry ) { case StanGry::MENU: Uruchom_Menu(); break; case StanGry::GRA: Pojedynczy_Gracz(); break; } } }
void Engine::Pojedynczy_Gracz() { Gra gra( okno ); gra.Uruchom_Gre(); stan_gry = MENU; }
void Engine::Uruchom_Menu() { Text tytul( "Noid", czcionka, 60 ), wersja_gry( "Wersja gry: Alpha", czcionka, 10 ); tytul.setPosition( okno.getSize().x / 2 - tytul.getGlobalBounds().width / 2, 100 ); wersja_gry.setPosition( okno.getSize().x / 2 - wersja_gry.getGlobalBounds().width / 2, tytul.getPosition().y + tytul.getGlobalBounds().height + 20 ); const int ile = 3; string str[ 3 ] = { "Graj", "Opcje", "Wyjdz" }; Text opcje_menu[ 3 ]; while( stan_gry != KONIEC ) { Event wydarzenie; Vector2f mysz( Mouse::getPosition( okno ) ); if( okno.pollEvent( wydarzenie ) ) { if( wydarzenie.type == Event::Closed || wydarzenie.type == Event::KeyReleased && wydarzenie.key.code == Keyboard::Escape || opcje_menu[ 2 ].getGlobalBounds().contains( mysz ) && wydarzenie.type == Event::MouseButtonReleased && wydarzenie.key.code == Mouse::Left ) stan_gry = KONIEC; if( opcje_menu[ 0 ].getGlobalBounds().contains( mysz ) && wydarzenie.type == Event::MouseButtonReleased && wydarzenie.key.code == Mouse::Left ) stan_gry = GRA; } for( int i = 0; i < ile; i++ ) { opcje_menu[ i ].setCharacterSize( 20 ); opcje_menu[ i ].setFont( czcionka ); opcje_menu[ i ].setPosition( okno.getSize().x / 2 - opcje_menu[ i ].getGlobalBounds().width / 2, okno.getSize().y / 2 + i * 25 ); opcje_menu[ i ].setString( str[ i ] ); } for( int i = 0; i < ile; i++ ) { if( opcje_menu[ i ].getGlobalBounds().contains( mysz ) ) opcje_menu[ i ].setColor( Color::Cyan ); else opcje_menu[ i ].setColor( Color::White ); } okno.clear(); okno.draw( tytul ); for( int i = 0; i < ile; i++ ) okno.draw( opcje_menu[ i ] ); okno.draw( wersja_gry ); okno.display(); } } Gra.h #include <SFML\Graphics.hpp> #include <Windows.h>
using namespace std; using namespace sf;
class Gra { Clock czas; Time zegar; Texture pilka_tekstura, paletka_tekstura; Sprite pilka, paletka; RenderWindow * window; short int x, y; void Rysuj(); public: Gra( RenderWindow & win ); ~Gra( void ); void Uruchom_Gre(); }; Gra.cpp #include "Gra.h"
Gra::Gra( RenderWindow & win ) { window = & win; if( !pilka_tekstura.loadFromFile( "data\\fonts\\pilka.png" ) ) MessageBox( NULL, "Nie znaleziono pliku pilka.png!", "BLAD", NULL ); if( !paletka_tekstura.loadFromFile( "data\\fonts\\paletka.png" ) ) MessageBox( NULL, "Nie znaleziono pliku paletka.png!", "BLAD", NULL ); window->setMouseCursorVisible( false ); paletka.setTexture( paletka_tekstura ); pilka.setTexture( pilka_tekstura ); x = y = 10; }
Gra::~Gra( void ) { window->setMouseCursorVisible( true ); }
void Gra::Rysuj() { window->clear(); window->draw( paletka ); window->draw( pilka ); window->display(); }
void Gra::Uruchom_Gre() { pilka.setPosition( 0, 0 ); paletka.setPosition( window->getSize().x / 2 - paletka.getGlobalBounds().width / 2, window->getSize().y - 100 ); bool menu = false; while( !menu ) { Event event; Vector2f mouse( Mouse::getPosition( * window ) ); if( window->pollEvent( event ) ) { if( event.type == Event::Closed ) window->close(); if( event.type == Event::KeyReleased && event.key.code == Keyboard::Escape ) menu = true; } if( Event::MouseMoved ) paletka.setPosition( mouse.x, window->getSize().y - 100 ); pilka.move( x, y ); if( pilka.getGlobalBounds().left <= 0 || pilka.getGlobalBounds().width >= window->getSize().x ) x = - x; if( pilka.getGlobalBounds().top <= 0 || pilka.getGlobalBounds().height >= window->getSize().y ) y = - y; Rysuj(); } } @Edit Próbowałem również usunąć wskaźnik i po prostu przesłać okno, ale również to nie dawało skutku. |
|
Monika90 |
» 2015-08-27 19:21:43 Pętla w funkcji Uruchom_Menu będzie się wykonywać dopóki stan_gry będzie różny od KONIEC, więc jak ustawisz stan_gry na GRA, to wciąż się będzie wykonywać, bo GRA jest różne od KONIEC. Pewnie chciałeś tam mieć while( stan_gry == MENU ) { }
|
|
pw1602 Temat założony przez niniejszego użytkownika |
» 2015-08-27 19:31:16 Dziękuję za pomoc. Ta pętla powodowała błąd. Szukać wszędzie tylko nie tam...
@Edit Znalazłem kolejny problem. Mianowicie podczas zamknięcia okna Visual nadal zachowuje się tak, jakby to okno nie zostało zamknięte i proces gry nadal jest uruchomiony. Co mogę z tym zrobić? |
|
kmlkamilek |
» 2015-08-27 20:03:12 if( !window.isOpen() ) { return 0; }
Nie masz mechanizmu który kończyłby działanie gry w przypadku zamknięcia okna. Powyżej dałem ci przykład. |
|
« 1 » 2 |