Vector2f sfml что это
Shapes
Introduction
SFML provides a set of classes that represent simple shape entities. Each type of shape is a separate class, but they all derive from the same base class so that they have access to the same subset of common features. Each class then adds its own specifics: a radius property for the circle class, a size for the rectangle class, points for the polygon class, etc.
Common shape properties
Transformation (position, rotation, scale)
These properties are common to all the SFML graphical classes, so they are explained in a separate tutorial: Transforming entities.
Color
One of the basic properties of a shape is its color. You can change with the setFillColor function.
Outline
Shapes can have an outline. You can set the thickness and color of the outline with the setOutlineThickness and setOutlineColor functions.
By default, the outline is extruded outwards from the shape (e.g. if you have a circle with a radius of 10 and an outline thickness of 5, the total radius of the circle will be 15). You can make it extrude towards the center of the shape instead, by setting a negative thickness.
Texture
Shapes can also be textured, just like sprites. To specify a part of the texture to be mapped to the shape, you must use the setTextureRect function. It takes the texture rectangle to map to the bounding rectangle of the shape. This method doesn’t offer maximum flexibility, but it is much easier to use than individually setting the texture coordinates of each point of the shape.
Drawing a shape
Drawing a shape is as simple as drawing any other SFML entity:
Built-in shape types
Rectangles
To draw rectangles, you can use the sf::RectangleShape class. It has a single attribute: The size of the rectangle.
Circles
Circles are represented by the sf::CircleShape class. It has two attributes: The radius and the number of sides. The number of sides is an optional attribute, it allows you to adjust the «quality» of the circle: Circles have to be approximated by polygons with many sides (the graphics card is unable to draw a perfect circle directly), and this attribute defines how many sides your circle approximation will have. If you draw small circles, you’ll probably only need a few sides. If you draw big circles, or zoom on regular circles, you’ll most likely need more sides.
Regular polygons
There’s no dedicated class for regular polygons, in fact you can represent a regular polygon with any number of sides using the sf::CircleShape class: Since circles are approximated by polygons with many sides, you just have to play with the number of sides to get the desired polygons. A sf::CircleShape with 3 points is a triangle, with 4 points it’s a square, etc.
Convex shapes
The sf::ConvexShape class is the ultimate shape class: It allows you to define any convex shape. SFML is unable to draw concave shapes. If you need to draw a concave shape, you’ll have to split it into multiple convex polygons.
To construct a convex shape, you must first set the number of points it should have and then define the points.
The order in which you define the points is very important. They must all be defined either in clockwise or counter-clockwise order. If you define them in an inconsistent order, the shape will be constructed incorrectly.
Lines
There’s no shape class for lines. The reason is simple: If your line has a thickness, it is a rectangle. If it doesn’t, it can be drawn with a line primitive.
Line with thickness:
Line without thickness:
To learn more about vertices and primitives, you can read the tutorial on vertex arrays.
Custom shape types
You can extend the set of shape classes with your own shape types. To do so, you must derive from sf::Shape and override two functions:
You must also call the update() protected function whenever any point in your shape changes, so that the base class is informed and can update its internal geometry.
Here is a complete example of a custom shape class: EllipseShape.
Antialiased shapes
There’s no option to anti-alias a single shape. To get anti-aliased shapes (i.e. shapes with smoothed edges), you have to enable anti-aliasing globally when you create the window, with the corresponding attribute of the sf::ContextSettings structure.
Remember that anti-aliasing availability depends on the graphics card: It might not support it, or have it forced to disabled in the driver settings.
Архивы: Справочники
Блог Sinsinmin
Начну с идеи. Пока ещё посмотрел 20 уроков. Поэтому сначала уроки, потом практика)).
Идея. Тестовая игра. Персонаж.
У персонажа есть уровень. От 1 до 10. Здоровье. Атака. Скорость регенерации жизней. Броня.
4 уровня. На каждом уровне по 1-му виду мобов.
Ну можно для прикола сделать 5-ую комнату с супер сильным босом. Зашёл и отгрёб сразу. )))
С каждым уровнем игроку будут даваться очки атрибутов. Который игрок может вкладывать в увеличение параметров Атаки, Брони, Регенерации жизней, здоровья. Наверное можно украсть идею у игры Комбатс.
Значит Атака, Ловкость, Интуиция, Выносливость. Но тут уже сложнее. Больше формул придётся делать. Поэтому пусть это будет расширенный вариант. Как грится для премиум подписечников…
Можно добавить как раз интерфейс. А значит возможность сохраняться. Это наверное будет нечто вроде записи в файл? А лучше в некий шифрованный файл чтобы пользователь не смог поставить себе некие читерские значения. Обычно в варКрафт 3 давался некий длинный код. Его записываешь. И потом вводишь в начале игры и получаешь сохранённого персонажа. Но тогда можно делиться кодами. Ну ладно. Это уже будет более защищено)))).
Итак соберём всё в кучу и глянем ещё раз….
Интерфейс(Начать игру, загрузить игру-возможность загрузки, сохранить игру-возможность сохранения, опции экрана-разрешение, выход)
5 карт. 4 врага, 5 боссов. (9 тайлов с врагами, 1 с персонажем) хм…можно сделать вначале выбор Персонажа. М и Ж. А значит всего нужно 11 тайлов
5 Карт. Общих по сути.
Во)) ещё вспомнил. Сделать на каждом уровне два вида врагов. Одни пассивные. Другие агрессивные. Блин это нечто вроде стратегии чтоле. Вид сверху. Да наверное вид сверху. А значит нечто вроде Рагнарок.
Точно. Посмотрел видео рангарока. Можно сделать также как там. А значит можно добавить некую массовую магию. Все враги в определённом радиусе получают урон. Возможно даже скачать тайлы рагнарока. Если найду. А нет то какие будут. Ну и отрисовку врагов сделать на подобии. Очень понравилось как там сделано. Вроде 2d как раз игра.
Блин. Но тогда нужно будет делать более расширенную версию. Больше мобов. Разные оружия. Во я влип))))))))) Есть смайлик слёз?))))
Делаю что то наподобии рагнарока. Ну точнее буду копировать идеи оттуда. Из видео. А значит карта больше. Количество врагов больше.
Итак…не знаю осилю ли…но на мой взгляд уроков Павла должно хватить для реализации идеи.
Ах да при достижении уровня нужна анимация.
И продумать как будет показываться урон при нанесении врагу или врагом.
Также интерфейс. что на нём отображать.
8 степеней движения. За раз только одну. Без прыжков.
Надо выделить идеи основные жирным, а то так замучаюсь собирать в кучу всё.
Враги-движение. Раз в несколько секунд, вычисляется рандомно направление и дальность движения от к пример 10 до 20. И враг движется туда.
У агрессивных врагов должна быть область видимости. Если игрок вошёл в эту область, то враг нападает на игрока
sf::TcpSocket
Специализированный Soket использующий TCP протокол.
#include
Диаграмма наследования для sf::TcpSocket:
Открытые типы
enum | Status < Done, NotReady, Partial, Disconnected, Error > |
Статус коды, которые могут быть возвращены функциями сокета. Ещё… | |
enum | < AnyPort = 0 > |
Некоторые специальные значения, используемые сокетами. Ещё… |
Открытые функций (public functions)
Защищённые типы (protected types)
enum | Type < Tcp, Udp > |
Типы протоколов, которые гнездо может использовать. Ещё… |
Защищённые функции (protected functions)
SocketHandle | getHandle () const |
Вернуться внутреннюю ручку в гнездо. Ещё… | |
void | create () |
Создайте внутреннее представление сокета. Ещё… | |
void | create (SocketHandle handle) |
Создайте внутреннее представление сокета с ручкой гнезда. Ещё… | |
void | close () |
Закрыть гнездо изящно. Ещё… |
sf::CircleShape – круг
Специализированная форма, представляющая круг.
#include
Диаграмма наследования для sf::CircleShape:
Публичные функции (public function)
CircleShape (float radius=0, std::size_t pointCount=30) Конструктор по умолчанию. Default constructor. | |
void | setRadius (float radius) Установите радиус окружности. Set the radius of the circle. |
float | getRadius () const Получить радиус окружности. Get the radius of the circle. |
void | setPointCount (std::size_t count) Установите количество точек окружности. Set the number of points of the circle. |
virtual std::size_t | getPointCount () const Получить количество точек окружности. Get the number of points of the circle. |
virtual Vector2f | getPoint (std::size_t index) const Получить точки окружности. Get a point of the circle. |
void | setTexture (const Texture *texture, bool resetRect=false) Изменение источника текстуру формы. Change the source texture of the shape. |
void | setTextureRect (const IntRect &rect) Установите суб-прямоугольник текстурой, которая будет отображать форму. Set the sub-rectangle of the texture that the shape will display. |
void | setFillColor (const Color &color) Установите цвет заливки формы. Set the fill color of the shape. |
void | setOutlineColor (const Color &color) Установите цвет контура фигуры. Set the outline color of the shape. |
void | setOutlineThickness (float thickness) Установите толщину фигуры контур. Set the thickness of the shape’s outline. |
const Texture * | getTexture () const Получить исходный текстуру формы. Get the source texture of the shape. |
const IntRect & | getTextureRect () const Получить суб-прямоугольник текстуры, отображаемой формы. Get the sub-rectangle of the texture displayed by the shape. |
const Color & | getFillColor () const Получить цвет заливки формы. Get the fill color of the shape. |
const Color & | getOutlineColor () const Получить цвет контура фигуры. Get the outline color of the shape. |
float | getOutlineThickness () const Получить толщину контура фигуры. Get the outline thickness of the shape. |
FloatRect | getLocalBounds () const Получить местный ограничивающий прямоугольник объекта. Get the local bounding rectangle of the entity. |
FloatRect | getGlobalBounds () const Получить глобального (не минимальный) прямоугольник сущности. Get the global (non-minimal) bounding rectangle of the entity. |
void | setPosition (float x, float y) Установить положение объекта. set the position of the object |
void | setPosition (const Vector2f &position) Установить положение объекта. set the position of the object |
void | setRotation (float angle) Установить ориентацию объекта. set the orientation of the object |
void | setScale (float factorX, float factorY) Установить масштабные коэффициенты объекта. set the scale factors of the object |
void | setScale (const Vector2f &factors) Установить масштабные коэффициенты объекта. set the scale factors of the object |
void | setOrigin (float x, float y) Установки локального происхождение объекта. set the local origin of the object |
void | setOrigin (const Vector2f &origin) Установки локального происхождение объекта. set the local origin of the object |
const Vector2f & | getPosition () const Получить позицию объекта. get the position of the object |
float | getRotation () const Получить ориентацию объекта. get the orientation of the object |
const Vector2f & | getScale () const Получить текущий масштаб объекта. get the current scale of the object |
const Vector2f & | getOrigin () const Получить местное происхождение объекта. get the local origin of the object |
void | move (float offsetX, float offsetY) Перемещение объекта по заданному смещению. Move the object by a given offset. |
void | move (const Vector2f &offset) Перемещение объекта по заданному смещению. Move the object by a given offset. |
void | rotate (float angle) Поверните объект. Rotate the object. |
void | scale (float factorX, float factorY) Масштаб объекта. Scale the object. |
void | scale (const Vector2f &factor) Масштаб объекта. Scale the object. |
const Transform & | getTransform () const Получить комбинированный преобразование объекта. get the combined transform of the object |
const Transform & | getInverseTransform () const Получить обратную комбинированной преобразование объекта. get the inverse of the combined transform of the object |
Защищённые функции
void | update () Пересчитать внутреннюю геометрию формы. Recompute the internal geometry of the shape. |
Специализированная форма, представляющая круг.
Этот класс наследует все функции sf::Transformable (позиция, вращение, масштаб, границы, …) а также функции sf::Shape (контур, цвет, текстура, …).
Поскольку видеокарта не может привлечь идеальные круги, мы должны подделывать их из нескольких треугольников, соединенных друг с другом. Свойстве “количество точек” sf::CircleShape определяет, сколько из этих треугольников в использовании, и, следовательно, определяет качество круга.
Число точек также может быть использован для другой цели; с небольшими числами можно создать любую регулярную форму многоугольника: равносторонний треугольник, квадрат, пятиугольник, шестиугольник, …
Определение в соответствии с 41 файлом CircleShape.hpp.
Документация: Конструктор и Деструктор
Класс sf::Vector2
Класс sf::Vector2 имеет небольшой и простой интерфейс. К его элементам x и y можно обращаться напрямую и он не содержит математических функций.
Операции с векторами
Перегруженная версия конструктора позволяет в качестве аргумента принимать другой объект этого класса:
Аналогично для копирования координаты:
Получение третьего вектора при сложение двух других:
Поскольку функции cmath работают с действительными числами, то эти координаты разумно преобразовать из целочисленных в действительные ( float ):
Но, обычно, ввиду неявного приведения типов, большой необходимости в этом нет.
Определение длины вектора (расстояний между объектами)
Нормализация вектора (единичный вектор)
В задаче, решаемой на этом уроке, нормализация используется для определения вектора направления (см. программу sf.5.1 стр. 108).
Преобразования Radians Degree
Поворот спрайта с помощью вектора направления и tan2
Символ c обозначает какая сторона (“горизонта”) будет являться точкой отсчета угла.
Разработка проекта для проверки функций
Раздельная компиляция
Код программы получился довольно громоздкий. Использовать его для продолжения разработки стало неудобным. К тому же разработанные нами функции потребуются для решения различных задач в других проектах. Поэтому мы разобьем его на несколько файлов. Как это сделать см.: §10 Функции. Раздельная компиляция. Наш проект после реорганизации будет содержать следующие файлы (исходный текст спрятан под спойлер):
Фигуры
Введение
SFML предоставляет набор классов для отображения простых фигур. Каждый из типов фигур — это отдельный класс, но все они происходят из одного базового класса и потому имеют набор одинаковых методов. Каждый класс добавляет специфичные для него свойства: радиус для круга, размеры для прямоугольника, вершины многоугольника и т.д.
Общие свойства фигур
Трансформация (позиция, поворот, масштаб)
Это свойство является общим для всех графических классов SFML, поэтому они описаны в отдельном руководстве: (пока тут ссылка на не переведённый оригинал).
Одно из главнейших свойств фигур — это их цвет, который можно менять с помощью метода setFillColor().
Контур
Фигуры могут иметь контур. Вы можете задать толщину и цвет контура методами setOutlineThickness() и setOutlineColor().
По умолчанию контур вырисовывается снаружи фигуры (если у вас есть круг с радиусом 10 и контур толщиной 5, то вы получите круг с радиусом 15). Контур можно применять и по направлению к центру фигуры, для этого необходимо задавать отрицательные значения толщины.
Для того что бы убрать контру, необходимо задать нулевую толщину. Если же вам нужен только контур, то в функции setFillColor() следует задать в качестве аргумента цвет sf::Color::Transparent.
Текстура
Фигуры, также как и спрайты, могут быть затекстурированы. Для указания того, какая часть текстуры должна отобразиться на фигуре, вам необходимо использовать метод setTextureRect(). Он принимает в качестве аргумента прямоугольную область текстуры для сопоставления ограничивающего прямоугольника фигуре. Этот метод не обеспечивает максимальной гибкости, но зато он гораздо проще в использовании, чем индивидуальное задание текстурных координат каждой точке фигуры.
Обратите внимание что контур не текстурируется.
В случае когда фигура имеет цвет заливки, текстура модулируется (умножается) на него. Для отключения текстурирования следует вызвать setTexture(NULL).
Рисование фигуры
Рисование фигур такое же простое как и рисование других объектов SFML:
Типы форм
Прямоугольник
Для рисования прямоугольников необходимо использовать класс sf::RectangleShape. Он имеет только одно свойство: размер прямоугольника.
Круг представлен классом sf::CircleShape. Класс имеет два свойства: радиус и количество граней. Количество граней является дополнительным свойством, позволяющим настроить качество отображения круга: круги имитируются многоугольниками с большим числом граней (видеокарты просто не способны рисовать идеальные круги), в общем это свойство устанавливает число граней. Если вы рисуете маленькие круги, то вам нужно совсем немного граней что бы они отображались достаточно гладкими. Обратное тоже верно — чем больше круг, тем больше нужно граней.
Правильные многоугольники
На самом деле для них нет отдельного класса, да он и не нужен. Воспользовавшись классом sf::CircleShape и установив число граней равным 3, мы получим треугольник, если взять 4 грани, то получится квадрат и т.д.
Выпуклые фигуры
Класс sf::ConvexShape является последним из классов фигур: он позволяет определить фигуру, до тех пор пока она является выпуклой. Действительно, SFML не способен нарисовать вогнутые фигуры; если такие нарисовать необходимо, то их всегда можно разбить на несколько выпуклых.
Для определения выпуклой фигуры для начала необходимо указать общее число точек-вершин, и только потом определить эти точки.
Очень важно определять вершины по часовой или против часовой стрелки, если определять их в произвольном порядке, то результат может быть непредсказуем!
Формально, sf::ConvexShape позволяет создавать только выпуклые фигуры. На деле же требования немножко мягче..На самом деле ваша форма должна соответствовать следующему критерию: любая из линий проведённых от центра тяжести фигуры до вершины, не должна пересекать границу фигуры. Следуя этому правилу можно, например, рисовать звёзды.
Линии
Для линий нет отдельного класса. Причина очень простая: если у линии есть толщина, используется фигура прямоугольник, если толщины нет, используется примитив линия.
Больше о примитивах будет рассказано в другом уроке (пока тут ссылка на не переведённый оригинал).
Пользовательские типы фигур
Вы можете расширить набор классов, имеющих свои типы форм. Для этого понадобится создать производный класс от класса sf::Shape и переопределить два метода:
Кроме того, каждый раз как у вашей фигуры изменяются вершины, вы должны вызывать защищённый (protected) метод update(), что бы базовый класс знал об этом и мог обновить своё состояние.
Вот полный пример создания подобного класса class: EllipseShape:
Сглаживание фигур
Нет каких-то функций для сглаживания конкретной фигуры. Если вы хотите получить сглаженные края фигур, то необходимо включить глобальное сглаживание на этапе создания окна. Это делается при помощи соответствующего атрибута структуры sf::ContextSettings.
Помните, что сглаживание зависит от видеокарты, которая может либо не поддерживать его, либо эта опция может быть отключена в настройках драйвера.