22#include < Windows.h>
33#include " terrarium.h"
44#include < iostream>
5+ struct Button {
6+ sf::Vector2f position;
7+ sf::Vector2f size;
8+ std::string name;
9+ sf::Text text;
10+ sf::RectangleShape shape;
11+ sf::Font arial;
12+ Button (sf::Vector2f pozycja, sf::Vector2f rozmiar, std::string nazwa) {
13+ position = pozycja;
14+ size = rozmiar;
15+ name = nazwa;
16+ if (!initializeFonts ())
17+ return ;
18+
19+ text.setFont (arial);
20+ text.setString (name);
21+ text.setOrigin (sf::Vector2f (text.getGlobalBounds ().width / 2 ,
22+ text.getGlobalBounds ().height / 2 +10 ));
23+ text.setPosition (position);
24+ shape.setSize (size);
25+ shape.setFillColor (sf::Color (100 , 200 , 100 , 255 ));
26+ shape.setOrigin (sf::Vector2f (shape.getGlobalBounds ().width / 2 ,
27+ shape.getGlobalBounds ().height / 2 ));
28+ shape.setPosition (position);
29+ }
30+ bool initializeFonts () {
31+ if (!arial.loadFromFile (" C:/Windows/Fonts/Arial.ttf" )) {
32+ std::cout << " Nie udalo sie wczytaæ czcionki\n " ;
33+ return false ;
34+ }
35+ return true ;
36+ }
37+ bool isClicked (sf::Vector2i localPosition) {
38+ if (sf::Mouse::isButtonPressed (sf::Mouse::Left)) {
39+ if (shape.getGlobalBounds ().contains (sf::Vector2f (localPosition))) {
40+ return true ;
41+ }
42+ }
43+ return false ;
44+ }
45+ void setString (std::string newName) {
46+ text.setString (newName);
47+ text.setOrigin (sf::Vector2f (text.getGlobalBounds ().width / 2 ,
48+ text.getGlobalBounds ().height / 2 + 10 ));
49+ }
50+
51+ };
552int main ()// przetwarza sterowanie u¿ytkownika, renderuje okno, tworzy obiekt gry
653{
7- Terrarium terrarium = Terrarium (Terrarium::mapType::pusta);
8- // obiekt ktory zajmuje sie logik¹ i wyœwietlaniem gry
9- int windowWidth= terrarium.rozmiarPlanszy * 50 ,
10- windowHeight= terrarium.rozmiarPlanszy * 50 ;
11- sf::Clock fruitClock, gameClock; // zegary gry
12- sf::RenderWindow window (
13- sf::VideoMode (windowWidth, windowHeight),
14- " Snake" );
15- unsigned int fps = 60 ;
16- window.setFramerateLimit (fps);
17- while (window.isOpen ())
18- {
19- sf::Event event;
20- while (
21- window.pollEvent (event)) {
22- switch (event.type ) {
23- case sf::Event::Closed:
24- window.close ();
25- break ;
26- case sf::Event::KeyPressed:
27- switch (event.key .code ) {
28- case sf::Keyboard::Escape:
29- window.close ();
30- break ;
31- case sf::Keyboard::Up:
32- if (terrarium.typRuchu != Terrarium::moveType::down)
33- terrarium.changeDirection (Terrarium::moveType::up);
34- break ;
35- case sf::Keyboard::Down:
36- if (terrarium.typRuchu != Terrarium::moveType::up)
37- terrarium.changeDirection (Terrarium::moveType::down);
38- break ;
39- case sf::Keyboard::Right:
40- if (terrarium.typRuchu != Terrarium::moveType::left)
41- terrarium.changeDirection (Terrarium::moveType::right);
42- break ;
43- case sf::Keyboard::Left:
44- if (terrarium.typRuchu != Terrarium::moveType::right)
45- terrarium.changeDirection (Terrarium::moveType::left);
54+ bool isEnd=true ;
55+ while (isEnd) {
56+ Terrarium::mapType selectedMapType = Terrarium::mapType::pusta;
57+ sf::RenderWindow menu (sf::VideoMode (400 , 400 ), " Menu" );
58+ menu.setFramerateLimit (60 );
59+ bool isGameStarted = false ;
60+ Button startButton (sf::Vector2f (200 , 150 ), sf::Vector2f (140 .f , 50 .f ), " Start" );
61+ Button mapTypeButton (sf::Vector2f (200 , 225 ), sf::Vector2f (140 .f , 50 .f ), " Pusta" );
62+ Button quitButton (sf::Vector2f (200 , 350 ), sf::Vector2f (140 .f , 50 .f ), " Wyjdz" );
63+ sf::Text gameName;
64+ gameName.setFont (startButton.arial );
65+ gameName.setCharacterSize (50 );
66+ gameName.setFillColor (sf::Color (20 , 255 , 30 , 255 ));
67+ gameName.setString (" SNAKE" );
68+ gameName.setStyle (sf::Text::Bold);
69+ gameName.setPosition (sf::Vector2f (200 , 50 ));
70+ gameName.setOrigin (sf::Vector2f (gameName.getGlobalBounds ().width / 2 ,
71+ gameName.getGlobalBounds ().height / 2 + 10 ));
72+ while (menu.isOpen ()) {
73+ sf::Event event;
74+ while (
75+ menu.pollEvent (event)) {
76+ switch (event.type ) {
77+ case sf::Event::Closed:
78+ menu.close ();
4679 break ;
4780 }
48- // zmiana kierunku poruszania siê wê¿a
49- // niedozwolona jest zmiana kierunku o 180 stopni
50- break ;
51- default :
52- break ;
81+ sf::Vector2i localPosition = sf::Mouse::getPosition (menu);
82+ if (startButton.isClicked (localPosition)) {
83+ isGameStarted = true ;
84+ menu.close ();
85+ }else
86+ if (mapTypeButton.isClicked (localPosition)) {
87+ switch (selectedMapType) {
88+ case Terrarium::mapType::pusta:
89+ selectedMapType = Terrarium::mapType::granice;
90+ mapTypeButton.setString (" Granice" );
91+ break ;
92+ case Terrarium::mapType::granice:
93+ selectedMapType = Terrarium::mapType::labirynt;
94+ mapTypeButton.setString (" Labirynt" );
95+ break ;
96+ case Terrarium::mapType::labirynt:
97+ selectedMapType = Terrarium::mapType::pusta;
98+ mapTypeButton.setString (" Pusta" );
99+ break ;
100+ }
101+ }
102+ else if (quitButton.isClicked (localPosition)) {
103+ isEnd = false ;
104+ return 0 ;
105+ }
106+ }
107+
108+
109+ menu.clear ();
110+ menu.draw (gameName);
111+ menu.draw (startButton.shape );
112+ menu.draw (startButton.text );
113+ menu.draw (mapTypeButton.shape );
114+ menu.draw (mapTypeButton.text );
115+ menu.draw (quitButton.shape );
116+ menu.draw (quitButton.text );
117+ menu.display ();
118+ }
119+
120+ if (isGameStarted) {
121+
122+ Terrarium terrarium = Terrarium (selectedMapType);
123+ // obiekt ktory zajmuje sie logik¹ i wyœwietlaniem gry
124+ int windowWidth = terrarium.getRozmiarPlanszy () * 50 ,
125+ windowHeight = terrarium.getRozmiarPlanszy () * 50 ;
126+ sf::Clock fruitClock, gameClock; // zegary gry
127+ sf::RenderWindow window (
128+ sf::VideoMode (windowWidth, windowHeight),
129+ " Snake" );
130+
131+ unsigned int fps = 60 ;
132+ window.setFramerateLimit (fps);
133+ while (window.isOpen ())
134+ {
135+ sf::Event event;
136+ while (
137+ window.pollEvent (event)) {
138+ switch (event.type ) {
139+ case sf::Event::Closed:
140+ window.close ();
141+ break ;
142+ case sf::Event::KeyPressed:
143+ switch (event.key .code ) {
144+ case sf::Keyboard::Escape:
145+ window.close ();
146+ break ;
147+ case sf::Keyboard::Up:
148+ if (terrarium.getTypRuchu () != Terrarium::moveType::down)
149+ terrarium.changeDirection (Terrarium::moveType::up);
150+ break ;
151+ case sf::Keyboard::Down:
152+ if (terrarium.getTypRuchu () != Terrarium::moveType::up)
153+ terrarium.changeDirection (Terrarium::moveType::down);
154+ break ;
155+ case sf::Keyboard::Right:
156+ if (terrarium.getTypRuchu () != Terrarium::moveType::left)
157+ terrarium.changeDirection (Terrarium::moveType::right);
158+ break ;
159+ case sf::Keyboard::Left:
160+ if (terrarium.getTypRuchu () != Terrarium::moveType::right)
161+ terrarium.changeDirection (Terrarium::moveType::left);
162+ break ;
163+ }
164+ // zmiana kierunku poruszania siê wê¿a
165+ // niedozwolona jest zmiana kierunku o 180 stopni
166+ break ;
167+ default :
168+ break ;
169+ }
170+ }
171+ window.clear ();
172+ terrarium.updateGameState (&window, &gameClock, &fruitClock);
173+ window.display ();
53174 }
54175 }
55- window.clear ();
56- terrarium.updateGameState (&window,&gameClock,&fruitClock);
57- window.display ();
58176 }
59177 return 0 ;
60178}
0 commit comments