• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SFML - klasa Button, sf::VertexArray i wczytanie tekstury

Object Storage Arubacloud
0 głosów
518 wizyt
pytanie zadane 25 grudnia 2016 w C i C++ przez szym3ns Użytkownik (860 p.)

Witam, tak jak w tytule, chciałbym zrobić klasę Button, której obiekty będą przyciskami o różnych wymiarach, tekście, oraz obrazku. W tym celu posłużyłem się strukturą sf::VertexArray i prymitywie sf::LinesStrip. Otóż zatrzymałem się w momencie, w którym po utworzeniu nowego obiektu klasy Button o nazwie 'but' i wyświetleniu go na oknie o nazwie 'window' za pomocą window.draw(but), pojawia się ów prostokąt o współrzędnych ustalonych przeze mnie :) Z tym, że nie mam pojęcia jak ruszyć na przód.. chciałbym teraz, aby w środku moich prostokątów były tekstury/sprity, lecz nie wiem jak je tam wczytać, a następnie wyświetlić. Próbowałem kombinować z states.texture, ale nie działa. Jakieś porady?

Oto fragmenty kodu:

class Button : public sf::Drawable
{
private:
    sf::VertexArray ramka = sf::VertexArray(sf::LinesStrip, 5);
    sf::Texture tekstura;
    std::string tekst;

public:
    Button(float, float);
    //~Button();
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
};
void Button::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
		states.texture = &tekstura;
		target.draw(ramka,states);
}

Button::Button(float xx, float yy)
{
    if (!tekstura.loadFromFile("src/img/texture.jpg"))
        EXIT_FAILURE;
    [...]
}

komentarz 25 grudnia 2016 przez JAKUBW Nałogowiec (33,470 p.)

Moja rada:

sf::Texture tekstura;

Powinno być statyczne, bo jak stworzysz 20 przycisków to będziesz miał 20 dokładnie takich samych tekstur, które będziesz za każdym razem musiał wczytać co jest mało wydajne. A tak będzie jedna tekstura z której będzie korzystać każdy z przycisków.

Klasa Button powinna też zawierać obiekt sf::Text oraz sf::Sprite, które odpowiednio ustawisz (ich pozycje, skale, do spirite podepniesz teksturę etc.) i następnie wyświetlisz w metodzie draw. 

A jak zrobić przesuwanie? Możesz dziedziczyć klasę Button po sf::Transformable i odpowiednie metody przesłonić lub po prostu dodać metody set/getPosition, move etc.

Ale to może być skomplikowane jeżeli chcesz tworzyć bardziej zawansowane operację jak skalowanie i tu przychodzi drugie rozwiązanie:

Utwórz bufor przycisku (obiekt klasy sf::RenderTexture) o rozmiarze równym rozmiarowi przycisku. Następnie tworzysz metodę repaint() w której czyścisz ten bufor, rysujesz wszystko co chcesz (tło, obramowanie, tekst etc.) a w metodzie draw rysujesz ten bufor w odpowiednim miejscu. Jeżeli tekstura potrzebuje odświeżenie, bo na przykład najechałeś kursorem i chcesz zmienić napis na biały to po zmianie musisz wywołać metodę repaint(). W ten sposób zaoszczędzisz GPU, bo raz narysujesz i korzystasz do woli:)

komentarz 27 grudnia 2016 przez szym3ns Użytkownik (860 p.)
Okej, wielkie dzięki! Mam jeszcze takie pytanie.. chciałbym zrobić metodę onClick() dla obiektów klasy Button, i zastanawiam się w jaki sposób mógłbym sprawdzać czy Button został wciśnięty. Na pewno potrzebne mi będą współrzędne x i y myszki, które muszę pobrać do zmiennych, tylko jak to zrobić, skoro klasa Button nie wie o istnieniu obiektu klasy sf::RenderWindow i z tego wychodzi, że funkcja sf::Mouse::getPosition(window) nie zadziała (argumentem tej funkcji jest moje utworzone okno)? Mógłbym w funkcji przekazywać jako parametr okno, tylko czy to dobra myśl?
komentarz 27 grudnia 2016 przez JAKUBW Nałogowiec (33,470 p.)
Podczas ,,rozpakowywania zdarzeń" weź listę obiektów i sprawdzaj na każdym czy zawiera on punkt w którym jest kursor. Tylko pobierz lokalizację myszy tylko raz. Jak zawiera punkt to wykonaj metodę onClick i wyjdź z pętli

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 288 wizyt
pytanie zadane 23 listopada 2019 w C i C++ przez Szymek_sw Początkujący (420 p.)
+1 głos
1 odpowiedź 379 wizyt
pytanie zadane 7 lutego 2016 w C i C++ przez zmiennoimienny Mądrala (5,540 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...