УДК 004.42: 004.432: 004.51

РЕАЛИЗАЦИЯ МУЛЬТИМЕДИЙНОГО ПРИЛОЖЕНИЯ НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ С++ ПОСРЕДСТВОМ ИСПОЛЬЗОВАНИЯ БИБЛИОТЕКИ SFML

Карандеев Денис Юрьевич
Хакасский государственный университет им. Н.Ф. Катанова
аспирант кафедры информационных технологий и систем

Аннотация
В данной статье продемонстрирована значительная часть возможностей библиотеки SFML на примере разработки классического платформера на языке программирования высокого уровня C++. В результате были выявлены преимущества данной библиотеки и перспективы ее использования при создании более серьезных программных обеспечений.

Ключевые слова: анимация, библиотека SFML, мультимедийное приложение, язык программирования C++


THE IMPLEMENTATION OF MULTIMEDIA APPLICATIONS IN THE PROGRAMMING LANGUAGE C ++ BY USING SFML LIBRARY

Karandeev Denis Jurevich
Katanov Khakass State University
Graduate student of the Department of Information Technologies and Systems

Abstract
This article demonstrated a significant part of the library SFML by the example of classic platforming to high-level programming language C++. As a result, discovered the advantages of this library and the prospects for its use in the creation of a more serious software.

Keywords: animation, Library SFML, multimedia application, programming language C ++


Рубрика: 05.00.00 ТЕХНИЧЕСКИЕ НАУКИ

Библиографическая ссылка на статью:
Карандеев Д.Ю. Реализация мультимедийного приложения на языке программирования С++ посредством использования библиотеки SFML // Современные научные исследования и инновации. 2015. № 12 [Электронный ресурс]. URL: http://web.snauka.ru/issues/2015/12/61029 (дата обращения: 20.11.2016).

Введение

На сегодняшний день существует достаточно много языков программирования, часть из них применима для написания игр, часть — для скриптинга, часть — для каких-то специальных целей. Если говорить про написание кода программных обеспечений, то тут исторически наиболее распространён язык программирования C++. Язык С++ проектировался для поддержки абстракции данных и объектно-ориентированного программирования в добавление к традиционному стилю С [1]. C++ и по сей день занимает господствующее положение среди языков программирования в мире.

SFML (Simple and Fast Multimedia Library) — высокоуровневая библиотека, позволяющая разрабатывать мультимедийные приложения, при этом данная библиотека является лучшей альтернативой низкоуровневой библиотеки OpenGL. SFML обеспечивает простой интерфейс для разработки игр и прочих мультимедийных приложений. Она состоит из пяти модулей: system, window, graphics, audio и network [2]. SFML является кроссплатформенной библиотекой, а это значит, что разработанные приложения будут работать на большинстве операционных систем. SFML поддерживает большое число языков программирования, является упрощенным в использование аналогом SDL. Благодаря тому, что SFML является в отличие от OpenGL высокоуровневой библиотекой, это позволяет добавлять анимацию и музыку в приложение без особых проблем.

В перспективе возможности данной библиотеки могут быть использованы при создании более серьезных и полезных программных обеспечений, в частности, при реализации графического интерфейса программ, способных реализовывать построение сложных технических систем [3-5]. Так как возможность увеличения уровня интерактивности посредством добавления качественного и интуитивного графического интерфейса может способствовать более быстрому включению в работу в процессе проектирования сложных технических систем экспертов, которые бы использовали разработанное программное обеспечение при построении оптимальных структур сложных технических систем.

Создание мультимедийного приложения на языке программирования С++ посредством библиотеки SFML

В качестве примера, демонстрирующего возможности библиотеки SFML, было принято решение создать платформер в стилистике игр на Sega и Dendy. При этом главным положительным и, соответственно, управляемым персонажем было принято решение сделать персонажа игры Sonic – Tails, главным же врагом стал Mario, как известно Sonic и Mario в те времена являлись главными соперниками на рынке игровой индустрии.

1.Анимация движения персонажей

Для начала при создании платформера на языке C++ необходимо продумать, как будет прорисовываться анимация персонажей Tails и Mario, соответственно, так как именно они в платформере передвигаются. Для этого используется быстрый перебор тайлов, который и приводит к иллюзии движения персонажей:


Рисунок 1 – Тайлсеты для создания анимации движения персонажей

На языке С++ код имеет такой вид:

void update(float time)

{

    control();

    switch (state) {

    case right:dx = speed; break;

    case left:dx = -speed; break;

    case up: break;

    case down: dx = 0; break;

    case stay: break;

    }

    x += dx*time;

    checkCollisionWithMap(dx, 0);

    y += dy*time;

    checkCollisionWithMap(0, dy);

    sprite.setPosition(x + w / 2, y + h / 2);

    dy = dy + 0.0015*time;

    currentFrame += time * 0.005;

    if (currentFrame > 7) currentFrame -= 7;

    if (dx>0) sprite.setTextureRect(IntRect(0 + 45 * int(currentFrame), 140, 45, 32));

}

Где sprite – это вырезанная из Тайлсета текстура с размерами 45*32, при этом начальная координата задана x=0, y=45; затем если sprite меняется на тайл с координатами 0, 90, затем 0,135, а затем дойдя до 7 тайла, он как видно из этого кода    ”if (currentFrame > 7) currentFrame -= 7;” снова начинает перебирать тайлы c самого сначала, таким образом, создается иллюзия движения персонажа. При желание можно за место данного тайлсета использовать какой-нибудь более качественный и современный тайлсет, эффект движения при этом значительно улучшится.

Однако персонаж должен уметь двигаться не только вправо, но и как минимум влево, для этого необходимо лишь добавить следующую строчку кода if (dx<0) sprite.setTextureRect(IntRect(0 + 45 * int(currentFrame) + 45, 140, -45, 32)); и спрайты попросту буду зеркально отражаться при движение вправо.

Далее необходимо прописать код, описывающий то, как мы будет управлять движение персонажа:

void control(){

    if (health > 0) {

        if (Keyboard::isKeyPressed){

            if ((Keyboard::isKeyPressed(Keyboard::Left))) { state = left; speed = 0.1; }…

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

2.Загрузка карты и ее скроллинг

Вторым пунктом является загрузка карты и ее скроллинг. Для создания карты использовался специальный редактор карт Tiled Map Editor (TMP). Он хорош тем, что карту, созданную в этом редакторе, состоящем из объектов, тайлов и их слоев, можно сохранить в XML-подобном файле с расширением .tmx и затем с помощью специальной библиотеки TinyXML на C++ считать ее.

В целях того, чтобы не было видно тех участков, которые находятся за границами карты, был написан следующий код:

#include <SFML/Graphics.hpp>

using namespace sf;

sf::View view;

void setPlayerCoordinateForView(float x, float y) {

    float tempX = x; float tempY = y;

    if (x < 320) tempX = 320;//левая сторона карты

    if (x > 2300) tempX = 2300;//правая сторона

    if (y < 240) tempY = 240;//верхняя сторона

    if (y > 300) tempY = 300;//нижняя сторона

    view.setCenter(tempX, tempY);}

3.Взаимодействие персонажа с картой

Для того чтобы персонажи начали физически взаимодействовать с элементами карты необходимо продумать физику игры. Для взаимодействия главного персонажа с элементами карты был написан следующий код:

void checkCollisionWithMap(float Dx, float Dy) //взаимодействие с картой

     {

         for (int i = 0; i<obj.size(); i++)//проходимся по объектам

         if (getRect().intersects(obj[i].rect))//проверяем пересечение игрока с объектом

         {

             if (obj[i].name == “solid”)//если встретили препятствие

             {

                 if (Dy>0)    { y = obj[i].rect.top – h; dy = 0; onGround = true; } //если препятствие снизу, то скорость падения равняется 0 и наш персонаж находится на земле

                 if (Dy<0)    { y = obj[i].rect.top + obj[i].rect.height; dy = 0; }//если препятствие сверху

                 if (Dx>0)    { x = obj[i].rect.left – w; }//препятствие справа

                 if (Dx<0)    { x = obj[i].rect.left + obj[i].rect.width; }//препятствие слева

             }

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

Рисунок 2 – Расположения персонажа Mario на карте

4.Взаимодействие с врагом

У любого платформера есть какая-либо цель, миссия, после выполнения которой игра заканчивается либо победой игрока, либо его поражением. В данном платформере в качестве примера было принято решение целью игры сделать победу персонажа игры Sonic – Tails над персонажем из другой игровой вселенной – Mario. Для этого необходимо, во-первых, прописать последствия их столкновений, во-вторых, дать некоторое количество жизней Mario (например, 100) и, в-третьих, прописать два варианта событий – победа и поражение в игре. В следующем коде представлен результат:

if (p.getRect().intersects(easyEnemy.getRect())) //проверяем пересечение игрока с врагом

        {if ((p.dy > 0)&(p.onGround == false)&(easyEnemy.health > 0)) { p.dy = -1; easyEnemy.health -= 25; }/*Если игрок падает сверху на еще живого Mario, то он отскакивает от него вверх и при этом количество жизней Mario сокращается на 25*/

        else
if ((easyEnemy.health > 0)) {p.sprite.setColor(Color::Red); p.health-=100;{text2.setString(“GAME OVER”); text2.setPosition(view.getCenter().x – 160, view.getCenter().y – 0); }} //Если игрока убил Mario, то появляется надпись красного цвета GAME OVER и экран игры начинает крутится против часовой стрелки, сам же Tails окрашивается в красный цвет.

        else
if (easyEnemy.health <= 0) { easyEnemy.dx = 0; easyEnemy.sprite.setTextureRect(IntRect(-4, 20, 60, 20)); text2.setString(“YOU WIN”); text2.setColor(Color::Green); text2.setPosition(view.getCenter().x – 160, view.getCenter().y – 0); }} //Если игрок 4 раза прыгнул на Mario, то появляется надпись зеленого цвета YOU WIN.

На рисунке 3 представлены два возможных исхода игры:

Рисунок 3 – Два возможных результата игры победа и поражение главного героя

5.Звук

Благодаря тому, что в качестве мультимедийной библиотеки в данной работе используется SFML, которая является высокоуровневой библиотекой, это позволяет добавлять в приложение музыку, в частности как фоновую, так и для озвучивания отдельных движений, например, прыжков героя. В качестве фоновой музыки была выбрана заглавная композиция фильма Рокки. Для добавления музыкального сопровождения необходимо подключить #include
<SFML/Audio.hpp>

и прописать в главной функции следующий код:

    Music music;

    music.openFromFile(“Music.ogg”);

    music.play();

    Music jumper;

    jumper.openFromFile(“Jump.ogg”);


    while (window.isOpen())

    {    if (p.state == p.jump) jumper.play();
… }

6.Дополнительные элементы

Помимо вышеизложенного в игру было добавлено несколько дополнительных элементов, позволяющих разнообразить процесс игры. Это бонусы ускорения скорости, при взятии этого бонуса скорость героя значительно увеличивается; батуты, прыгая на которые герой взлетает на значительную высоту. Также помимо этого было добавлена анимация при прыжках и прочих движения героя. В перспективе есть возможность добавления искусственной нейронной сети в качестве интеллекта для врага. Для того чтобы игра работала значительно быстрее даже на слабых компьютерах в главной функции был прописан следующий код:

float time = clock.getElapsedTime().asMicroseconds();

        clock.restart();

        time = time / 800;// позволяет задавать скорость игры

Заключение

В данной работе было продемонстрировано разработанное автором на языке высокого уровня С++ мультимедийное приложение с использованием библиотеки SFML. Данное приложение представляет собой анимационный платформер в стилистике олдскульных игр прошлого столетия. Данная работа демонстрирует обширные графические и мультимедийные возможности библиотеки SFML. На данный момент при написании подобного рода приложений используют низкоуровневую библиотеку OpenGL, но возможности данной библиотеки ограничены в сравнении с библиотекой SFML. Результаты данной работы свидетельствуют о том, что в перспективе данную библиотеку можно использовать не только для создания игр, но также и при реализации достаточно серьезных проектов, требующих качественную анимацию и обширные графические возможности. Например, при реализации программного обеспечения позволяющего проектировать сложные технические системы с графической составляющей для более наглядного представления информации.


Библиографический список
  1. Шилдт, Герберт. С++: базовый курс, 3-е издание. : Пер. с англ. – М. : Издательский дом “Вильямс”, 2010. – 624 с. : ил. – Парал. Тит. англ.
  2. Simple and Fast Multimedia Library [Электронный ресурс]: SFML and Visual studio – Режим доступа: http://www.sfml-dev.org/tutorials/2.0/start-vc.php.
  3. Карандеев Д.Ю. Анализ программных обеспечений, позволяющих моделировать сложные технические системы // Современная техника и технологии. 2015. № 12 [Электронный ресурс]. URL: http://technology.snauka.ru/2015/12/8366.
  4. Карандеев Д.Ю., Энгель Е.А. Прямое управление моментом асинхронного двигателя с использованием адаптивного нейроконтроллера в условиях неопределенности // Интернет-журнал «НАУКОВЕДЕНИЕ» Том 7, №5 (2015).
  5. Основные принципы проектирования сложных технических систем в приложениях [Текст] / Е. А. Будылина [и др.] // Молодой ученый. — 2013. — №5. — С. 42-45.


Все статьи автора «Карандеев Денис Юрьевич»


© Если вы обнаружили нарушение авторских или смежных прав, пожалуйста, незамедлительно сообщите нам об этом по электронной почте или через форму обратной связи.

Связь с автором (комментарии/рецензии к статье)

Оставить комментарий

Вы должны авторизоваться, чтобы оставить комментарий.

Если Вы еще не зарегистрированы на сайте, то Вам необходимо зарегистрироваться:
  • Регистрация