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

[SFML 2.1] Timery

Ostatnio zmodyfikowano 2013-11-25 22:42
Autor Wiadomość
Lazarencjusz
Temat założony przez niniejszego użytkownika
[SFML 2.1] Timery
» 2013-11-25 21:52:31
Witam. Mam problem z timerami, a dokładniej z tym, że dany program nie chce działać na słabszym komputerze podobnie szybko co na mocniejszym komputerze. Napisałem już dosyć obszerną grę przy użyciu Allegro i z timerami allegro nie było problemu. Mimo iż gra była obszerna działała niemal tak samo. W przypadku SFML najprostszy program na słabszym komputerze "zamula". Wklejam kod do analizy. Próbowałem już wszystkiego chyba. Nawet wrzuciłęm timery z Allegro (i działało nawet gorzej).

C/C++
#include <SFML/Graphics.hpp>
#include <iostream>
#include <conio.h>
#include <string>
#include <sstream>
#include <ctime>
int status_gry = 1;
int rozmiarOknaX = 1024, rozmiarOknaY = 780;
int srodekWidokuX = 0, srodekWidokuY = 0;
using namespace std;
using namespace sf;

static inline string doStringa( int x )
{
    stringstream type;
    type << x;
    return type.str();
}


static inline string doLitery( int x )
{
    char a = x;
    //cout<<a<<endl;
    string str;
    str[ 0 ] = a;
    //cout<<str[0]<<endl;
    return & str[ 0 ];
}

Font font;

int main()
{
    Clock zegar;
    Time czas;
    float akumulator = 0;
   
    float czasKlatki = 0.001f;
   
    RenderWindow oknoAplikacji( VideoMode( rozmiarOknaX, rozmiarOknaY, 32 ), "Dziadowski program" /*,  Style::Fullscreen*/ );
    //oknoAplikacji.setFramerateLimit(100);
    if( !font.loadFromFile( "Helvetica.ttf" ) )
         return EXIT_FAILURE;
   
    Text tekst( "tekst 1", font, 20 );
    Text tekst2( "tekst 2", font, 20 );
    Text tekst3( "tekst 3", font, 50 );
    Text tekst4( "tekst 4", font, 20 );
    Text wspolrzedneWoknie( "wsp w oknie", font, 20 );
    string wspolrzedneWoknie_str;
   
    View widok;
    View widok2;
    widok.setCenter( Vector2f( srodekWidokuX, srodekWidokuY ) );
    widok.setSize( Vector2f( rozmiarOknaX, rozmiarOknaY ) );
   
    widok2.setCenter( Vector2f( srodekWidokuX, srodekWidokuY ) );
    widok2.setSize( Vector2f( rozmiarOknaX, rozmiarOknaY ) );
   
   
    int x = 0, y = 0;
    Texture tekstura;
    tekstura.loadFromFile( "sfml.png" );
   
    Texture tekstura2;
    tekstura2.loadFromFile( "obrazek2.png" );
   
    Sprite obrazek;
    obrazek.setTexture( tekstura );
   
    Sprite obrazek2;
    obrazek2.setTexture( tekstura2 );
   
    oknoAplikacji.setView( widok );
   
    obrazek.setPosition( 0 - rozmiarOknaX / 2, y - rozmiarOknaY / 2 ); //INFO: dopisane w tym rozdziale
    Event zdarzenie;
   
    while( oknoAplikacji.isOpen() )
    {
       
        akumulator += zegar.restart().asSeconds();
       
        oknoAplikacji.setView( widok );
       
       
        if( oknoAplikacji.pollEvent( zdarzenie ) )
        {
            cout << "Wystapilo zdarzenie!" << endl;
            if( zdarzenie.type == Event::Closed )
                 oknoAplikacji.close();
           
            if( zdarzenie.type == Event::KeyPressed && zdarzenie.key.code == Keyboard::Escape )
                 oknoAplikacji.close();
           
            if( zdarzenie.type == Event::MouseButtonPressed && zdarzenie.mouseButton.button == Mouse::Middle )
                 oknoAplikacji.close();
           
            if( zdarzenie.type == Event::MouseButtonPressed && zdarzenie.mouseButton.button == Mouse::Left )
            { oknoAplikacji.close();
                rozmiarOknaX = 800; rozmiarOknaY = 600;
                widok2.setSize( Vector2f( rozmiarOknaX, rozmiarOknaY ) );
                widok.setSize( Vector2f( rozmiarOknaX, rozmiarOknaY ) );
                oknoAplikacji.create( VideoMode( rozmiarOknaX, rozmiarOknaY, 32 ), "Dziadowski program", Style::Fullscreen );
                Style::Fullscreen );
                oknoAplikacji.setView( widok );
               
            }
           
            if( zdarzenie.type == Event::MouseButtonPressed && zdarzenie.mouseButton.button == Mouse::Right )
            { oknoAplikacji.close();
                rozmiarOknaX = 1024, rozmiarOknaY = 780;
                widok2.setSize( Vector2f( rozmiarOknaX, rozmiarOknaY ) );
                widok.setSize( Vector2f( rozmiarOknaX, rozmiarOknaY ) );
                oknoAplikacji.create( VideoMode( rozmiarOknaX, rozmiarOknaY, 32 ), "Dziadowski program", Style::Fullscreen );
                Style::Fullscreen );
                oknoAplikacji.setView( widok );
               
            }
            if( zdarzenie.type != Event::MouseButtonPressed )
                 tekst3.setString( "" );
           
           
            if( zdarzenie.type == Event::TextEntered )
                 tekst4.setString( "Wcisnieto przycisk: " + doLitery( zdarzenie.key.code ) );
           
           
           
            if( zdarzenie.type == Event::MouseMoved )
            { tekst.setString( "X: " + doStringa( zdarzenie.mouseMove.x ) );
                tekst2.setString( " Y: " + doStringa( zdarzenie.mouseMove.y ) );
                Vector2i pozycjaMyszy = Mouse::getPosition();
               
                cout << "X: " << pozycjaMyszy.x << " Y: " << pozycjaMyszy.y << endl;
            }
           
        }
       
        if( akumulator > czasKlatki )
        {
           
            if( Keyboard::isKeyPressed( Keyboard::Left ) )
            {
               
                widok.move( 1, 0 );
               
            }
           
            if( Keyboard::isKeyPressed( Keyboard::Right ) )
            {
                widok.move( - 1, 0 );
               
            }
           
            if( Keyboard::isKeyPressed( Keyboard::Down ) )
            {
                widok.move( 0, - 1 );
               
            }
           
            if( Keyboard::isKeyPressed( Keyboard::Up ) )
            {
                widok.move( 0, 1 );
               
            }
           
            akumulator -= czasKlatki;
           
           
        }
        tekst.setColor( Color( 0, 0, 255 ) );
       
       
       
        wspolrzedneWoknie_str = tekst.getString() + tekst2.getString();
        wspolrzedneWoknie.setString( "W oknie aplikacji: " + wspolrzedneWoknie_str );
        tekst.setPosition( 0, 0 ); //INFO: dopisane w tym rozdziale
        wspolrzedneWoknie.setPosition( 0 - rozmiarOknaX / 2, 0 - rozmiarOknaY / 2 );
        tekst2.setPosition( 220, 0 );
        tekst3.setPosition( 0, 102 );
        tekst4.setPosition( 0 - rozmiarOknaX / 2, 25 - rozmiarOknaY / 2 );
       
        oknoAplikacji.clear( Color( 255, 0, 0 ) );
       
       
        oknoAplikacji.draw( obrazek );
        oknoAplikacji.draw( obrazek2 );
       
        oknoAplikacji.draw( tekst3 );
       
        oknoAplikacji.setView( widok2 );
        oknoAplikacji.draw( wspolrzedneWoknie );
        oknoAplikacji.draw( tekst4 );
       
        oknoAplikacji.display();
       
    }
    return 0;
}

Można wrzucić do pokolorowania gdzieć :))
P-97506
pekfos
» 2013-11-25 22:14:58
C/C++
float czasKlatki = 0.001f;
Liczysz na 1000 FPS?
P-97512
Lazarencjusz
Temat założony przez niniejszego użytkownika
» 2013-11-25 22:42:42
Nie, nie liczę :). Idąc tym tokiem myślenia, zmieniłem odstępy na 0.6 (jak rozumiem 60 fps) i ruch dosyć przycina się. Zakładając, że chcę mieć 60FPS to co powinienem zrobić aby przemieszczenie tych obiektów było płynne.
P-97517
« 1 »
  Strona 1 z 1