Autor Wątek: Nieścisłości w liczeniu przesunięcia kamery [sfml]  (Przeczytany 782 razy)

Offline Sarann

  • Użytkownik

# Październik 08, 2016, 22:09:58
No witam, Q&A nie działa, a szkoda. To to chyba odpowiedni dział.

Wie ktoś może z czego wynikają te nieścisłości w liczeniu przesunięcia? Pozycja kursora na mapie będzie różnić się od pozycji początkowej po przesunięciu.

#include <SFML/Graphics.hpp>

int main()
{
    sf::View view;
    sf::RenderWindow window( sf::VideoMode( 800, 600, 32 ), "" );
    window.setVerticalSyncEnabled(1);
    window.setView(view);

    sf::CircleShape shape;
    shape.setRadius(50);
    shape.setFillColor(sf::Color::Blue);
    shape.setPointCount(5);

    sf::Vector2f start_m_pos = window.mapPixelToCoords(sf::Mouse::getPosition(window));
    sf::Vector2f last_m_pos = start_m_pos;
    bool movestart = 0, moveend = 1;
    while( window.isOpen() )
    {
            sf::Event zdarzenie;
            while( window.pollEvent( zdarzenie ) )
            {
                        if( zdarzenie.type == sf::Event::Closed )
                             window.close();

                    if(zdarzenie.type == sf::Event::MouseMoved && movestart)
                    {
                            start_m_pos = window.mapPixelToCoords(sf::Mouse::getPosition(window));
                            if(start_m_pos != last_m_pos)
                            {
                                view.move(0 - (start_m_pos.x - last_m_pos.x), 0 - (start_m_pos.y - last_m_pos.y));
                                last_m_pos = start_m_pos;
                            }
                    }

                    if(sf::Mouse::isButtonPressed(sf::Mouse::Right) && moveend)
                    {
                            moveend = 0;
                            start_m_pos = window.mapPixelToCoords(sf::Mouse::getPosition(window));
                            if(!movestart) { movestart = 1;  last_m_pos = start_m_pos; }
                    }

                    if(!sf::Mouse::isButtonPressed(sf::Mouse::Right) && movestart) { movestart = 0; moveend = 1;}
            }
        window.clear( sf::Color::White );
        window.setView(view);
        window.draw(shape);
        window.setView(window.getDefaultView());
        window.display();
    }
    return 0;
}
można sobie odpalić i sprawdzić, kod jest kompletny

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline albireo

  • Użytkownik

# Październik 09, 2016, 12:55:14
Nieścisłości wynikają z tego, że pozycje kursora a tym samym przesunięcie widoku liczysz na podstawie domyślnego widoku, który ma inną rozdzielczość niż okno, aby liczyło poprawnie ustal rozdzielczość widoku na taką samą jak okna lub mapuj koordynaty na podstawie twojego widoku (w tym przypadku musisz się też pozbyć aktualizacji last_m_pos w obsłudze zdarzenia przesunięcia myszki).

Offline Sarann

  • Użytkownik

# Październik 09, 2016, 19:59:55
Fakt. Wziąłem wartości dla view z default view. Teraz działa świetnie.
Dzięki :]