SFML

Фигуры

Введение

SFML предоставляет набор классов для отображения простых фигур. Каждый из типов фигур — это отдельный класс, но все они происходят из одного базового класса и потому имеют набор одинаковых методов. Каждый класс добавляет специфичные для него свойства: радиус для круга, размеры для прямоугольника, вершины многоугольника и т.д.

Общие свойства фигур

Трансформация (позиция, поворот, масштаб)

Это свойство является общим для всех графических классов SFML, поэтому они описаны в отдельном руководстве: (пока тут ссылка на не переведённый оригинал).

Цвет

Одно из главнейших свойств фигур — это их цвет, который можно менять с помощью метода setFillColor().

sf::CircleShape shape(50);

// задаём фигуре зелёный цвет
shape.setFillColor(sf::Color(100, 250, 50));

graphics-shape-color

 

(далее…)

Текст и шрифты

Загрузка шрифта

Перед рисованием текста, вам нужно загрузить шрифт. Для работы со шрифтами используется специальный класс sf::Font. Он поддерживает три главных операции: загрузка шрифта, получение из него глифов (визуальных символов) и чтение его атрибутов.

Начнём с загрузки. Самый простой способ загрузить шрифт, это загрузить его из файла на диске, сделать это можно при помощи функции loadFromFile().

sf::Font font;
if (!font.loadFromFile("arial.ttf"))
{
 // ошибка...
}

(далее…)

Спрайты и текстуры

Термины

Вероятно вы уже знакомы с этими терминами, но всё же давайте кратко их определим.

Текстура — это изображение. Мы же называем изображение «текстурой» из-за его специфической роли: их наносят на 2D объекты.

Спрайт — это текстурированный прямоугольник.

graphics-sprites-definition

Загрузка текстуры

(далее…)

Рисование 2D объектов

Окно для рисования

Для рисования объектов с помощью графического модуля, вам необходимо использовать специальный класс окна: sf::RenderWindow. Этот класс является наследником класса sf::Window и обладает всем методами класса родителя. Всё что вы изучили о sf::Window (создание, обработка событий, настройка частоты кадров, смешанное использование с OpenGL и т.д.), применимо и к sf::RenderWindow.

Помимо этого, sf::RenderWindow имеет методы облегчающие задачу рисования объектов. В этом уроке мы сосредоточимся на двух таких методах: clear() и draw(). Они просты как и их названия: clear() очищает окно выбранным цветом, а draw() рисует любой переданный ему объект.

Так выглядит типичный главный цикл с окном визуализации (render window):

(далее…)

Клавиатура, мышь и джойстик

Введение

Этот урок объясняет как получить доступ к глобальным ресурсам (global inputs): клавиатуре, мыши и джойстику. Не следует путать их с событиями: ресурсы в режиме реального времени позволяют запросить глобальные состояния клавиатуры, мыши и джойстика в любое время («Эта кнопка нажата в данный момент?», «Где мышь?»). В то время как события уведомляют вас когда что-то происходит («Эта кнопка была нажата», «Мышь переместилась»).

Клавиатура

Класс, предоставляющий доступ к состоянию клавиатуры, — sf::Keyboard. Он содержит только один метод isKeyPressed(), который проверяет текущее состояние клавиши (нажата или отпущена). Это статический метод, и поэтому вам не нужно создавать экземпляр класса sf::Keyboard что бы воспользоваться им.

Эта функция напрямую считывает состояние клавиатуры игнорируя факт, что ваше окно активно или неактивно.

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
 // нажата клавиша влево: сдвинем нашего героя
 character.move(1, 0);
}

Коды клавиш определены в перечислении sf::Keyboard::Key.

Коды некоторых клавиш могут отсутствовать или быть неправильно интерпретированы в зависимости от ОС и раскладки клавиатуры. Это будет улучшено в следующих версиях
SFML.

(далее…)

События

Введение

Этот урок представляет подробный перечень событий окна. Он описывает их и показывает как можно и нельзя использовать события.

Тип sf::Event

Прежде чем перейти к событиям, важно понять что из себя представляет тип sf::Event и как правильно им пользоваться. sf::Event — это объединение, а значит, что только один из членов этого объединения допустим (т.е. существует) в данный момент времени (все элементы объединения хранятся в одной области памяти; за подробностями — в любой учебник по с++). Допустимым членом является тот, который соответствует типу события, например event.key для события KeyPressed. Попытка считывания другого члена приведёт к неопределённому поведению (скорее всего вы получите недопустимые или случайные значения). Поэтому никогда не пытайтесь использовать член события, который не соответствуют типу этого события.

Экземпляры sf::Event в качестве аргументов принимаются методом pollEvent() (или waitEvent()) класса sf::Window. Только две эти функции могут предоставить допустимые события, любая попытка использовать sf::Event без предварительного успешного вызова pollEvent() (или waitEvent()) приведёт к такому же неопределённому поведению, о котором говорилось выше.

Для большей ясности, вот так выглядит типичный цикл с использованием событий:

sf::Event event;

// пока имеются события в очереди...
while (window.pollEvent(event))
{
    // проверка типа события...
    switch (event.type)
    {
        // закрытие окна
        case sf::Event::Closed:
            window.close();
            break;

        // нажатие клавиш
        case sf::Event::KeyPressed:
            ...
            break;

        // мы не обрабатываем другие типы событий
        default:
            break;
    }
}

(далее…)

Открытие и управление окном SFML

Введение

Этот урок рассказывает только о том, как открывать окно и как управлять им. Рисование объектов находится вне сферы действия модуля sfml-window: оно обрабатывается модулем sfml-graphics. Однако, управление окном остаётся точно таким же, поэтому прочитать этот урок в любом случае нужно.

Открытие окна

Окна в SFML определяются с помощью класса sf::Window. Окно может быть создано и открыто непосредственно в конструкторе:

#include <SFML/Window.hpp>

int main()
{
    sf::Window window(sf::VideoMode(800, 600), "My window");

    ...

    return 0;
}

Первый аргумент — видео режим (video mode), определяет размер окна (внутренний размер, без заголовка и границ). Здесь мы создаём окно 800 x 600 пикселей.
Класс sf::VideoMode имеет несколько интересных статических функций для получения разрешения рабочего стола или списка допустимых видео режимов для полноэкранного режима. Если интересно, то загляните в документацию.

Второй аргумент это просто заголовок окна. (далее…)

Пользовательские потоки данных

Введение

SFML имеет несколько ресурсных классов: для картинок, шрифтов, звуков и т.д. В большинстве программ эти ресурсы будут загружены из файлов, при помощи своих функций loadFromFile(). В некоторых других случаях, ресурсы будут упакованы в исполняемый файл или в большой файл данных, и тогда будут загружаться из памяти с помощью loadFromMemory(). Эти функции покрывают практически все возможные варианты использования — но не все.

Иногда вы хотите загрузить файлы их необычного места, такого как сжатый/зашифрованный архив или удалённая сеть, например. Для подобных специальных случаев SFML предоставляет третью функцию загрузки: loadFromStream(). Эта функция считывает данные из абстрактного класса sf::InputStream, который позволяет определить собственные реализации.

В этом уроке вы узнаете как написать и использовать свой собственный производный входной поток. (далее…)

Потоки

Что такое поток?

Большинство из вас должно быть уже знают что такое потоки, но тем не менее, здесь приведено небольшое объяснение для тех, кто впервые сталкивается с этой концепцией.

Поток это последовательность инструкций, которая обрабатывается параллельно другим потокам (т.е. параллельно другим инструкциям). Каждая программа состоит как минимум из одного потока: главного потока, который запускает функцию main(). Программы, использующие только один поток, называются однопоточными, но если вы добавите в неё один или несколько потоков, то она уже будет многопоточной.

(далее…)

Обработка времени

Время в SFML

В отличии от большинства других библиотек, в которых время представлено в виде числа миллисекунд (тип данных uint32) или числа секунд (float), SFML не навязывает какие-либо специфические единицы или типы для значений времени. Вместо этого библиотека оставляет этот выбор за пользователем через гибкий класс sf::Time. Все классы и функции библиотеки SFML, работающие со временем, используют этот класс.

sf::Time определяет временной интервал. Иными словами, не представляет какое-то конкретное значение даты и времени (год/месяц/день/час/минута/секунда), а просто показывает количество времени, и то как оно будет истолковываться, зависит уже от контекста.

(далее…)