Язык программирования:
C/C++
Среда программирования:
Visual Studio 2015
#include <SFML/Graphics.hpp> #include <SFML/OpenGL.hpp> #include <iostream> const int winW = 350; // Ширина окна const int winH = 350; // Высота окна using namespace std; int main() { sf::RenderWindow window(sf::VideoMode(winW, winH), "CMYK-CMYK-CMYK"); sf::Color cl_c(0, 255, 255, 85); //Cyan sf::Color cl_m(255, 0, 255, 85); //Magenta sf::Color cl_y(255, 255, 0, 85); //Yellow int radius = 12; // Радиус шарика vector <sf::CircleShape> all_cir; // Вектор окружностей for (int i = 0; i < 7; ++i) { for (int j = 0; j < 7; ++j) { // Создаем по три окружности, каждого цвета. sf::CircleShape c1(radius); c1.setPosition(sf::Vector2f(50*j, 50*i)); c1.setFillColor(cl_y); all_cir.push_back(c1); sf::CircleShape c2(radius); c2.setPosition(sf::Vector2f(50 * j, 50 * i)); c2.setFillColor(cl_m); all_cir.push_back(c2); sf::CircleShape c3(radius); c3.setPosition(sf::Vector2f(50 * j, 50 * i)); c3.setFillColor(cl_c); all_cir.push_back(c3); } } bool back = 0; int distance = 30; // Дистанция, на котору будут разбегаться окружности while (1) { sf::Event event; while (window.pollEvent(event)) { // События закрытия окну по клику на крестик и по нажатию Esc if (event.type == sf::Event::Closed || event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) return 0; } window.clear(sf::Color::White); // Очищаем окно for (int i = 0; i < all_cir.size() - 2; i += 3) { if (i % 2 == 0) { // Четные и нечетные окружности двигаются в противоположных направлениях if (!back) { sf::Vector2f p = all_cir[i].getPosition(); all_cir[i].setPosition(p.x, p.y + 0.5); // Движение вверх p = all_cir[i + 1].getPosition(); all_cir[i + 1].setPosition(p.x + 0.5, p.y - 0.5); // Движение вправо и вниз p = all_cir[i + 2].getPosition(); all_cir[i + 2].setPosition(p.x - 0.5, p.y - 0.5); // Движение влево и вверх } else { // Движение в обратную сторону sf::Vector2f p = all_cir[i].getPosition(); all_cir[i].setPosition(p.x, p.y - 0.5); // Движение вниз p = all_cir[i + 1].getPosition(); all_cir[i + 1].setPosition(p.x - 0.5, p.y + 0.5); // Движение влево и вверх p = all_cir[i + 2].getPosition(); all_cir[i + 2].setPosition(p.x + 0.5, p.y + 0.5); // Движение вправо и вниз } } else { if (!back) { sf::Vector2f p = all_cir[i].getPosition(); all_cir[i].setPosition(p.x, p.y - 0.5); // Движение вниз p = all_cir[i + 1].getPosition(); all_cir[i + 1].setPosition(p.x - 0.5, p.y + 0.5); // Движение влево и вверх p = all_cir[i + 2].getPosition(); all_cir[i + 2].setPosition(p.x + 0.5, p.y + 0.5); // Движение вправо и вниз } else { sf::Vector2f p = all_cir[i].getPosition(); all_cir[i].setPosition(p.x, p.y + 0.5); // Движение вверх p = all_cir[i + 1].getPosition(); all_cir[i + 1].setPosition(p.x + 0.5, p.y - 0.5); // Движение вправо и вниз p = all_cir[i + 2].getPosition(); all_cir[i + 2].setPosition(p.x - 0.5, p.y - 0.5); // Движение влево и вверх } } } distance--; sf::sleep(sf::microseconds(10060)); // Далаем паузу, иначе анимация слишком быстрая for (int i = 0; i < all_cir.size(); i++) // Отрисовываем круги window.draw(all_cir[i], sf::BlendMultiply); // sf::BlendMultiply - наложение цветов window.display(); // Отображаем то, что нарисовали. if (distance == 0) { // Если отдалились на необходимое расстояние, меняем направление движения back = 1 - back; distance = 30; } } }
Прикрепленный файл | Размер |
---|---|
CMYK dots.zip | 783.03 кб |