Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Brak czyszczenia okna i wyświetlenia sprajtów

Ostatnio zmodyfikowano 2015-08-29 17:34
Autor Wiadomość
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ę:
C/C++
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:
C/C++
void Engine::Menu()
{
    while( stan_gry != KONIEC )
    {
        switch( stan_gry )
        {
        case StanGry::MENU:
            Uruchom_Menu();
            break;
        case StanGry::GRA:
            Pojedynczy_Gracz();
            break;
        } //switch
    } //while
}

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?
P-136925
kmlkamilek
» 2015-08-27 16:29:51
Umieściłeś rysowanie tej piłki i paletki w jakiejś pętli?
P-136926
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.
P-136927
kmlkamilek
» 2015-08-27 17:47:39
Umieść cały kod
P-136928
pw1602
Temat założony przez niniejszego użytkownika
» 2015-08-27 18:39:10
Main.cpp
C/C++
#include "Engine.h"

int main()
{
    Engine silnik;
    silnik.Menu();
}

Engine.h
C/C++
#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
C/C++
#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 )
{
    //destruktor
}

void Engine::Menu()
{
    while( stan_gry != KONIEC )
    {
        switch( stan_gry )
        {
        case StanGry::MENU:
            Uruchom_Menu();
            break;
        case StanGry::GRA:
            Pojedynczy_Gracz();
            break;
        } //switch
    } //while
}

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;
           
        } //if
       
        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
       
        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 );
           
        } //for
       
        okno.clear();
        okno.draw( tytul );
        for( int i = 0; i < ile; i++ )
             okno.draw( opcje_menu[ i ] );
       
        okno.draw( wersja_gry );
        okno.display();
    } //while
}

Gra.h
C/C++
#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; //szybkość ruchu piłki w pikselach
   
    void Rysuj();
   
public:
    Gra( RenderWindow & win );
    ~Gra( void );
   
    void Uruchom_Gre();
};

Gra.cpp
C/C++
#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
       
        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();
    } //while
}


@Edit
Próbowałem również usunąć wskaźnik i po prostu przesłać okno, ale również to nie dawało skutku.
P-136930
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ć
C/C++
while( stan_gry == MENU )
{
}
P-136931
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ć?
P-136933
kmlkamilek
» 2015-08-27 20:03:12
C/C++
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.
P-136934
« 1 » 2
  Strona 1 z 2 Następna strona