Цель:
Создать графическую программу на C++ с использованием библиотеки SFML, которая позволяет пользователям рисовать и управлять различными графическими объектами на экране. Задание направлено на закрепление знаний по static_cast, dynamic_cast, reinterpret_cast, указателям на функции, созданию статических и динамических библиотек, а также основам ООП в C++.
-
Рисование линий:
- Возможность рисовать линии поверх существующего контента.
- Изменение цвета пера.
- Изменение толщины пера.
- Изменение прозрачности пера.
-
Рисование фигур:
- Круги:
- Рисование круга.
- Возможность ввода и отображения текста внутри круга.
- Изменение цвета и толщины границы круга.
- Прямоугольники:
- Рисование прямоугольника.
- Возможность ввода и отображения текста внутри прямоугольника.
- Изменение цвета и толщины границы прямоугольника.
- Круги:
-
Управление объектами:
- Каждый отрисованный элемент (линия, круг, прямоугольник) должен быть представлен как отдельный объект класса.
- Возможность перемещения объектов по экрану.
- Возможность редактирования объектов (например, дорисовывание дополнительных линий).
-
Объектно-ориентированное программирование (ООП):
- Создать базовый класс
Shape(или аналогичный), содержащий общие свойства (цвет, толщина, позиция) и виртуальные методы для отрисовки и управления. - Отнаследовать от базового класса конкретные классы
Line,Circle,Rectangle, реализующие специфичное поведение. - Использовать полиморфизм для управления коллекцией объектов через указатели на базовый класс.
- Создать базовый класс
-
Использование C++ Casts:
- Применять
static_castдля безопасных преобразований между связанными типами. - Использовать
dynamic_castдля проверки типа объектов во время выполнения. - При необходимости применять
reinterpret_cast, обеспечивая понимание потенциальных рисков.
- Применять
-
Указатели на функции:
- Реализовать обработку событий (например, нажатие кнопок интерфейса) с использованием указателей на функции.
- Создать систему обратных вызовов для действий, связанных с объектами (рисование, изменение свойств и т.д.).
-
Создание библиотек:
- Разделить проект на статическую и/или динамическую библиотеку, содержащую классы графических объектов и связанные функции.
- Подключить эту библиотеку к основному приложению, демонстрируя умение работать с библиотеками в C++.
-
Работа с SFML:
- Использовать SFML для создания окна приложения, обработки событий ввода (мышь, клавиатура) и отрисовки графических объектов.
- Обеспечить плавную работу и отзывчивость интерфейса.
-
Дополнительные требования:
- Реализовать систему сохранения и загрузки созданных графических объектов (например, в файл формата JSON или XML).
- Обеспечить пользовательский интерфейс для выбора инструментов рисования, изменения параметров пера и управления объектами.
-
Структура проекта:
- Библиотека (Static/Dynamic):
- Создать проект библиотеки, содержащей определения классов
Shape,Line,Circle,Rectangleи связанных функций. - Определить интерфейсы и реализации в отдельных заголовочных (
.h) и исходных (.cpp) файлах.
- Создать проект библиотеки, содержащей определения классов
- Основное приложение:
- Создать отдельный проект, который подключает созданную библиотеку.
- Реализовать логику взаимодействия с пользователем, отрисовку объектов и управление ими.
- Библиотека (Static/Dynamic):
-
Использование ООП:
- Базовый класс
Shapeможет содержать чисто виртуальные методы, такие какdraw(),move(),setColor(), и т.д. - Производные классы реализуют эти методы, используя возможности SFML для отрисовки.
- Базовый класс
-
Пример использования C++ Casts:
- При необходимости определить тип объекта во время выполнения (например, при редактировании), использовать
dynamic_castдля безопасного приведения. - Применять
static_castдля преобразований, связанных с наследованием, когда тип известен на этапе компиляции. - Использовать
reinterpret_castтолько в крайних случаях, понимая возможные риски и последствия.
- При необходимости определить тип объекта во время выполнения (например, при редактировании), использовать
-
Указатели на функции:
- Создать функции для обработки событий (например,
onDrawLine,onChangeColor) и хранить их в виде указателей илиstd::functionдля динамического вызова.
- Создать функции для обработки событий (например,
-
Работа с библиотеками:
- Следовать стандартным методам создания и подключения библиотек в C++ (например, используя CMake для управления сборкой).
-
Функциональность:
- Соответствие реализации требованиям задания.
- Корректность работы основных и дополнительных функций.
-
Качество кода:
- Читаемость и структурированность кода.
- Правильное использование ООП принципов.
- Эффективное применение C++ возможностей (casts, указатели на функции и т.д.).
-
Использование библиотек:
- Корректная организация проекта с использованием статических/динамических библиотек.
- Эффективное подключение и использование SFML.
-
Пользовательский интерфейс:
- Удобство и интуитивность интерфейса.
- Реализация функций сохранения и загрузки.
-
Документация:
- Наличие комментариев в коде.
- Предоставление инструкции по сборке и использованию программы.
// Shape.h
#pragma once
#include <SFML/Graphics.hpp>
#include <string>
class Shape {
public:
virtual ~Shape() {}
virtual void draw(sf::RenderWindow& window) = 0;
virtual void move(float offsetX, float offsetY) = 0;
virtual void setColor(const sf::Color& color) = 0;
virtual void setThickness(float thickness) = 0;
// Дополнительные методы
};
// Line.h
#pragma once
#include "Shape.h"
class Line : public Shape {
private:
sf::VertexArray vertices;
float thickness;
public:
// Конструктор
// Переопределение виртуальных методов
// Дополнительные методы
// Возможно деструктор
};
// Circle.h
#pragma once
#include "Shape.h"
#include <SFML/Graphics.hpp>
class Circle : public Shape {
private:
sf::CircleShape circle;
sf::Text text;
public:
// Конструктор
// Переопределение виртуальных методов
// Дополнительные методы
// Возможно деструктор
};
// Rectangle.h
#pragma once
#include "Shape.h"
#include <SFML/Graphics.hpp>
class Rectangle : public Shape {
private:
sf::RectangleShape rectangle;
sf::Text text;
public:
// Конструктор
// Переопределение виртуальных методов
// Дополнительные методы
// Возможно деструктор
};- SFML Документация: https://www.sfml-dev.org/documentation/
- Файл SFML_info.MD подготовленный для данного семинара: https://github.com/NimblePython/seminar-7/blob/main/SFML_info.MD/
- Руководство по созданию библиотек в C++: Смотрите лекции на страницах moodle университета
- Справка по структуре программ в C++: LearnCpp - Static and Dynamic Libraries
- Примеры использования C++ Casts: cppreference.com - C++ Cast Operators
- Уроки по C++ Casts: cplusplus.com - Type conversions
До конца ноября 2024 г.
- Исходный код проекта с понятной структурой папок.
- Инструкции по сборке и запуску программы.
- Краткая документация по использованным классам и архитектуре приложения.
- Примеры сохраненных файлов (если реализована функция сохранения).
-
Планирование: Начните с проектирования классов и определения их взаимодействий. Это поможет избежать переработки архитектуры в процессе разработки.
-
Постепенная реализация: Реализуйте функционал поэтапно — сначала базовое рисование линий, затем добавление кругов и прямоугольников, далее управление объектами и т.д.
-
Тестирование: Регулярно тестируйте каждую часть приложения, чтобы своевременно обнаруживать и исправлять ошибки.
-
Использование контроля версий: Рекомендуется использовать систему контроля версий (например, Git) для отслеживания изменений и облегчения совместной работы (если применимо).
-
Комментарии и документация: Пишите понятные комментарии и поддерживайте документацию актуальной, чтобы облегчить понимание кода вам и другим.