Compare commits
No commits in common. "95f02e3ce02214e0fff23ad8e24def976c36c96f" and "514012f0cb6323479671b33ee9f4513d1811eba6" have entirely different histories.
95f02e3ce0
...
514012f0cb
7 changed files with 74 additions and 224 deletions
|
@ -140,4 +140,39 @@ 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,17 +7,24 @@
|
||||||
|
|
||||||
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;
|
||||||
|
@ -30,15 +37,19 @@ 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});
|
||||||
|
@ -68,6 +79,11 @@ 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) {
|
||||||
|
@ -102,6 +118,9 @@ 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));
|
||||||
|
@ -112,15 +131,19 @@ 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;
|
||||||
|
@ -249,25 +272,29 @@ 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);
|
||||||
|
|
|
@ -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
|
|
|
@ -1,57 +0,0 @@
|
||||||
#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.
|
@ -1,36 +0,0 @@
|
||||||
#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;
|
|
||||||
}
|
|
|
@ -1,113 +0,0 @@
|
||||||
#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;
|
|
||||||
}
|
|
||||||
};
|
|
Reference in a new issue