seminar11 - final

master
nihonium 2 years ago
parent 8fc5c26a79
commit 95f02e3ce0
No known key found for this signature in database
GPG Key ID: 0251623741027CFC

@ -140,39 +140,4 @@ public:
return -1; 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;
}};

@ -7,24 +7,17 @@
using namespace std; using namespace std;
void meow() {;}
// Вспомогательные функции, вычисляет расстояние между двумя точками
float distance(sf::Vector2f start, sf::Vector2f finish) 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)); 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) 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)}; sf::Vertex line_vertices[2] = {sf::Vertex(start, color), sf::Vertex(finish, color)};
window.draw(line_vertices, 2, sf::Lines); window.draw(line_vertices, 2, sf::Lines);
} }
// Вспомагательный класс, описывет шарик
// position - положение шарика; radius - радиус
// is_chosen - говорит о том, выбран ли шарик или нет
struct Ball struct Ball
{ {
sf::Vector2f position; sf::Vector2f position;
@ -37,19 +30,15 @@ struct Ball
isChoosen = false; isChoosen = false;
} }
// Метод, который рисует шарик на холстек окна window
void draw(sf::RenderWindow& window) const void draw(sf::RenderWindow& window) const
{ {
// Тут рисуем белый кружочек
sf::CircleShape circle(radius); sf::CircleShape circle(radius);
circle.setFillColor(color); circle.setFillColor(color);
circle.setOrigin({radius, radius}); circle.setOrigin({radius, radius});
circle.setPosition(position); circle.setPosition(position);
window.draw(circle); window.draw(circle);
// Если шарик выбран
if (isChoosen) { if (isChoosen) {
// То рисуем "уголки"
const float fraction = 0.7; 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 - radius, position.y + radius*fraction});
drawLine(window, {position.x - radius, position.y + radius}, {position.x - fraction * radius, position.y + radius}); 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 else
++it; ++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) { 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); sf::RenderWindow window(sf::VideoMode(800, 600), "Select, Move, Delete!", sf::Style::Default, settings);
window.setFramerateLimit(60); window.setFramerateLimit(60);
// Создаём связный список из шариков
// Связный список -- потому что нам нужно будет постоянно удалять и добавлять в этот список
std::list<Ball> balls; std::list<Ball> balls;
balls.push_back(Ball({200, 200}, 26)); balls.push_back(Ball({200, 200}, 26));
balls.push_back(Ball({400, 300}, 20)); balls.push_back(Ball({400, 300}, 20));
@ -131,19 +112,15 @@ int main()
list<Ball> buffer{}; list<Ball> buffer{};
// Создаём прямоугольник выделения
// Обратите внимание на четвёртый параметр sf::Color(150, 150, 240, 50)
// Это alpha - прозрачность 0 = полностью прозрачный 255 = непрозрачный
sf::RectangleShape selectionRect; sf::RectangleShape selectionRect;
selectionRect.setFillColor(sf::Color(150, 150, 240, 50)); selectionRect.setFillColor(sf::Color(150, 150, 240, 50));
selectionRect.setOutlineColor(sf::Color(200, 200, 255)); selectionRect.setOutlineColor(sf::Color(200, 200, 255));
selectionRect.setOutlineThickness(1); selectionRect.setOutlineThickness(1);
// Специальная переменная, которая будет показывать, что мы находимся в режиме выделения
bool isSelecting = false; bool isSelecting = false;
// "Режим выделения" /* "Режим выделения" */
bool isMovingMode = false; bool isMovingMode = false;
// Необходимо, чтоб в режиме выделения считать смещение /* Необходимо, чтоб в режиме выделения считать смещение */
Ball* selected_ball = nullptr; Ball* selected_ball = nullptr;
bool isContextMenu = false; bool isContextMenu = false;
@ -272,29 +249,25 @@ int main()
isMovingMode = false; isMovingMode = false;
isContextMenu = 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 (event.key.code == sf::Keyboard::C)
if (sf::Keyboard::isKeyPressed(sf::Keyboard::LControl)) { if (sf::Keyboard::isKeyPressed(sf::Keyboard::LControl))
copyBalls(balls, buffer); copyBalls(balls, buffer);
}
if (event.type == sf::Event::KeyPressed)
if (event.key.code == sf::Keyboard::V) if (event.key.code == sf::Keyboard::V)
if (sf::Keyboard::isKeyPressed(sf::Keyboard::LControl)) if (sf::Keyboard::isKeyPressed(sf::Keyboard::LControl))
pasteBalls(balls, buffer); pasteBalls(balls, buffer);
if (event.type == sf::Event::KeyPressed)
if (event.key.code == sf::Keyboard::X) if (event.key.code == sf::Keyboard::X)
if (sf::Keyboard::isKeyPressed(sf::Keyboard::LControl)) { if (sf::Keyboard::isKeyPressed(sf::Keyboard::LControl)) {
copyBalls(balls, buffer); copyBalls(balls, buffer);
deleteChoosen(balls); 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); window.clear(sf::Color::Black);