[SFML] Przewijanie mapy kafelkowej
Ostatnio zmodyfikowano 2013-10-06 17:33
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. 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 void Control(); void Update(); void Render(); zależnie od stanu gry wywołują funkcje np. Edytora 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 ? |
|
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 |
|
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) |
|
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. |
|
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? |
|
« 1 » |