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

trudności z użyciem sf::Mouse::getPosition

Object Storage Arubacloud
0 głosów
192 wizyt
pytanie zadane 11 listopada 2018 w C i C++ przez HaSen Nowicjusz (230 p.)
edycja 11 listopada 2018 przez HaSen

Witam

Mam problem ponieważ znalazłem na forum (https://stackoverflow.com/questions/23530360/how-do-you-make-a-clickable-sprite-in-sfml) odpowiedź do mojego pytania i ją zastosowałem :

sprite.getGlobalBounds().contains(mousePos)

i... jak można łatwo się domyśleć nie działa w moim kodzie:

#include <SFML/Graphics.hpp>



int main()
{
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 640, 480, 32 ), "gra1" );

    sf::Texture tekstura; 
    tekstura.loadFromFile( "C:\\Users\\Miko³aj\\Desktop\\Projekty\\Kurs SFML\\sklep.png" ); 

    sf::Texture tekstura2;
    tekstura2.loadFromFile("C:\\Users\\Miko³aj\\Desktop\\Projekty\\Kurs SFML\\fabryka.png");

    sf::Texture tekstura3;
    tekstura3.loadFromFile("C:\\Users\\Miko³aj\\Desktop\\Projekty\\Kurs SFML\\kopalnia.png");

    sf::Sprite obrazek; 
    obrazek.setTexture( tekstura ); 
    obrazek.setScale( sf::Vector2f( 0.40, 0.40 ) );

    sf::Sprite obrazek2;
    obrazek2.setTexture(tekstura2);
    obrazek2.setScale(sf::Vector2f( 0.40, 0.40 ));

    sf::Sprite obrazek3;
    obrazek3.setTexture(tekstura3);
    obrazek3.setScale(sf::Vector2f( 0.40, 0.40 ));

    while( oknoAplikacji.isOpen() )
    {
        sf::Vector2i pozycjaMyszyWzgledemOkna;
        sf::Mouse::getPosition( oknoAplikacji);
        sf::Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == sf::Event::Closed )
                 oknoAplikacji.close();

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 oknoAplikacji.close();

            if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle )
                 oknoAplikacji.close();

            if(obrazek.getGlobalBounds().contains(pozycjaMyszyWzgledemOkna))
                oknoAplikacji.close();
        }


        oknoAplikacji.clear( sf::Color( 181, 230, 29 ) );
        oknoAplikacji.draw( obrazek );

        obrazek2.setPosition( 200, 0 );
        oknoAplikacji.draw( obrazek2 );
        obrazek3.setPosition( 400, 0 );
        oknoAplikacji.draw( obrazek3 );

        oknoAplikacji.display();
    }
    return 0;
}

chciałem zrobić zdarzenie kliknięcia w sprite'a (obrazek).

moze mi ktoś wytłumaczyć czemu to nie działa??

 

Z góry dzięki za pomoc i KONSTRUKTYWNĄ krytykę :)

1 odpowiedź

+1 głos
odpowiedź 11 listopada 2018 przez adrian17 Ekspert (345,160 p.)

sf::Mouse::getPosition( oknoAplikacji,pozycjaMyszyWzgledemOkna  );

Jestem trochę skonfudowany... getPosition nie ma przeładowania biorącego dwa argumenty. Zajrzyj do dokumentacji.

komentarz 11 listopada 2018 przez HaSen Nowicjusz (230 p.)
Ugh wkradł się mały(ale znaczący) błąd, oczywiście nie ma tego drugiego argumentu lecz program i tak nie działa (wyrzuca błąd na ostatnim if'ie)
komentarz 11 listopada 2018 przez adrian17 Ekspert (345,160 p.)

Pokaż poprawiony kod.

wyrzuca błąd na ostatnim if'ie

...jaki błąd?

komentarz 11 listopada 2018 przez HaSen Nowicjusz (230 p.)
błąd:

C:\Users\Mikołaj\Desktop\Code Blocksy\kursSFML\main.cpp:46:75: error: no matching function for call to 'sf::Rect<float>::contains(sf::Vector2i&)'

 

kod został zmodyfikowany w pierwszym poście

 

Pozdrawiam i dziękuje za pomoc :D
komentarz 11 listopada 2018 przez adrian17 Ekspert (345,160 p.)

kod został zmodyfikowany w pierwszym poście

Chyba nie został, bo wciąż widzę to dziwne użycie getPosition().

W każdym razie pewnie chodzi o to, że próbujesz porównywać Vector2f z Vector2i, co nie jest obsługiwane.

Strzelam, że musisz zamienić Vector2i z myszki na Vector2f przed wykonaniem .contains(). Coś w stylu

sf::Vector2f position_float = position;
if(obrazek.getGlobalBounds().contains(position_float))
    ...

 

komentarz 11 listopada 2018 przez HaSen Nowicjusz (230 p.)

Nie mozna przeskalować Vector2i na Vector2f :/

C:\Users\Mikołaj\Desktop\Code Blocksy\kursSFML\main.cpp:36:39: error: conversion from 'sf::Vector2i {aka sf::Vector2<int>}' to non-scalar type 'sf::Vector2f {aka sf::Vector2<float>}' requested

 

#include <SFML/Graphics.hpp>



int main()
{
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 640, 480, 32 ), "gra1" );

    sf::Texture tekstura;
    tekstura.loadFromFile( "C:\\Users\\Miko³aj\\Desktop\\Projekty\\Kurs SFML\\sklep.png" );

    sf::Texture tekstura2;
    tekstura2.loadFromFile("C:\\Users\\Miko³aj\\Desktop\\Projekty\\Kurs SFML\\fabryka.png");

    sf::Texture tekstura3;
    tekstura3.loadFromFile("C:\\Users\\Miko³aj\\Desktop\\Projekty\\Kurs SFML\\kopalnia.png");

    sf::Sprite obrazek;
    obrazek.setTexture( tekstura );
    obrazek.setScale( sf::Vector2f( 0.40, 0.40 ) );

    sf::Sprite obrazek2;
    obrazek2.setTexture(tekstura2);
    obrazek2.setScale(sf::Vector2f( 0.40, 0.40 ));

    sf::Sprite obrazek3;
    obrazek3.setTexture(tekstura3);
    obrazek3.setScale(sf::Vector2f( 0.40, 0.40 ));

    while( oknoAplikacji.isOpen() )
    {
        sf::Vector2i position;
        sf::Mouse::getPosition( oknoAplikacji);
        sf::Event zdarzenie;

        sf::Vector2f position_float = position;

        while( oknoAplikacji.pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == sf::Event::Closed )
                 oknoAplikacji.close();

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 oknoAplikacji.close();

            if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle )
                 oknoAplikacji.close();

            if(obrazek.getGlobalBounds().contains(position_float))
                oknoAplikacji.close();
        }


        oknoAplikacji.clear( sf::Color( 181, 230, 29 ) );
        oknoAplikacji.draw( obrazek );

        obrazek2.setPosition( 200, 0 );
        oknoAplikacji.draw( obrazek2 );

        obrazek3.setPosition( 400, 0 );
        oknoAplikacji.draw( obrazek3 );

        oknoAplikacji.display();
    }
    return 0;
}


 

komentarz 11 listopada 2018 przez adrian17 Ekspert (345,160 p.)

Um... a tak zadziała?

sf::Vector2f position_float(position);

(btw, teraz nie wyciągasz znikąd `position` - `getPosition()` nic nie robi)

komentarz 11 listopada 2018 przez HaSen Nowicjusz (230 p.)
edycja 14 listopada 2018 przez HaSen
Świetnie działa! Ale...

sprite'y zniknęły...?

niemniej jednak dziękuje za poświęcony czas początkującemu :)

 

 

EDIT: Już Naprawione

Podobne pytania

0 głosów
1 odpowiedź 168 wizyt
pytanie zadane 31 grudnia 2020 w C i C++ przez NieMaJuzNazw Użytkownik (890 p.)
0 głosów
2 odpowiedzi 325 wizyt
pytanie zadane 31 października 2016 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
+3 głosów
2 odpowiedzi 707 wizyt
pytanie zadane 27 czerwca 2015 w C i C++ przez Pan Kulomb Pasjonat (18,630 p.)

92,631 zapytań

141,498 odpowiedzi

319,869 komentarzy

62,011 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!

...