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

[SFML] Dziwny problem, aplikacja nie odpowiada, ale działa

Ostatnio zmodyfikowano 2013-02-24 00:16
Autor Wiadomość
Virpi
Temat założony przez niniejszego użytkownika
[SFML] Dziwny problem, aplikacja nie odpowiada, ale działa
» 2013-02-23 15:41:56
Witam, mam bardzo nietypowy problem z aplikacją napisaną przeze mnie za pomocą SFML. Jest to początek gry. Gra ta zawiera w sobie dostć konkretne menu. Obecnie działa mi spokojnie przełączanie pomiędzy początkowymi jego ekranami, ale... no właśnie. Po uruchomieniu wszystko wyświetla się ładnie, tylko że za chwilę na pasku przy nazwie okna pojawia się komunikat "(brak odpowiedzi)" i okno aplikacji robi się szare, tak jakby się zawiesiła, ale co ciekawe wciąż można swobodnie przechodzić po menu aplikacji i przełączać się pomiędzy ekranami. Problem jest też taki, że nie mogę przesuwać okna gry na pulpicie, bo też tak jaby się zawieszała.

Wcześniej pisałem aplikacje w SFML i nie miałem takich problemów. Jedyna zmiana jest teraz taka, że okno, w którym rysuję wszystko nie jest dostępne globalnie, jest atrybutem głównej klasy, no ale jest to pole publiczne i obiekty rysujące w tym oknie mają wskaźnik do obiektu posiadającego to okno.

Byłbym bardzo wdzięczny, gdyby ktoś zerknął na ten kod, bo nie mam pojęcia, co takiego może to powodować.

C/C++
#include <iostream>
#include "CGra.h"

using namespace std;

int main()
{
    CGra * _gra = new CGra();
    _gra->run();
   
    delete _gra;
    return 0;
}
------------------------------------
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>

#include "CMenu.h"
#include "CRozgrywka.h"

enum TYP_OKNA { MENU, ROZGRYWKA, EDYTOR,
    WYNIKI, GRACZE, USTAWIENIA, INFO, WYJSCIE };

class CMenu;
class CRozgrywka;

class CGra
{
public:
    CGra();
    virtual ~CGra();
   
    void run();
   
    sf::RenderWindow okno_gry;
    TYP_OKNA aktywne_okno;
   
protected:
   
private:
   
    CMenu * _menu;
    CRozgrywka * _rozgrywka;
   
};
------------------------
#include "CGra.h"

CGra::CGra()
    : okno_gry( sf::VideoMode( 800, 600 ), "Samochody" )
    , aktywne_okno( MENU )
    , _menu( NULL )
    , _rozgrywka( NULL )
{
    okno_gry.setFramerateLimit( 60 );
    //_menu = new CMenu(this);
}

CGra::~CGra()
{
    okno_gry.close();
}

void CGra::run()
{
    while( aktywne_okno != WYJSCIE )
    {
        switch( aktywne_okno )
        {
        case MENU:
            {
                if( _menu == NULL )
                     _menu = new CMenu( this );
               
                _menu->run();
                break;
            }
        case ROZGRYWKA:
            {
                if( _rozgrywka == NULL )
                     _rozgrywka = new CRozgrywka( this );
               
                _rozgrywka->run();
                break;
            }
        case EDYTOR: break;
        case WYNIKI: break;
        case GRACZE: break;
        case USTAWIENIA: break;
        case INFO: break;
        case WYJSCIE: break;
        }
    }
}
-----------------
#include "COkno.h"
#include "CGra.h"

class CGra;

class CMenu
    : public COkno
{
public:
    CMenu( CGra * );
    virtual ~CMenu();
   
    void run();
   
protected:
private:
    CGra * _gra;
   
    std::vector < sf::Text > napisy;
   
    bool wybierz();
    void rysuj();
    void zmiana_roz();
};
-----------------------------
#include "CMenu.h"

CMenu::CMenu( CGra * gra )
    : _gra( gra )
{
    sf::Vector2u wymiary_okna = _gra->okno_gry.getSize();
   
    sf::Text tytul;
    tytul.setString( L"CrazyDrive" );
    tytul.setRotation( 25 );
    napisy.push_back( tytul );
   
    sf::Text nowa_gra;
    nowa_gra.setString( L"Rozpocznij gre" );
    napisy.push_back( nowa_gra );
   
    sf::Text edytor;
    edytor.setString( L"Edytor" );
    napisy.push_back( edytor );
   
    sf::Text wyniki;
    wyniki.setString( L"Wyniki" );
    napisy.push_back( wyniki );
   
    sf::Text gracze;
    gracze.setString( L"Gracze" );
    napisy.push_back( gracze );
   
    sf::Text ustawienia;
    ustawienia.setString( L"Ustawienia" );
    napisy.push_back( ustawienia );
   
    sf::Text info;
    info.setString( L"Informacje" );
    napisy.push_back( info );
   
    sf::Text wyjscie;
    wyjscie.setString( L"Wyjscie" );
    napisy.push_back( wyjscie );
}

CMenu::~CMenu()
{
    //dtor
}

void CMenu::run()
{
    zmiana_roz();
    while( _gra->aktywne_okno == MENU )
    {
        wybierz();
        rysuj();
    }
}

bool CMenu::wybierz()
{
    sf::Vector2i pozycja_myszy = sf::Mouse::getPosition( _gra->okno_gry );
    for( unsigned int i = 1; i < napisy.size(); i++ )
    {
        sf::FloatRect wymiary_napisu = napisy[ i ].getGlobalBounds();
        if( pozycja_myszy.x >= wymiary_napisu.left && pozycja_myszy.x <=( wymiary_napisu.left + wymiary_napisu.width )
        && pozycja_myszy.y >= wymiary_napisu.top && pozycja_myszy.y <=( wymiary_napisu.top + wymiary_napisu.height ) )
        {
            napisy[ i ].setColor( sf::Color::Green );
           
            if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
            {
                switch( i )
                {
                case 1: _gra->aktywne_okno = ROZGRYWKA; break;
                case 2: _gra->aktywne_okno = EDYTOR; break;
                case 3: _gra->aktywne_okno = WYNIKI; break;
                case 4: _gra->aktywne_okno = GRACZE; break;
                case 5: _gra->aktywne_okno = USTAWIENIA; break;
                case 6: _gra->aktywne_okno = INFO; break;
                case 7: _gra->aktywne_okno = WYJSCIE; break;
                }
                return false;
            }
        }
        else
        {
            napisy[ i ].setColor( sf::Color::White );
        }
    }
    return true;
}

void CMenu::rysuj()
{
    _gra->okno_gry.clear( sf::Color::Black );
    for( unsigned int i = 0; i < napisy.size(); i++ )
    {
        _gra->okno_gry.draw( napisy[ i ] );
    }
    _gra->okno_gry.display();
}

void CMenu::zmiana_roz()
{
    sf::Vector2u wymiary_okna = _gra->okno_gry.getSize();
   
    napisy[ 0 ].setCharacterSize( wymiary_okna.y / 10 );
    napisy[ 0 ].setPosition( wymiary_okna.x / 2 - napisy[ 0 ].getLocalBounds().width / 2, wymiary_okna.y / 40 );
   
    double y = wymiary_okna.y / 2;
    double diff = wymiary_okna.y / 15;
   
    for( unsigned int i = 1; i < napisy.size(); i++ )
    {
        napisy[ i ].setCharacterSize( wymiary_okna.y / 20 );
        napisy[ i ].setPosition( wymiary_okna.x / 2 - napisy[ i ].getLocalBounds().width / 2, y );
        y += diff;
    }
}
[ \c pp ]
P-76798
Wasilek
» 2013-02-23 17:27:52
Nie zauważyłem abyś odbierał zdarzenia. Dodaj to i będzie ok :)

Edit. Tak dodatkowo ;) http://cpp0x.pl/forum/temat/?id=9651 -> Miałem ten sam problem :)
P-76805
Virpi
Temat założony przez niniejszego użytkownika
» 2013-02-24 00:16:12
Dziękuję, rzeczywiście to pomogło :) nie rozumiem tylko, dlaczego. Może nie dokłądnie wczytałem się w obsługę eventów w SFML, bo nigdzie tego pobranego eventu nie obsługuję, po prostu go pobieram, a dalej robie swoje.... ale jak działa, to bardzo dobrze :) dziękuję jeszcze raz.
P-76861
« 1 »
  Strona 1 z 1