|
|
|
@ -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<Ball>& balls) {
|
|
|
|
|
else
|
|
|
|
|
++it;
|
|
|
|
|
}
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
for (list<Ball>::iterator it = balls.begin(); it != balls.end(); ++it)
|
|
|
|
|
cout << it->position.x <<" " << it->position.y<< endl;
|
|
|
|
|
cout << "###" << endl;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void copyBalls(list<Ball>& balls, list<Ball>& 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<Ball> balls;
|
|
|
|
|
balls.push_back(Ball({200, 200}, 26));
|
|
|
|
|
balls.push_back(Ball({400, 300}, 20));
|
|
|
|
@ -131,19 +112,15 @@ int main()
|
|
|
|
|
|
|
|
|
|
list<Ball> 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);
|
|
|
|
|