From 95f02e3ce02214e0fff23ad8e24def976c36c96f Mon Sep 17 00:00:00 2001 From: nihonium Date: Wed, 4 Jan 2023 00:36:53 +0300 Subject: [PATCH] seminar11 - final --- .../01_select_move_delete/context_menu.hpp | 37 +------------- .../select_move_delete.cpp | 49 +++++-------------- 2 files changed, 12 insertions(+), 74 deletions(-) diff --git a/seminar11_events/01_select_move_delete/context_menu.hpp b/seminar11_events/01_select_move_delete/context_menu.hpp index bbccf76..ccb4318 100644 --- a/seminar11_events/01_select_move_delete/context_menu.hpp +++ b/seminar11_events/01_select_move_delete/context_menu.hpp @@ -140,39 +140,4 @@ public: return -1; } - -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; -}}; +}; \ No newline at end of file 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 07e029a..581a12a 100644 --- a/seminar11_events/01_select_move_delete/select_move_delete.cpp +++ b/seminar11_events/01_select_move_delete/select_move_delete.cpp @@ -7,24 +7,17 @@ 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; @@ -37,19 +30,15 @@ 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}); @@ -79,11 +68,6 @@ 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) { @@ -118,9 +102,6 @@ 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)); @@ -131,19 +112,15 @@ 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; @@ -272,29 +249,25 @@ 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);