diff --git a/seminar11_events/01_select_move_delete/context_menu.hpp b/seminar11_events/01_select_move_delete/context_menu.hpp index ccb4318..bbccf76 100644 --- a/seminar11_events/01_select_move_delete/context_menu.hpp +++ b/seminar11_events/01_select_move_delete/context_menu.hpp @@ -140,4 +140,39 @@ public: return -1; } -}; \ No newline at end of file + +int main() +{ + sf::RenderWindow window(sf::VideoMode(500, 500), "Slider!"); + window.setFramerateLimit(60); + + SliderSFML slider1(100, 100); + SliderSFML slider2(100, 200); + SliderSFML slider3(100, 300); + + slider1.create(20, 450); + slider2.create(0, 200); + slider3.create(0, 100); + + slider1.setSliderValue(235); + + while (window.isOpen()) + { + sf::Event event; + while (window.pollEvent(event)) + { + if (event.type == sf::Event::Closed) + window.close(); + } + + window.clear(sf::Color(25,29,33)); + + slider1.draw(window); + slider2.draw(window); + slider3.draw(window); + + window.display(); + } + + return 0; +}}; diff --git a/seminar11_events/01_select_move_delete/select_move_delete.cpp b/seminar11_events/01_select_move_delete/select_move_delete.cpp index 581a12a..07e029a 100644 --- a/seminar11_events/01_select_move_delete/select_move_delete.cpp +++ b/seminar11_events/01_select_move_delete/select_move_delete.cpp @@ -7,17 +7,24 @@ using namespace std; +void meow() {;} + +// Вспомогательные функции, вычисляет расстояние между двумя точками float distance(sf::Vector2f start, sf::Vector2f finish) { return sqrtf((start.x - finish.x)*(start.x - finish.x) + (start.y - finish.y)*(start.y - finish.y)); } +// Вспомогательные функции, рисует линию на холсте окна window void drawLine(sf::RenderWindow& window, sf::Vector2f start, sf::Vector2f finish, sf::Color color = sf::Color::White) { sf::Vertex line_vertices[2] = {sf::Vertex(start, color), sf::Vertex(finish, color)}; window.draw(line_vertices, 2, sf::Lines); } +// Вспомагательный класс, описывет шарик +// position - положение шарика; radius - радиус +// is_chosen - говорит о том, выбран ли шарик или нет struct Ball { sf::Vector2f position; @@ -30,15 +37,19 @@ struct Ball isChoosen = false; } + // Метод, который рисует шарик на холстек окна window void draw(sf::RenderWindow& window) const { + // Тут рисуем белый кружочек sf::CircleShape circle(radius); circle.setFillColor(color); circle.setOrigin({radius, radius}); circle.setPosition(position); window.draw(circle); + // Если шарик выбран if (isChoosen) { + // То рисуем "уголки" const float fraction = 0.7; drawLine(window, {position.x - radius, position.y + radius}, {position.x - radius, position.y + radius*fraction}); drawLine(window, {position.x - radius, position.y + radius}, {position.x - fraction * radius, position.y + radius}); @@ -68,6 +79,11 @@ void deleteChoosen(list& balls) { else ++it; } +#ifdef _DEBUG + for (list::iterator it = balls.begin(); it != balls.end(); ++it) + cout << it->position.x <<" " << it->position.y<< endl; + cout << "###" << endl; +#endif } void copyBalls(list& balls, list& buffer) { @@ -102,6 +118,9 @@ int main() sf::RenderWindow window(sf::VideoMode(800, 600), "Select, Move, Delete!", sf::Style::Default, settings); window.setFramerateLimit(60); + + // Создаём связный список из шариков + // Связный список -- потому что нам нужно будет постоянно удалять и добавлять в этот список std::list balls; balls.push_back(Ball({200, 200}, 26)); balls.push_back(Ball({400, 300}, 20)); @@ -112,15 +131,19 @@ int main() list buffer{}; + // Создаём прямоугольник выделения + // Обратите внимание на четвёртый параметр sf::Color(150, 150, 240, 50) + // Это alpha - прозрачность 0 = полностью прозрачный 255 = непрозрачный sf::RectangleShape selectionRect; selectionRect.setFillColor(sf::Color(150, 150, 240, 50)); selectionRect.setOutlineColor(sf::Color(200, 200, 255)); selectionRect.setOutlineThickness(1); + // Специальная переменная, которая будет показывать, что мы находимся в режиме выделения bool isSelecting = false; - /* "Режим выделения" */ + // "Режим выделения" bool isMovingMode = false; - /* Необходимо, чтоб в режиме выделения считать смещение */ + // Необходимо, чтоб в режиме выделения считать смещение Ball* selected_ball = nullptr; bool isContextMenu = false; @@ -249,25 +272,29 @@ int main() isMovingMode = false; isContextMenu = false; } + /*2check*/ + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space)) + recolorChoosen(balls); + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Delete)) { + deleteChoosen(balls); + } - if (event.type == sf::Event::KeyPressed) { + /**/ + if (event.type == sf::Event::KeyPressed) if (event.key.code == sf::Keyboard::C) - if (sf::Keyboard::isKeyPressed(sf::Keyboard::LControl)) + if (sf::Keyboard::isKeyPressed(sf::Keyboard::LControl)) { copyBalls(balls, buffer); + } + if (event.type == sf::Event::KeyPressed) if (event.key.code == sf::Keyboard::V) if (sf::Keyboard::isKeyPressed(sf::Keyboard::LControl)) pasteBalls(balls, buffer); + if (event.type == sf::Event::KeyPressed) if (event.key.code == sf::Keyboard::X) if (sf::Keyboard::isKeyPressed(sf::Keyboard::LControl)) { copyBalls(balls, buffer); deleteChoosen(balls); - } - if (event.key.code == sf::Keyboard::Space) - recolorChoosen(balls); - if (event.key.code == sf::Keyboard::Delete) { - deleteChoosen(balls); - } - } + } } window.clear(sf::Color::Black); diff --git a/seminar11_events/02_slider/Makefile b/seminar11_events/02_slider/Makefile deleted file mode 100644 index 579a8f1..0000000 --- a/seminar11_events/02_slider/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -build: - g++ ./slider.cpp -std=c++11 -o slider -lsfml-graphics -lsfml-window -lsfml-system -build_debug: - g++ ./slider.cpp -std=c++11 -o slider -lsfml-graphics -lsfml-window -lsfml-system -D_DEBUG -build_circle: - g++ ./circle.cpp -std=c++11 -o circle -lsfml-graphics -lsfml-window -lsfml-system diff --git a/seminar11_events/02_slider/circle.cpp b/seminar11_events/02_slider/circle.cpp deleted file mode 100644 index 9d7b609..0000000 --- a/seminar11_events/02_slider/circle.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include -#include "slider.hpp" - -int main() -{ - int result; - unsigned char r, g, b; - - sf::RenderWindow window(sf::VideoMode(800, 600), "Slider"); - window.setFramerateLimit(60); - - sf::Font font; - if (!font.loadFromFile("consolas.ttf")) { - std::cout << "Can't load button font" << std::endl; - } - - Slider slider(window, font, sf::Vector2f{200, 100}, 10, 250); - - Slider slider_r(window, font, sf::Vector2f{800, 200}, 0, 255); - Slider slider_g(window, font, sf::Vector2f{800, 300}, 0, 255); - Slider slider_b(window, font, sf::Vector2f{800, 400}, 0, 255); - - sf::CircleShape circle(10); - circle.setPosition(sf::Vector2f{400, 400}); - - while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) { - if (event.type == sf::Event::Closed) { - window.close(); - } - - result = slider.handleEvent(event); - - /* Centering of the circle */ - circle.setPosition(circle.getPosition() + sf::Vector2f{circle.getRadius() - result, circle.getRadius() - result}); - circle.setRadius(result); - - r = slider_r.handleEvent(event); - g = slider_g.handleEvent(event); - b = slider_b.handleEvent(event); - circle.setFillColor(sf::Color{r, g, b}); - } - window.clear(sf::Color::Black); - - slider.draw(); - slider_r.draw(); - slider_g.draw(); - slider_b.draw(); - - window.draw(circle); - window.display(); - } - return 0; -} diff --git a/seminar11_events/02_slider/consolas.ttf b/seminar11_events/02_slider/consolas.ttf deleted file mode 100644 index a79deb5..0000000 Binary files a/seminar11_events/02_slider/consolas.ttf and /dev/null differ diff --git a/seminar11_events/02_slider/slider.cpp b/seminar11_events/02_slider/slider.cpp deleted file mode 100644 index 792be9b..0000000 --- a/seminar11_events/02_slider/slider.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include -#include "slider.hpp" - -int main() -{ - int result; - - sf::RenderWindow window(sf::VideoMode(800, 600), "Slider"); - window.setFramerateLimit(60); - - sf::Font font; - if (!font.loadFromFile("consolas.ttf")) { - std::cout << "Can't load button font" << std::endl; - } - - Slider slider(window, font); - - while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) { - if (event.type == sf::Event::Closed) { - window.close(); - } - - result = slider.handleEvent(event); - std::cout << result << std::endl; - } - window.clear(sf::Color::Black); - - slider.draw(); - window.display(); - } - return 0; -} diff --git a/seminar11_events/02_slider/slider.hpp b/seminar11_events/02_slider/slider.hpp deleted file mode 100644 index dd6944b..0000000 --- a/seminar11_events/02_slider/slider.hpp +++ /dev/null @@ -1,113 +0,0 @@ -#pragma once -#include -#include -#include - -class Slider -{ -private: - const int kCharacterSize = 14; - - int mMinValue; - int mMaxValue; - float mSliderPosition = 0; - - sf::RenderWindow& mRenderWindow; - sf::RectangleShape mSlider; - sf::RectangleShape mAxis; - sf::Text mText; - - bool mIsPressed = false; - - void onMousePressed(const sf::Event& event) - { - if (event.mouseButton.button == sf::Mouse::Left) { - sf::Vector2f mousePosition = mRenderWindow.mapPixelToCoords({event.mouseButton.x, event.mouseButton.y}); - if (mSlider.getGlobalBounds().contains(mousePosition)) - mIsPressed = true; - else if (mAxis.getGlobalBounds().contains(mousePosition)) - { - mIsPressed = true; - if (mousePosition.x + mSlider.getSize().x <= mAxis.getPosition().x + mAxis.getSize().x) { - mSlider.setPosition({mousePosition.x, mSlider.getPosition().y}); - mSliderPosition = (mSlider.getPosition().x - mAxis.getPosition().x) / (mAxis.getSize().x - mSlider.getSize().x); - } - else { - mSlider.setPosition({mAxis.getPosition().x + mAxis.getSize().x - mSlider.getSize().x, mSlider.getPosition().y}); - mSliderPosition = 1; - } - } - } - } - - void onMouseMove(const sf::Event& event) - { - if (!mIsPressed) { - return; - } - sf::Vector2f mousePosition = mRenderWindow.mapPixelToCoords({event.mouseMove.x, event.mouseMove.y}); - if ((mousePosition.x >= mAxis.getPosition().x) && (mousePosition.x + mSlider.getSize().x <= mAxis.getPosition().x + mAxis.getSize().x)) { - mSlider.setPosition({mousePosition.x, mSlider.getPosition().y}); - } - else if (mousePosition.x < mAxis.getPosition().x) { - mSlider.setPosition({mAxis.getPosition().x, mSlider.getPosition().y}); - } - else if (mousePosition.x + mSlider.getSize().x > mAxis.getPosition().x + mAxis.getSize().x) { - mSlider.setPosition({mAxis.getPosition().x + mAxis.getSize().x - mSlider.getSize().x, mSlider.getPosition().y}); - } - - mSliderPosition = (mSlider.getPosition().x - mAxis.getPosition().x) / (mAxis.getSize().x - mSlider.getSize().x); - - } - -public: - - Slider(sf::RenderWindow& window, const sf::Font& font, sf::Vector2f position = {100,200},int min = 0, int max = 100) : mRenderWindow(window) - { - mSlider.setFillColor(sf::Color::Red); - mSlider.setSize({10,30}); - mSlider.setPosition(position - sf::Vector2f{0, 10}); - mSlider.setOutlineColor(sf::Color::Black); - mSlider.setOutlineThickness(2); - - mAxis.setFillColor(sf::Color::White); - mAxis.setSize({500,10}); - mAxis.setPosition(position); - - std::stringstream ss; - ss << mMinValue; - mText.setString(ss.str()); - mText.setFont(font); - mText.setCharacterSize(kCharacterSize); - mText.setFillColor(sf::Color::White); - mText.setPosition(position + sf::Vector2f{mAxis.getSize().x + 10, -4}); - - mMinValue = min; - mMaxValue = max; - mIsPressed = false; - } - - void draw() - { - std::stringstream ss; - ss << mMinValue + (mMaxValue - mMinValue) * mSliderPosition; - mText.setString(ss.str()); - - mRenderWindow.draw(mAxis); - mRenderWindow.draw(mSlider); - mRenderWindow.draw(mText); - } - - int handleEvent(const sf::Event& event) { - if (event.type == sf::Event::MouseMoved) { - onMouseMove(event); - } - else if (event.type == sf::Event::MouseButtonPressed) { - onMousePressed(event); - } - else if (event.type == sf::Event::MouseButtonReleased) { - mIsPressed = false; - } - return mMinValue + (mMaxValue - mMinValue) * mSliderPosition; - } -};