Czy chodzi o taki przypadek?
#include <iostream>
#include <vector>
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(1024, 720), "Witam");
window.setFramerateLimit(60);
std::vector<sf::RectangleShape> rects;
sf::RectangleShape rect;
rect.setSize({ 50, 50 });
rect.setOrigin({ 25, 25 });
rect.setFillColor(sf::Color::Red);
while (window.isOpen())
{
sf::Event event;
sf::Vector2f mouse_pos(sf::Mouse::getPosition(window));
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed) window.close();
if (event.type == sf::Event::MouseMoved)
{
rect.setPosition(mouse_pos);
}
if (event.type == sf::Event::KeyPressed)
{
if (event.key.code == sf::Keyboard::C)
rects.clear();
}
}
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
if (rects.size() != rects.max_size())
rects.push_back(rect);
}
window.clear();
window.draw(rect);
for (auto& i : rects) window.draw(i);
window.display();
}
}
Wymyśliłem coś takiego:
#include <iostream>
#include <vector>
#include <SFML/Graphics.hpp>
namespace hip // bede potrzebowal 2 funkcje:
{
template <typename T>
T length(sf::Vector2<T> v)
{
return std::hypot(v.x, v.y);
}
template <typename T>
sf::Vector2<T> norm(sf::Vector2<T> v)
{
return length(v) != 0 ? v / length(v) : sf::Vector2<T>(0, 0);
}
template<typename T>
T dot(sf::Vector2<T> v1, sf::Vector2<T> v2)
{
return v1.x*v2.x + v1.y*v2.y;
}
template<typename T>
T crossed(sf::Vector2<T> v1, sf::Vector2<T> v2)
{
return v1.x*v2.y - v1.y*v2.x;
}
}
int main()
{
sf::RenderWindow window(sf::VideoMode(1024, 720), "Witam");
window.setFramerateLimit(60);
std::vector<sf::RectangleShape> rects;
sf::RectangleShape rect;
rect.setSize({ 50, 50 });
rect.setOrigin({ 25, 25 });
rect.setFillColor(sf::Color::Red);
bool czy_przycisk_ostatnio_byl_wcisniety = false;
while (window.isOpen())
{
sf::Event event;
sf::Vector2f mouse_pos(sf::Mouse::getPosition(window));
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed) window.close();
if (event.type == sf::Event::MouseMoved)
{
rect.setPosition(mouse_pos);
}
if (event.type == sf::Event::KeyPressed)
{
if (event.key.code == sf::Keyboard::C)
rects.clear();
}
}
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
if (czy_przycisk_ostatnio_byl_wcisniety)
if (rects.size() > 1)
{
sf::RectangleShape copy = rect;
sf::Vector2f distanse = rect.getPosition() - rects[rects.size() - 1].getPosition();
sf::Vector2f direction = hip::norm(distanse);
float length = hip::length(distanse);
float rectSize = rect.getSize().x; // zakladam kwadrat
float delta_length_it = rectSize / 4.f; // dlugosc odstepu pomiedzy prostokatami - mozesz zmieniac
if (length > delta_length_it)
{
for (float length_it = 0.f; length_it < length; length_it += delta_length_it)
{
// rects.size() to iteracja ostatnio dodanego kwadratu
sf::Vector2f new_pos = rects[rects.size() - 1].getPosition() + delta_length_it*direction;
copy.setPosition(new_pos);
rects.push_back(copy);
}
}
}
rects.push_back(rect); // dodanie wlasciwego kwadratu
czy_przycisk_ostatnio_byl_wcisniety = true;
}
else czy_przycisk_ostatnio_byl_wcisniety = false;
window.clear();
window.draw(rect);
for (auto& i : rects) window.draw(i);
window.display();
}
}