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

[SFML] Anormalny rezultat czytania pozycji myszy

Ostatnio zmodyfikowano 2017-07-29 08:07
Autor Wiadomość
PL_Andrev
Temat założony przez niniejszego użytkownika
[SFML] Anormalny rezultat czytania pozycji myszy
» 2017-07-28 20:55:14
Witam,

Napisałem kod przesunięcia obiektów wraz z ruchem myszy, jednak efektem jest "wyskok" obiektów poza obszar rysowania.
Testując możliwe błędy zwróciłem uwagę, że współrzędna Y jest nieprawidłowo odczytywana - nie mam pojęcia dlaczego.

Program jest zbudowany w ten sposób, iż parametry punktów ładowane są do tablicy <vector>.
Przy kliknięciu myszą odczytywane są współrzędne punktu kliknięcia, przy ruchu odczytywane są współrzędne "bieżące" myszy.
Punkt jest przesuwany o różnicę obu pomiarów.

W dużym skrócie program przesunięcia punktu wygląda następująco:

C/C++
#include <iostream>
#include <SFML/Graphics.hpp>
#include <cmath>
#include <fstream>
#include <sstream>

using namespace std;
using namespace sf;

int main()
{
   
    //-----------------------------------
    //--- wczutuje lokalizacje i nazwy doo tablicy vektorow
   
    vector < int > x_array, y_array;
   
    x_array.push_back( 100 );
    y_array.push_back( 100 );
   
   
    //--------------------------------------------------------------
   
    RenderWindow win( VideoMode( 800, 800 ), L"test", sf::Style::Default );
   
    Font font;
    font.loadFromFile( "arial.ttf" );
   
    int x_old = 0, y_old = 0;
    int x_new = 0, y_new = 0;
   
    bool moving = false;
   
    while( win.isOpen() )
    {
        win.clear( Color::Black );
       
        Event e;
        while( win.pollEvent( e ) )
        {
            switch( e.type )
            {
            case Event::Closed:
                win.close();
                break;
            case sf::Event::MouseButtonPressed:
                // Mouse button is pressed, get the position and set moving as active
                if( e.mouseButton.button == 0 ) {
                    moving = true;
                    //odczyt myszy z klikniecia
                   
                    x_old = e.mouseButton.x;
                    y_old = e.mouseButton.y;
                   
                }
                break;
            case sf::Event::MouseButtonReleased:
                // Mouse button is released, no longer move
                if( e.mouseButton.button == 0 ) {
                    moving = false;
                }
                break;
            case sf::Event::MouseMoved:
                {
                    // Ignore mouse movement unless a button is pressed (see above)
                    if( !moving )
                         break;
                    // odczyt pozycji myszy
                   
                    x_new = e.mouseButton.x;
                    y_new = e.mouseButton.y;
                   
                    break;
                }
            }
        }
       
        string poz_x = to_string( x_new - x_old );
        string poz_y = to_string( y_new - y_old );
       
        Text control( poz_x + "-" + poz_y + "-", font );
        control.setCharacterSize( 13 );
        control.setFillColor( Color::White );
        control.setPosition( 10, 10 );
       
        win.draw( control );
        win.display();
       
    }
}

Efekt działania*:

Wiem już, że błędnie jest odczytywana wartość y_new, ale wciąż nie wiem dlaczego ani jak to skorygować.
Kurs SMFL opisuje funkcję 2fvector do przechwycenia położenia myszy, ale niestety nie wiem jak uzyskać osobno dostęp do parametru x/y, aby przeliczyć tablicę wartości x/y o nowe wartości.
P-163672
pekfos
» 2017-07-28 22:00:54
C/C++
case sf::Event::MouseMoved:
{
    // Ignore mouse movement unless a button is pressed (see above)
    if( !moving )
         break;
    // odczyt pozycji myszy
   
    x_new = e.mouseButton.x;
    y_new = e.mouseButton.y;
   
    break;
}
Ten kod jest błędny, nie możesz tu użyć e.mouseButton. Powinno być e.mouseMove.

ale niestety nie wiem jak uzyskać osobno dostęp do parametru x/y
"Niestety nie wiem"..? Raczej "właśnie wpisuję w google i czytam w dokumentacji", inaczej robisz to źle.
P-163674
PL_Andrev
Temat założony przez niniejszego użytkownika
» 2017-07-29 08:07:17
MouseMove - o to chodziło.

P-163679
« 1 »
  Strona 1 z 1