Skocz do zawarto┼Ťci
smmsz1

Problem z przyciskiem wielofunkcyjnym w SFML

Pomocna odpowied┼║

Napisano (edytowany)

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

Udost─Öpnij ten post


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())?

Udost─Öpnij ten post


Link to post
Share on other sites

Troch─Ö to problematyczne bo metody pause() i play() s─ů typu void

Udost─Öpnij ten post


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

Udost─Öpnij ten post


Link to post
Share on other sites
Zarejestruj si─Ö lub zaloguj, aby ukry─ç t─Ö reklam─Ö.

jlcpcb.jpg

jlcpcb.jpg

Szukasz producenta PCB? Sprawd┼║ firm─Ö JLCPCB. Dlaczego warto?
┬á┬á ÔÇó Prototypy PCB 2-warstwowe za 2$ (gotowe w 24 godziny)
┬á┬á ÔÇó Prototypy PCB 4-warstwowe za 5$
┬á┬á ÔÇó Monta┼╝ SMT od 7$
┬á┬á ÔÇó Produkcja w profesjonalnej fabryce (zobacz film)
Sprawd┼║ te┼╝ ┬╗ Jak powstaje PCB? Wycieczka po fabryce

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