Skocz do zawarto艣ci

Problem z przyciskiem wielofunkcyjnym w SFML


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 to post
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 to post
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 to post
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.