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

SFML zdarzenie dżwięk

Object Storage Arubacloud
0 głosów
608 wizyt
pytanie zadane 20 lipca 2015 w C i C++ przez niezalogowany
wie ktoś jak w SFML zrobić tak zeby po najechani na napis był odgrywany dźwięk ?

5 odpowiedzi

0 głosów
odpowiedź 21 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 21 lipca 2015
 
Najlepsza

Rzeczywiście, działało źle, ale wystarczyło dobrze pomyśleć wink

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "TEST");

    sf::Font font;
    font.loadFromFile("HussarPrintA.otf");

    sf::Text text("NAPIS", font, 30);

    sf::SoundBuffer sound_buffer;
    sound_buffer.loadFromFile("shot.ogg");

    sf::Sound sound(sound_buffer);

    bool zmienna = true;

    while(window.isOpen())
    {
        sf::Vector2f mouse(sf::Mouse::getPosition(window));

        sf::Event event;
        while(window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
                window.close();
        }

        if(text.getGlobalBounds().contains(mouse) && zmienna)
        {
            sound.play();
            zmienna = false;
        }
        else
        {
            text.setColor(sf::Color(255, 255, 255));
        }

        if(zmienna)
            text.setColor(sf::Color(255, 0, 255));

        if(!text.getGlobalBounds().contains(mouse))
            zmienna = true;

        window.clear();
        window.draw(text);
        window.display();
    }

    return 0;
}

 

komentarz 21 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Oczywiście pewne rzeczy zmień. Nie chciało mi się przerabiać tego kodu :)
komentarz 21 lipca 2015 przez niezalogowany
nooo super u cb działa tylko u mnie to wszystko się dzieje w pętli for i już tak łatwo nie jest
komentarz 21 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Po prostu przerób to na tak samo, jak masz u siebie w pętli, tylko z tymi warunkami z tą zmienną bool
komentarz 21 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
A tak poza tym... jak ci się podoba mój awatar? Sam go zrobiłem :)
+1 głos
odpowiedź 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)

Robisz po prostu warunek. Gdy kursor jest w obszarze przycisku, to uruchom dźwięk. Jeśli chodzi, jak to zrobić w SFML, to masz masę różnych poradników tłumaczących całą bibliotekę. Mogę ci polecić jeden kurs: http://szymonsiarkiewicz.pl/piszemy-gre-w-sfmlu/.

komentarz 20 lipca 2015 przez niezalogowany
wow świetna podpowiedź robię warunek to chciałem usłyszeć trzeba zrobić warunek
komentarz 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Ale w czym masz problem. Chodzi o brak znajomości SFML, czy tylko o sam warunek?
komentarz 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Dajesz mi downvote'a, bo się zapytałem? Ludzie, ktoś wam chce pomóc, a wy najlepiej na niego naplójcie, bo nie pocałował was w paluszek!
komentarz 20 lipca 2015 przez niezalogowany

Ok, mam menu gry i chcę zrobić tak żeby po najechaniu na opcję menu napis zmienił kolor i odegrał się dźwięk ale jak robie to zmienia się kolor po najechaniu ale dźwięk się odgrywa jak już kursorem myszy zmienie pozycję.

komentarz 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Chyba wiem, w czym problem. Dźwięk się odgrywa, ale przez to, że warunek jest cały czas spełniony, to przy każdym obiegu pętli dźwięk zaczyna być odtwarzany od nowa. Daj warunek, który spowoduje jednorazowe odtworzenie dźwięku przy najechaniu.
komentarz 20 lipca 2015 przez niezalogowany
zrobiłem osobny warunek

        if(tekst[0].getColor() == Color(46, 46, 46))
        {
            dzwiek.play();
        }

i dalej to samo
komentarz 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Jeśli najedziesz kursorem na tekst, to warunek zostaje spełniony i dźwięk jest odtworzony, ale ten warunek jest wtedy spełniany wielokrotnie, praktycznie przy każdym obiegu pętli. Jeśli wykonujesz metodę play() na tym samym dźwięku CIĄGLE, to nie usłyszysz jego efektów, bo CIĄGLE będzie on zaczynany. Dopiero gry wyjedziesz kursorem z tekstu, to dźwięk zostanie w pełni odtworzony, bo nie jest przerywany kolejnym wywołaniem. Rozumiesz?
komentarz 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Zrób warunek, który spowoduje, że metoda play() wywoła się tylko RAZ w trakcie spełnienia warunku z tym kursorem. Jakiś bool lub cokolwiek. Napisz, jaki efekt.
komentarz 20 lipca 2015 przez niezalogowany
ok teraz wszystko rozumiem tylko nie mam pomysłu jak to wcielić w  zycie :(
komentarz 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Zrób zmienną typu bool. Jeśli będzie ona na true, to if się wykona, jeśli na false, to nie. Więc daj jej początkową wartość na true i w samym if-ie nadaj jej wartość false. W else nadaj jej znowu wartość true.
0 głosów
odpowiedź 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)

Oto kod do komentarza:

bool zmienna = true;
//...
if(tekst[i].getGlobalBounds().contains(Mysz) && zmienna)
{
//...
zmienna = false;
}
else
{
//..
zmienna = true;
}
//...

 

komentarz 20 lipca 2015 przez niezalogowany
nic z tego dalej ten sam efekt
komentarz 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Wiesz, ja nie miałem styczności z dźwiękami w SFML, więc mogę się mylić. Jeśli metoda play() powoduje rozpoczęcie odtwarzania dźwięku, to nie rozumiem, dlaczego nie działa. Może coś źle zrobiłeś? Sprawdź jeszcze raz kod, a ja spróbuję zrobić to u siebie.
komentarz 20 lipca 2015 przez niezalogowany

udało mi się zrobić tak że jak mam zmieną na true i najadę na napis to się dźwięk odgrywa...i wszystko super działa tylko jak dźwięk się odegra zmieniam zmienną na false i jak potem najadę na ten tekst myszą to już się dźwięk drugi raz nie odegra bo zmienna jest zmieniona na false ale jak dam żeby w else zminiało zmienną z powrotem na true tak jak ty proponowałeś to znów zaczyna się bła od którego zaczełem czyli dzwięk się odgrywa bo zmianie pozycji kursora

komentarz 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Troszkę nie rozumiem, co mi próbujesz przekazać. Moim zdaniem powinno być tak, że gdy najedziesz kursorem na tekst, to odtwarza się dźwięk i odtwarza się nadal, nawet, gdy zjedziesz kursorem z tekstu. Ale jeśli najedziesz kolejny raz na tekst, przed zakończeniem tamtego dźwięku, to zacznie od odtwarzać się od nowa. Czy jest tak u ciebie?
komentarz 20 lipca 2015 przez niezalogowany

chodzi mo o to ze teraz ma to tak zrobione 

bool nieodegrano = true;

for(int i=0; i<ile; i++)
		{
			if(tekst[i].getGlobalBounds().contains(Mysz))
			{
				tekst[i].setColor(Color(46, 46, 46));
				if(nieodegrano == true)
				{
					dzwiek.play();
					nieodegrano = false;
				}
			}
			else
			{
				tekst[i].setColor(Color(235, 235, 225));
			}
			
		}
		

i teraz to działa dokładnie jak chcę tylko problem w tym że jak dźwięk się wykona tylko raz i po wykonaniu zmienna jest zaminia na FALSE to wartość tej zmiennej zostaje na stałe i 2-raz odegranie dźwięku jest niemożliwe

i jak w else tego całego if dam żeby zmienna zmieniała się na true to wszystko się psuje!

 

(teraz coś rozumiesz ?)

komentarz 20 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
A zrobiłeś TAK SAMO, jak ja podałem przykład? Analizowałem ten kod i powinno działać, nie boję się użyć, na 100%.
komentarz 21 lipca 2015 przez niezalogowany
zrobiłem wcześniej tak jak ty też nie działało
komentarz 21 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Czekaj, robię przykład. Sorki, że to tak długo trwa, ale nie mam dziesięć rąk :D
0 głosów
odpowiedź 21 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)

Oto kod przystosowany do twojego projektu:

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "TEST");

    sf::Font font;
    font.loadFromFile("HussarPrintA.otf");

    sf::Text text[3];
    text[0] = sf::Text("NAPIS_1", font, 30);
    text[0].setPosition(sf::Vector2f(0, 0));
    text[1] = sf::Text("NAPIS_2", font, 30);
    text[1].setPosition(sf::Vector2f(0, 100));
    text[2] = sf::Text("NAPIS_3", font, 30);
    text[2].setPosition(sf::Vector2f(0, 200));

    sf::SoundBuffer sound_buffer;
    sound_buffer.loadFromFile("shot.ogg");

    sf::Sound sound(sound_buffer);

    bool zmienna[3];
    zmienna[0] = true;
    zmienna[1] = true;
    zmienna[2] = true;

    while(window.isOpen())
    {
        sf::Vector2f mouse(sf::Mouse::getPosition(window));

        sf::Event event;
        while(window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
                window.close();
        }
        for(int i = 0; i < 3; i++)
        {
            if(text[i].getGlobalBounds().contains(mouse) && zmienna[i])
            {
                sound.play();
                zmienna[i] = false;
            }
            else
            {
                text[i].setColor(sf::Color(255, 255, 255));
            }

            if(zmienna[i])
                text[i].setColor(sf::Color(255, 0, 255));

            if(!text[i].getGlobalBounds().contains(mouse))
                zmienna[i] = true;
        }
        window.clear();
        window.draw(text[0]);
        window.draw(text[1]);
        window.draw(text[2]);
        window.display();
    }

    return 0;
}

 

0 głosów
odpowiedź 21 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
edycja 21 lipca 2015 przez Patrycjerz

Niemożliwe, ale mam jeszcze lepszą wersję kodu, już bez zmiennych bool (wystarczyło chwile posiedzieć i pomyśleć, bo coś myślałem, że nie są one potrzebne smiley).

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "TEST");

    sf::Font font;
    font.loadFromFile("HussarPrintA.otf");

    sf::Text text[3];
    text[0] = sf::Text("NAPIS_1", font, 30);
    text[0].setPosition(sf::Vector2f(0, 0));
    text[1] = sf::Text("NAPIS_2", font, 30);
    text[1].setPosition(sf::Vector2f(0, 100));
    text[2] = sf::Text("NAPIS_3", font, 30);
    text[2].setPosition(sf::Vector2f(0, 200));

    sf::SoundBuffer sound_buffer;
    sound_buffer.loadFromFile("shot.ogg");

    sf::Sound sound(sound_buffer);

    while(window.isOpen())
    {
        sf::Vector2f mouse(sf::Mouse::getPosition(window));

        sf::Event event;
        while(window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
                window.close();
        }
        for(int i = 0; i < 3; i++)
        {
            if(text[i].getGlobalBounds().contains(mouse) && (text[i].getColor() == sf::Color(255, 0, 255)))
            {
                text[i].setColor(sf::Color(255, 255, 255));
                sound.play();
            }
            if(!text[i].getGlobalBounds().contains(mouse))
            {
                text[i].setColor(sf::Color(255, 0, 255));
            }
        }
        window.clear();
        window.draw(text[0]);
        window.draw(text[1]);
        window.draw(text[2]);
        window.display();
    }

    return 0;
}

 

komentarz 21 lipca 2015 przez Patrycjerz Mędrzec (192,320 p.)
Lepszy efekt, czyli nie wyłączający się dźwięk przy najechaniu na następny tekst, uzyskasz, kiedy stworzysz tablicę dźwięków, z liczbą elementów taką samą, jak liczba tekstów i będziesz je wywoływać odpowiednio w pętli dla każdego tekstu.
komentarz 21 lipca 2015 przez niezalogowany
Ooooo....WIELKIE dzięki trochę zabawy z tym było ale już wszystko działa tak jak chciałem

Podobne pytania

0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 21 grudnia 2015 w C i C++ przez patryk16 Obywatel (1,080 p.)
0 głosów
1 odpowiedź 340 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez Milesq Nałogowiec (32,020 p.)
0 głosów
2 odpowiedzi 230 wizyt
pytanie zadane 2 października 2023 w JavaScript przez TOWaD Mądrala (6,000 p.)

92,615 zapytań

141,465 odpowiedzi

319,782 komentarzy

61,997 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!

...