Skocz do zawartości

Problem z przyciskiem wielofunkcyjnym w SFML


smmsz1

Pomocna odpowiedź

Witam 🙂
 

Piszę małą grę w C++ korzystając z SFML i natknąłem się na pewien problem programistyczny. Mam klasę Button dziedziczącą po klasie sf::RectangleShape. Tworze sobie kilka obiektów tej klasy będących przyciskami w menu gry. Problem pojawią się gdy któryś przycisk ma pełnić więcej niż jedną funkcję tak jak przycisk odpowiedzialny za obsługę muzyki. Po jego kliknięciu na obiekcie klasy sf::Music wywołuje metode pause. Chciałbym żeby wtedy ten sam przycisk był odpowiedzialny za ponowne uruchomienie muzyki metodą play, a potem za ponowne pauzowanie. Czy ktoś ma jakiś pomysł jak to zakodować? Ewentualną opcją jest podmiana przycisków. Przy wszelkich próbach rozwiązania problemu spotykam się z wzajemnym negowaniem obu funkcjonalności.

Wklejam kod klasy Button

Plik .h:

#pragma once

#include <SFML/Window.hpp>

#include <SFML/Graphics.hpp>

#include <SFML/Audio.hpp>

#include<iostream>

class Button : public sf::RectangleShape

{

public:

Button(float pos_x,float pos_y, float size_x,float size_y,const std::string &nazwa_pliku);

void load_texture(const std::string& file_name);

void zamykanie(sf::RenderWindow &window,const sf::Event &event);

void instrukcja(sf::RenderWindow &window,const sf::Event &event);

void pauzowanie(sf::RenderWindow &window,const sf::Event &event,sf::Music &music,int &a,int&b);

void startowanie(sf::RenderWindow &window,const sf::Event &event,int &a,int &b);

void granie(sf::RenderWindow &window,const sf::Event &event,sf::Music &music,int&a,int&b);

private:

sf::Texture texture_;

};

 

plik .cpp:

#include "include.h"



Button::Button(float pos_x,float pos_y, float siz_x,float siz_y,const std::string &nazwa_pliku)

{

setPosition(pos_x,pos_y);

setSize(sf::Vector2f(siz_x,siz_y));

load_texture(nazwa_pliku);





}

void Button:: load_texture(const std::string& file_name)

{

if (!texture_.loadFromFile(file_name)) {

std::cerr << "Could not load texture" << std::endl;

}

else

{

setTexture(&texture_);



}

}



void Button::zamykanie(sf::RenderWindow &window,const sf::Event &event)

{

if (event.type == sf::Event::MouseButtonPressed) {

if(event.mouseButton.button == sf::Mouse::Left) {

sf::Vector2i mouse_pos = sf::Mouse::getPosition(window);

sf::FloatRect bounds = getGlobalBounds();

if(bounds.left<=mouse_pos.x && bounds.left+bounds.width>=mouse_pos.x)

{

if(bounds.top<=mouse_pos.y && bounds.top+bounds.height>=mouse_pos.y)

{



window.close();

}

}

}





}

}



void Button::startowanie(sf::RenderWindow &window, const sf::Event &event,int &a,int &b)

{



if (event.type == sf::Event::MouseButtonPressed) {

if(event.mouseButton.button == sf::Mouse::Left) {

sf::Vector2i mouse_pos = sf::Mouse::getPosition(window);

sf::FloatRect bounds = getGlobalBounds();

if(bounds.left<=mouse_pos.x && bounds.left+bounds.width>=mouse_pos.x)

{

if(bounds.top<=mouse_pos.y && bounds.top+bounds.height>=mouse_pos.y)

{

a=0;

b=0;



}

}

}





}

}

void Button::instrukcja(sf::RenderWindow &window, const sf::Event &event)

{

Background tlo_instrukcji("tlo_instrukcji.png");

// Button przycisk_start(0,520,200,80,"przycisk_start.png");

if (event.type == sf::Event::MouseButtonPressed) {

if(event.mouseButton.button == sf::Mouse::Left) {

sf::Vector2i mouse_pos = sf::Mouse::getPosition(window);

sf::FloatRect bounds = getGlobalBounds();

if(bounds.left<=mouse_pos.x && bounds.left+bounds.width>=mouse_pos.x)

{

if(bounds.top<=mouse_pos.y && bounds.top+bounds.height>=mouse_pos.y)

{

window.draw(tlo_instrukcji);





}

}

}





}

}







void Button::granie(sf::RenderWindow &window, const sf::Event &event, sf::Music &music,int&a,int&b)

{

if (event.type == sf::Event::MouseButtonPressed) {

if(event.mouseButton.button == sf::Mouse::Left) {

sf::Vector2i mouse_pos = sf::Mouse::getPosition(window);

sf::FloatRect bounds = getGlobalBounds();

if(bounds.left<=mouse_pos.x && bounds.left+bounds.width>=mouse_pos.x)

{

if(bounds.top<=mouse_pos.y && bounds.top+bounds.height>=mouse_pos.y)

{

music.play();







}

}

}





}





}

void Button::pauzowanie(sf::RenderWindow &window, const sf::Event &event, sf::Music &music,int &a,int&b)

{

if (event.type == sf::Event::MouseButtonPressed) {

if(event.mouseButton.button == sf::Mouse::Left) {

sf::Vector2i mouse_pos = sf::Mouse::getPosition(window);

sf::FloatRect bounds = getGlobalBounds();

if(bounds.left<=mouse_pos.x && bounds.left+bounds.width>=mouse_pos.x)

{

if(bounds.top<=mouse_pos.y && bounds.top+bounds.height>=mouse_pos.y)

{

music.pause();







}

}

}





}





}

 

 

Z góry dziękuje za każdą odpowiedź  🙂

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu
Link do komentarza
Share on other sites

Nie możesz w jakiejś zmiennej przechowywać informacji, czy muzyka jest uruchomiona (ewentualnie inaczej to sprawdzać) i na tej podstawie uruchamiać odpowiednią metodę play() lub pause() w jednej metodzie klasy Button (zastępującej metody pauzowanie() i granie())?

Link do komentarza
Share on other sites

No to co?

Dorób metodę np. music() w stylu:
 

if (isPlaying) {
	pause();
	isPlaying = false;
}
else {
	play();
	isPlaying=true:
}

i ją wywołuj. isPlaying to jakaś zmienna prywatna typu bool (ew. statyczna, jeśli music() będzie zwykłą funkcją a nie metodą). Ja tu nie widzę konieczności żeby pause() i play() były innego typu niż void...

A nie masz tam jakiej metody zwracającej Ci czy muzyka gra czy się skończyła? Bo wtedy można bez tej zmiennej...

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.