Compare commits

...

3 commits

Author SHA1 Message Date
nihonium
95f02e3ce0
seminar11 - final 2023-01-04 00:36:53 +03:00
nihonium
8fc5c26a79
seminar11: slider circle void methods 2023-01-04 00:23:35 +03:00
nihonium
f1e450cc9e
seminar11 slider 2023-01-04 00:18:42 +03:00
7 changed files with 224 additions and 74 deletions

View file

@ -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;
}};
};

View file

@ -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);

View file

@ -0,0 +1,6 @@
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

View file

@ -0,0 +1,57 @@
#include <iostream>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#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;
}

Binary file not shown.

View file

@ -0,0 +1,36 @@
#include <iostream>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#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;
}

View file

@ -0,0 +1,113 @@
#pragma once
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <sstream>
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;
}
};