Bonsoir tout le monde,
je commence � peine � comprendre quelques notions du C++ en utilisant la librairie SFML comme me l'a conseill� "ternel" , mais il y a une chose tr�s importante, et que je n'arrive toujours pas � cerner, c'est les �v�nements, chaque librairie graphique propose sa propre m�thode de gestion d'�v�nement (Signal/Slot) pour Qt par exemple, m�me chose pour le projet TGUI issu de SFML. Mais l� (en SFML tout court), je ne trouve que la boucle principale, donc ma question est : comment je pourrais g�rer un ou plusieurs �v�nements pour chaque �l�ment graphique (un primitif) ?
voici ce que j'ai pu cr�er avec la boucle principale, le probl�me c'est que l'�v�nement au lieu d'�tre partag� il est dupliqu� (j'avais essay� avec des fonctions static mais le r�sultat �tait pire) :
Main :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 #include <SFML/Graphics.hpp> #include <iostream> #include "CButton.h" int main() { sf::RenderWindow window(sf::VideoMode(800, 600), "GUITest"); std::vector<CButton> mesRec; while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) { window.close(); } if (event.type == sf::Event::Resized) { window.setView(sf::View(sf::FloatRect(0, 0, event.size.width, event.size.height))); } if (event.type == sf::Event::KeyPressed) { if(event.key.code == sf::Keyboard::A) { mesRec.push_back(CButton(50,50)); } } for(unsigned int i = 0; i < mesRec.size(); i++) { mesRec[i].movement(event); } } window.clear(sf::Color(128,128,128)); for(unsigned int i = 0; i < mesRec.size(); i++) { window.draw(mesRec[i].getbtn()); } window.display(); } return 0; }
CButton (Header)
CButton (Source)
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #ifndef CBUTTON_H #define CBUTTON_H #include <SFML/Graphics.hpp> #include <iostream> class CButton { public: CButton(); CButton(int c_width,int c_height,int c_x = 50,int c_y = 50); virtual ~CButton(); sf::RectangleShape getbtn(); void movement(sf::Event &event); private: /******************************************/ bool isInside(int x, int y); bool isPressed; bool wasInside; int xOffset; int yOffset; /******************************************/ sf::RectangleShape c_Button; }; #endif // CBUTTON_H
Je tiens � pr�ciser que ce code fonctionne (sans bug ni rien) mais je sens qu'il y a des choses qui sont mal faites. Merci pour votre aide !
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115 #include "CButton.h" CButton::CButton() :c_Button(sf::Vector2f(60,25)) { /******************************************/ isPressed = false; wasInside = false; xOffset = 0; yOffset = 0; /******************************************/ } CButton::CButton(int c_width,int c_height,int c_x,int c_y) : c_Button(sf::Vector2f(c_width,c_height)) { c_Button.setPosition(sf::Vector2f(c_x,c_y)); /**********RANDOM COLOR***********/ c_Button.setFillColor(sf::Color((rand() % 256),(rand() % 256),(rand() % 256))); /*********************************/ isPressed = false; xOffset = 0; yOffset = 0; } CButton::~CButton() { //dtor } sf::RectangleShape CButton::getbtn(){ return c_Button; } /******************************************/ void CButton::movement(sf::Event &event){ if (event.type == sf::Event::MouseButtonPressed) { if (event.mouseButton.button == sf::Mouse::Left) { std::cout << "IS PRESSED "<< std::endl; isPressed = true; wasInside = isInside(event.mouseButton.x,event.mouseButton.y); if(wasInside) { xOffset = c_Button.getPosition().x - event.mouseButton.x; yOffset = c_Button.getPosition().y - event.mouseButton.y; } } } if (event.type == sf::Event::MouseButtonReleased) { std::cout << "IS RELEASED "<< std::endl; isPressed = false; wasInside = false; } if (event.type == sf::Event::MouseMoved){ if(isPressed && wasInside){ std::cout << "IS DRAGGED "<< std::endl; c_Button.setPosition((event.mouseMove.x + xOffset),(event.mouseMove.y + yOffset)); } } } bool CButton::isInside(int x, int y){ if( x >= c_Button.getPosition().x && x <= (c_Button.getPosition().x+c_Button.getSize().x) && y >= c_Button.getPosition().y && y <= (c_Button.getPosition().y+c_Button.getSize().y)){ return true; }else{ return false; } }
Partager