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

[SFML] Przewijanie mapy kafelkowej

Ostatnio zmodyfikowano 2013-10-06 17:33
Autor Wiadomość
Mig
Temat założony przez niniejszego użytkownika
[SFML] Przewijanie mapy kafelkowej
» 2013-10-06 16:31:52
Witam wszystkich.Mam problem z mapa kafelkową a mianowicie gdy przewijam mapę poruszając po oknie kursorem mapa przewija się błyskawicznie natomiast gdy nie poruszam przewija się powoli.

Zamieszczam fragment kodu mapy.Funkcje te są wywoływane przez inny obiekt który z kolei jest wywoływany przez jeszcze inny ale to chyba nie ma znaczenia.
C/C++
void Map::Control( sf::RenderWindow & window )
{
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::Num0 ) ) { _nr_tile = 0; }
    else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Num1 ) ) { _nr_tile = 1; }
    else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Num2 ) ) { _nr_tile = 2; }
    else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Num3 ) ) { _nr_tile = 3; }
    else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Num4 ) ) { _nr_tile = 4; }
    else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Num5 ) ) { _nr_tile = 5; }
    else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Num6 ) ) { _nr_tile = 6; }
    else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Num7 ) ) { _nr_tile = 7; }
    else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Num8 ) ) { _nr_tile = 8; }
   
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
    {
        if( _position_y > 0 ) { _position_y--; }
    }
    else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
    {
        if( _position_y < 1000 ) { _position_y++; }
    }
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
    {
        if( _position_x > 0 ) { _position_x--; }
    }
    else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
    {
        if( _position_x < 1000 ) { _position_x++; }
    }
   
    if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
    {
        sf::Vector2f position_mouse = window.mapPixelToCoords( sf::Mouse::getPosition( window ) );
       
        if( position_mouse.x >= 0 && position_mouse.x < _width * 10 &&
        position_mouse.y >= 0 && position_mouse.y < _height * 10 )
        _data_map[ static_cast < int >( position_mouse.y / 10 + _position_y ) ]
            [ static_cast < int >( position_mouse.x / 10 + _position_x ) ] = _nr_tile;
       
    }
}
void Map::Update( sf::RenderWindow & window )
{
    if( _position_y + 60 > _height || _position_x + 80 > _width )
    {
        int ** new_data_map = new int *[ _height + _position_y + 20 ];
        for( int y = 0; y < _height + _position_y + 20; y++ )
        {
            new_data_map[ y ] = new int[ _width + _position_x + 20 ];
            for( int x = 0; x < _width + _position_x + 20; x++ )
            { new_data_map[ y ][ x ] = 0; }
        }
       
        for( int y = 0; y < _height; y++ )
        {
            for( int x = 0; x < _width; x++ )
            {
                new_data_map[ y ][ x ] = _data_map[ y ][ x ];
            }
        }
       
        for( int y = 0; y < _height; y++ ) { delete[] _data_map[ y ]; }
        delete[] _data_map;
       
        _data_map = new_data_map;
        _height = _height + _position_y;
        _width = _width + _position_x;
    }
}
void Map::Render( sf::RenderWindow & window )
{
    sf::Sprite * help_sprite;
   
    for( int y = _position_y; y < 60 + _position_y; y++ )
    {
        for( int x = _position_x; x < 80 + _position_x; x++ )
        {
            if( _data_map[ y ][ x ] > 0 && _data_map[ y ][ x ] < 9 )
            {
                help_sprite = & _tiles.Get_Tile( _data_map[ y ][ x ] );
                help_sprite->setPosition(( x - _position_x ) * 10,( y - _position_y ) * 10 );
               
                window.draw( * help_sprite );
            }
        }
    }
}
W obiekcie Game funkcje 
C/C++
void Control();
void Update();
void Render();
zależnie od stanu gry wywołują funkcje np. Edytora
C/C++
void Control();
void Update();
void Render();
On z kolei wywołuje te funkcje dla mapy.
Czy ma ktoś pomysł co wpływa na to że poruszanie myszą przyśpiesza przewijanie mapy ?
P-93248
Mig
Temat założony przez niniejszego użytkownika
» 2013-10-06 16:38:10
Jestem w stanie się tego pozbyć jedynie przez usunięcie funkcji Control() z wnętrza pętli
while(sf::RenderWindow.pollEvent(sf::Event)) , ale to chyba nie jest najlepszym rozwiązaniem
P-93249
pekfos
» 2013-10-06 16:57:49
A umieszczenie Control() w pętli obsługi zdarzeń jest najgorszym rozwiązaniem. (Nie wspominając o tym, że
while( sf::RenderWindow.pollEvent( sf::Event ) )
 nie ma sensu)
P-93250
Mig
Temat założony przez niniejszego użytkownika
» 2013-10-06 17:08:58
Rozumiem że powinienem umieścić funkcje Control() poza pętla.Ale w takim razie w jakim celu ta pętla ma służyć skoro wszystkie zdarzenia będą wykonywane w funkcjach Control() innych obiektów.A ten kod co podałem to tak tylko wiem że to nie ma większego sensu ale to tylko tak podałem by nie podawać nazw zmiennych,ale mniejsza z tym to nie jest ważne.
P-93251
pekfos
» 2013-10-06 17:33:37
Pętla obsługi zdarzeń, służy do obsługi zdarzeń. Jak chcesz je obsługiwać w metodach Control(), skoro ich tam nie przekazujesz?
P-93252
« 1 »
  Strona 1 z 1