Autor Wątek: SFML 2.0 przepisanie klikania z sfml 1.6  (Przeczytany 1313 razy)

Offline Thrillkiller

  • Użytkownik

# Maj 19, 2013, 22:36:32
Siema ! Jak pisałem jeszcze pod SFML 1.6 napisałem sobie funkcję wykrywania kliknięcia na tekst :
bool silnik::kolizja(sf::RenderWindow *okno, sf::String tekst)
{

  int myszx = okno->GetInput().GetMouseX() ;
  int myszy = okno->GetInput().GetMouseY() ;
  int doltekstx  = tekst.GetPosition().x ;
  int dolteksty = tekst.GetPosition().y ;
  int rozm = tekst.GetSize() ;
  int gortexty = (dolteksty + rozm) ;
  int szer = tekst.GetRect().GetWidth() ;
  int krawtekstx = (doltekstx + szer ) ;
  if( myszx >= doltekstx && myszx <= krawtekstx && myszy >= dolteksty && myszy <= gortexty  )
     {
       std::cout << "Trach ! " << std::endl ;
       return true ;
   }
   else
   {
   return false ;
   std::cout << "Nic !" << std::endl ;
   }
}
Ale że wszedł na salony SFML 2.0 to chciałem ją przepisać do SFML 2.0 :
bool kolizje::klikstring( sf::Text tekst)
{
    int xmyszy = sf::Mouse::getPosition().x ;
    int ymyszy = sf::Mouse::getPosition().y ;



    int xtekstu  = tekst.getPosition().x  ;
    int ytekstu  = tekst.getPosition().y  ;

    int rozmcz = tekst.getCharacterSize() ;
    int maxy = (ytekstu + rozmcz ) ;

    int rozmtekstu = tekst.getGlobalBounds().width ;
    int maxx = ( xtekstu + rozmtekstu ) ;



    if(xmyszy >= xtekstu && ymyszy >= ytekstu  && ymyszy <= maxy && xmyszy <= maxx)
    {
        return true ;
    }
      else
     return false ;
}

Tyle że to wogóle nie działa tekst.rect próbowałem zastąpiać tekst.getGlobalBounds() , tekst.getLocalBounds() i tekst.getOrigin() . Ale za każdym razem efekt ten sam albo wogóle nie wykrywa kliknięć na tekst albo w jakichś totalnie dziwnych miejscach jak czarnym tle , albo na nie tym tekscie . Męczę się z tym już 2 dzień ale pomysły się wyczerpały niczym kasa w Zimbabwe , ma ktoś pomysł jak to inaczej przepisać ?

Offline Mr. Spam

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

Offline Xirdus

  • Redaktor

# Maj 19, 2013, 23:34:40
Z dokumentacji o getGlobalBounds():
Cytuj
The returned rectangle is in global coordinates, which means that it takes in account the transformations (translation, rotation, scale, ...) that are applied to the entity. In other words, this function returns the bounds of the sprite in the global 2D world's coordinate system.
Znaczy się, wystarczy żebyś sprawdził, czy punkt sf::Mouse::getPosition(okno) leży w prostokącie tekst.getGlobalBounds(). Pamiętaj, żeby podać do getPosition() parametr, bo bez niego dostaniesz pozycję względem pulpitu, a chcesz względem okna.

Offline Thrillkiller

  • Użytkownik

# Maj 20, 2013, 20:50:28
Dzięki , nie zauważyłem starego przyzwyczajenia z 1.6 i nie wpisałem do sf::mouse.getPos okna . Eh po co oni zmieniają tą składnię ?

Offline Xirdus

  • Redaktor

# Maj 20, 2013, 21:07:34
Eh po co oni zmieniają tą składnię ?
Microsoft nie zmienia, przez co do dzisiaj na Windowsie slashe w ścieżkach stawia się w drugą stronę.

Offline Estivo

  • Użytkownik
    • Blog

# Maj 21, 2013, 09:01:40
Dzięki , nie zauważyłem starego przyzwyczajenia z 1.6 i nie wpisałem do sf::mouse.getPos okna . Eh po co oni zmieniają tą składnię ?

Według mnie wyszło to im na dobre, bo składnia jest taka sama jak mój styl pisania co mnie bardzo cieszy. Poza tym jest to według mnie czytelniejsze niż wcześniej.