Создание игры на c в visual studio

Обновлено: 04.07.2024

На хабре не очень много уроков по созданию игр, почему бы не поддержать отечественных девелоперов?
Представляю вам свои уроки, которые учат создавать игры на C++ с использованием SDL!

Что нужно знать

  • Хотя бы начальные знания C++ (использовать будем Visual Studio)
  • Терпение

О чем эта часть?

  • Мы создадим каркас для всех игр, в качестве отрисовщика будем использовать SDL. Это библиотека для графики.

В следующих постах будет больше экшена, это лишь подготовка :)

Почему SDL?

Я выбрал эту библиотеку как наиболее легкую и быструю в освоении. Действительно, от первой прочитанной статьи по OpenGL или DirectX до стотысячного переиздания змейки пройдет немало времени.

Теперь можно стартовать.

1.1. Начало начал

Скачиваем SDL с официального сайта.
Создаем проект Win32 в Visual Studio, подключаем lib'ы и includ'ы SDL (если вы не умеете этого делать, то гугл вам в помощь!)

Также необходимо использовать многобайтную кодировку символов. Для этого идем в Проект->Свойства->Свойства конфигурации->Набор символов->Использовать многобайтную кодировку.

Создаем файл main.cpp

Пока что он ничего не делает.

Царь и бог каркаса — класс Game
Game.h


Создаем файл Project.h, он нам очень пригодится в будущем


Уже чуточку получше, но все равно как-то не густо.

1.2. Графика

Создаем аж 2 класса — Graphics для отрисовки графики и Image для отрисовки картинок


SDL_Surface — класс из SDL для хранения информации об картинке
Рассмотрим Graphics
NewImage — есть 2 варианта загрузки картинки. Первый вариант просто грузит картинку, а второй после этого еще и дает прозрачность картинке. Если у нас красный фон в картинке, то вводим r=255,g=0,b=0
DrawImage — тоже 2 варианта отрисовки картинки. Первый рисует всю картинку целиком, второй только часть картинки. startX, startY — координаты начала части картинки. endX, endY — конечные координаты части картинки. Этот метод рисования применяется, если используются атласы картинок. Вот пример атласа:


(изображение взято из веб-ресурса interesnoe.info)

Рассмотрим Image
Он просто держит свой сурфейс и дает право доступа к своим закрытым членам классу Graphics, а он изменяет сурфейс.
По сути, это обертка над SDL_Surface. Также он дает размер картинки

В конструкторе инициализируется SDL и создается экран.
Функция Flip должна вызываться каждый раз после отрисовки картинок, она представляет получившееся на экран и чистит экран в черный цвет для дальнешней отрисовки.
Остальные функции малоинтересны, рекомендую разобраться в них самому

Нет, вы все правильно делаете, этот файл и должен быть таким :)

Надо изменить Game.h, Game.cpp и main.cpp
Game.h

Тут мы добавляем указатель на Graphics и в Execute добавляем размер экрана


Ничего особенного, разве что не пропустите функцию SDL_Quit для очистки SDL

Тут мы создаем экран размером 500 на 350.

1.3. Ввод

Надо поработать со вводом с клавиатуры

SDL_Event — класс какого-нибудь события, его мы держим в Input'е для того, чтобы не создавать объект этого класса каждый цикл
Ниже расположены методы, не представляющие особого интереса. Примечание: методы с окончанием Down вызываются, когда клавиша была нажата, а с окончанием Up — когда опущена.

Здесь мы обрабатываем наш объект событий в функции Update, а остальные функции просто проверяют тип события и его значения.

Изменяем теперь Game.h и Game.cpp

Как видно, мы добавили указатель на Input и создали методы-возвращатели Graphics и Input

1.4. Итоги

Это был первый урок. Если вы дошли до этого места, я вас поздравляю! У вас есть воля, присущая программисту :) Смотрите ссылки в начале статьи на последующие уроки для того, чтобы узнать еще много нового!

В этом учебном руководстве вы создадите игру "Подбери пару!", в которой игрок должен подобрать пару скрытым значкам.

В этом учебнике выполняются перечисленные ниже задачи.

сохранять объекты, например значки, в объекте List<T>;

отслеживать состояние формы с помощью ссылочных переменных;

создавать обработчик событий, который можно использовать для нескольких объектов;

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

По завершении приложение должно выглядеть следующим образом.

Игра, которую вы создадите в этом учебном руководстве

Ссылки на руководства

Заголовок Описание
Шаг 1. Создание проекта и добавление таблицы в форму Начните с создания проекта и добавления элемента управления TableLayoutPanel , чтобы все элементы управления были правильно выровнены.
Шаг 2. Добавление случайного объекта и списка значков Добавление объектов Random и List для создания списка значков.
Шаг 3. Назначение каждому элементу управления Label случайного значка Случайным образом назначьте значки элементам управления Label , чтобы каждая игра отличалась от остальных.
Шаг 4. Добавление обработчика событий Click к каждому элементу управления Label Добавление обработчика события Click , изменяющего цвет метки, которую щелкнули.
Шаг 5. Добавление ссылок на элементы управления Label Добавление ссылочных переменных для отслеживания меток, которые щелкнули.
Шаг 6. Добавление таймера Добавьте таймер в форму, чтобы отслеживать время, прошедшее с начала игры.
Шаг 7. Отмена исчезновения пар значков Отмена исчезновения пар значков, если выбрана одинаковая пара.
Шаг 8. Добавление метода для проверки того, выиграл ли игрок Добавление метода CheckForWinner() для проверки, выиграл ли игрок.
Шаг 9. Изучение других возможностей Изучение других функций, таких как изменение значков и цветов, добавление сетки и добавление звуков. Увеличение игрового поля и изменение настроек таймера.

Разрабатывайте высокопроизводительные двух- и трехмерные игры с DirectX, которые запускаются на различных устройствах семейства Windows, включая настольные системы, планшеты и телефоны. Visual Studio предлагает отличный набор инструментов для создания игр с DirectX, позволяющих писать код для шейдеров и разрабатывать ресурсы или отлаживать и профилировать графику, — и все это в рамках знакомой среды IDE Visual Studio.

screenshot of Forza driving game

Шаблоны проектов

Быстрое начало работы

Начните создавать игры DirectX в Visual Studio с помощью встроенных шаблонов проектов DirectX. При создании игр DirectX 12 или DirectX 11 для Windows или Windows Phone вы найдете шаблон, который вам подходит.

Отладка графики

Локальный или удаленный захват кадров

Устранение проблем отрисовки может быть непростой задачей. Visual Studio Graphics Diagnostics вместе с отдельным средством PIX on Windows предоставляет простой способ захвата и анализа кадров из игр DirectX 10, 11 или 12 локально или удаленно. Можно проверять каждое событие DirectX, объект графики, журнал пикселей и изучать графический конвейер для того, чтобы понять, что именно произошло во время кадра. Это средство также фиксирует стеки вызовов для каждого события графики, упрощая переход обратно в код приложения в Visual Studio.

Отладка кода шейдера

Тот же высококлассный отладчик теперь работает для отладки кода шейдеров

Отладка кода шейдера из захваченного кадра — отличный способ выявить источник проблем отрисовки. Просто установите точку останова в коде шейдера и нажмите клавишу F5 для его отладки. Можно проверить переменные и выражения в окне “Locals” и “Autos”. Если вы раньше использовали отладчик Visual Studio для других языков, эта задача не представит для вас никакой проблемы.

Увеличение частоты кадров

Поиск ресурсоемких вызовов прорисовки

Ищете способы увеличения частоты кадров для игры? Средство анализа кадров Visual Studio может пригодиться. Оно анализирует записанные кадры для поиска ресурсоемких вызовов прорисовки и выполняет с ними эксперименты для просмотра возможностей оптимизации производительности. Вся информация предоставляется в удобном отчете.

Анализ использования графического процессора

Сведения о том, как игра загружает ЦП и графический процессор

Использование функции Visual Studio GPU Usage или PIX в Windows для выяснения того, как выполняется игра на ЦП и графическом процессоре. Функция “Использование графического процессора” в реальном времени обеспечивает сбор данных, дополняющих анализ кадров, который выполняется над захваченными кадрами в автономном режиме. Отчет об использовании графического процессора ясно показывает, где находится узкое место – на ЦП или графическом процессоре.

Редактор кода шейдера

Цветовая разметка синтаксиса шейдера

Вне зависимости от того, размещается ли код шейдера в файлах HLSL или FX, редактор Visual Studio их распознает. Редактор шейдера предоставляет выделение синтаксиса и фигурные скобки автозаполнения, обеспечивая удобный способ для чтения и записи кода шейдера в Visual Studio. Можно также настроить редактор для использования избранных шрифтов и темы.

Компиляция кода шейдера

Файлы шейдера являются частью проекта

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

Создание шейдеров

…в конструкторе шейдеров Visual Studio

Если вы не знаете HLSL и предпочитаете более наглядный способ создания шейдеров, конструктор шейдеров Visual Studio вам в этом поможет. Вместо того чтобы писать код шейдера в редакторе, добавьте и подключите узлы шейдера с помощью графического интерфейса. Вы можете применять различные текстуры, лампочки и даже добавлять и просматривать анимации в режиме реального времени. Создание шейдеров никогда не было таким простым.

Просмотр трехмерных моделей

…в средстве просмотра моделей Visual Studio

Не нужно выходить из интегрированной среды разработки, в которой вы уже работаете, просто для просмотра последних 3D-моделей, отправленных вам художником. Можно просмотреть 3D-модели OBJ и FBX в среде Visual Studio. Панорамирование, масштаб, изменение позиций камеры, просмотр объекты анимации на основе времени — в трехмерном мире невероятно много вещей для анализа. В средстве просмотра моделей можно также вносить простые изменения в модели.

Редактировать текстуры

…в редакторе изображений Visual Studio

Редактор изображений Visual Studio не только прекрасно работает с файлами изображений, но также распознает файлы текстуры DirectDraw Surface (DDS). Помимо базового просмотра и функциональности рисования можно также переключать каналы RGBA, создавать MIP-карты и применять фильтры. Этот редактор изображений способен выполнить многие задачи по изменению текстуры.

Конвейер содержимого ресурсов

Управление конвейерами содержимого

Работа с ресурсами в различных форматах может быть невероятно сложной. Visual Studio предоставляет средства управления конвейерами содержимого для изображений, моделей и шейдеров. Просто задайте свойства файла для использования конвейера содержимого и настройте параметры. Visual Studio выполнит преобразования формата автоматически во время построения.

Ядро Unity объединяется в одну непревзойденную платформу, позволяющую создавать двухмерные и трехмерные игры и интерактивное содержимое. Создайте одну игру и опубликуйте ее на 21 платформе, включая все мобильные платформы, WebGL, настольные системы (Mac, ПК и Linux), Интернет или приставки. Используйте мощные кроссплатформенные инструменты, чтобы обеспечить прекрасное выполнение своего интерактивного содержимого на любом устройстве.

Unity 3D screeenshot of AircraftJet

Отладка в Visual Studio

Высококлассная отладка для игр на основе Unity в Visual Studio

Visual Studio обеспечивает первоклассную отладку игрового ядра Unity. Быстро выявляйте проблемы, отлаживая игры на основе Unity в Visual Studio: задавайте точки останова и оценивайте переменные и сложные выражения. Вы можете выполнять отладку игры Unity, запущенной в Unity Editor или Unity Player, и даже отлаживать внешнюю управляемую библиотеку DLL в Unity Project.

Unity debugging screenshot

Unity Quick MonoBehaviours screenshot

Повышение производительности

Полнофункциональная среда IDE для Unity

Программируйте эффективнее, используя все возможности повышения производительности, предлагаемые Visual Studio, в том числе IntelliSense, рефакторинг и просмотр кода. Настройте среду программирования в полном соответствии со своими потребностями — выберите любимую тему, цвет, шрифты и остальные параметры. Кроме того, используйте Unity Project Explorer для перехода к сценариям Unity и их создания. Вам больше не надо переключаться между несколькими интегрированными средами разработки. Вы можете быстро создавать методы сценариев Unity в Visual Studio, используя мастера реализации поведений MonoBehaviour и быстрых поведений MonoBehaviour.

Unreal Engine4— это полный набор инструментов для разработки игр, созданный опытными специалистами в этой области для своих коллег. В Unreal Engine 4 есть все необходимое для создания двухмерных мобильных игр, консольных блокбастеров и игр в виртуальной реальности, чтобы вы могли приступить к их разработке, распространять и совершенствовать их, а также составить достойную конкуренцию другим компаниям в этой отрасли. Изменяйте, создавайте и отлаживайте игры на основе Unreal на языке C++ в Visual Studio, чтобы повысить продуктивность.

Unreal Engine 4 code screenshot

Программирование в Visual Studio

Unreal Engine легко интегрируется с Visual Studio, позволяя быстро вносить изменения в код проекта и увидеть результаты сразу после компиляции. Пишите код с многофункциональной поддержкой IntelliSense с динамическим списком ошибок и комментариев, чтобы ускорить рабочий процесс. Экономьте время, используя интеллектуальные предложения IntelliCode о типах пользовательского оборудования. При желании можно обучить модель IntelliCode локально с помощью базы кода команды и получать конкретные предложения, основанные на типах и шаблонах кодирования команды.

Отладка в Visual Studio

Visual Studio обеспечивает высококлассную отладку в рамках Unreal Engine. Вы можете легко отлаживать проекты Unreal с помощью расширенной поддержки с визуализаторами и исследовать распространенные типы Unreal, такие как FNames и динамические массивы. Вы можете также проверить производительность программы: просто обратите внимание на советы по производительности, которые отображаются в редакторе.

Cocos — это предназначенный для создания игр профессиональный пакет средств разработки с открытым исходным кодом, который упрощает процесс разработки. С помощью Cocos вы можете быстро создавать проекты, разрабатывать игры и анимационные клипы, а также пакетировать и публиковать игры для распространения. Создавайте игры Cocos, используя мощную среду IDE Visual Studio IDE, и выполняйте отладку с помощью первоклассного отладчика Visual Studio, чтобы значительно повысить эффективность своей работы.

Cocos Creator screenshot

Программирование в Visual Studio

Подсистема Cocos полностью интегрируется с Visual Studio и позволяет программировать эффективнее, используя все возможности повышения производительности, предлагаемые Visual Studio, в том числе IntelliSense, рефакторинг и просмотр кода. Компилируйте и запускайте проекты в Visual Studio, чтобы сразу просмотреть влияние изменений в коде.

Cocos IntelliSense screenshot

Cocos debugging screenshot

Отладка в Visual Studio

Используйте мощный отладчик Visual Studio, чтобы быстрее находить ошибки. Отладчик Visual Studio интегрируется с рабочим процессом разработки игр на Cocos: задайте точки останова и начните вычислять переменные и выражения. Вы можете также проверить производительность программы: просто ознакомьтесь с советами по производительности, которые отображаются в редакторе.

Создание серверной инфраструктуры для игр

Azure предоставляет гибкие возможности выбора для серверной части игр в облаке. Для вычислений можно использовать такие предложения IaaS, как виртуальная машина, масштабируемые наборы виртуальных машин в Windows и Linux, или же предложения PaaS, например Service Fabric и Службу приложений. В качестве хранилища данных можно использовать управляемые службы баз данных, такие как База данных SQL Azure и Azure DocumentDB, а также MongoDB и другие варианты из Azure Marketplace.

Azure Services Collaborators leverage PaaS offerings

Multiplayer gamer scenario enabled with Azure Active Directory

Сохранение заинтересованности игроков

Внедрите многопользовательские режимы и списки лидеров, используя Azure Active Directory. Например, управляйте поставщиками удостоверений социальных сетей, таких как Facebook, Google и Майкрософт. Управляйте удержанием игроков, повышением вовлеченности пользователей и монетизацией на разных платформах с помощью Центров уведомлений Azure и Служб мультимедиа Azure.

Исследование больших данных для подробного анализа игр

Создайте многофункциональную платформу сквозного анализа игр в Azure с помощью средств из Cortana Intelligence Suite и решений для больших данных. Анализируйте поведение игроков на мобильных устройствах с помощью таких служб, как машинное обучение Azure и службы мобильного взаимодействия Azure, чтобы максимально увеличить частоту использования приложения, удержание пользователей и монетизацию.

Здравствуйте! Сегодня мы будем писать платформер, используя C++, Box2D и SFML, а также редактор 2D карт для игр Tiled Map Editor.

image

Вот результат (карта создавалась 5 минут + во время сьемки игра тормозила + экран не так растянут — дефект Bandicam):

Исходники и exe — внизу статьи.

Что, где, когда?

Box2D

Эту библиотеку мы будем использовать для симуляции физики в платформере (столкновение с блоками, гравитация). Возможно, не стоило для одних только блоков юзать эту библиотеку, но красиво жить не запретишь ;)
Почему именно Box2D? Потому что это самая распространенная и бесплатная физическая библиотека

Почему SFML? Вначале я хотел использовать библиотеку SDL, но она сильно ограничена в возможностях по сравнению с SFML, многое пришлось бы дописывать самому. Спасибо автору SFML за сэкономленное время!
Ее используем для отрисовки графики

Tiled Map Editor

Что делает тут Tiled Map Editor?
Вы когда-нибудь пробовали создавать карты для игр? Спорим, что вашей первой картой было что-то наподобие такого.

Это довольно неэффективное решение! Гораздо лучше написать что-то вроде редактора карт, но задним числом мы понимаем, что это не делается за 5 минут, а приведенная выше «карта» — вполне.

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

Создание карты

Скачиваем TME с официального сайта
Создаем новую карту «Файл->Создать. »

image

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

Тайлы

Затем идем в «Карта->Новый набор тайлов. », загружаем наш тайлсет:

image

В итоге у вас получится что-то вроде этого:

image

В чем смысл слоев тайлов?
Почти в каждой игре есть многослойные карты. Первый слой — земля (лед, чернозем, etc), второй слой — здания (казармы, форт, etc, причем фон прозрачен), третий — деревья (ель, пихта, etc, фон тоже прозрачен). То есть рисуется сначала первый слой, поверх него накладывается второй слой, а потом уже третий.

Процесс создания слоев запечатлен на следующих 4 скриншотах:

image

image

image

image

Объекты

Что такое объект в TME?
Объект имеет свое имя, тип, а также параметры со значениями.
За объекты отвечает эта панель

image

Вы вполне можете узнать, что делает каждая из кнопок, сами.
Теперь попробуем создать объект.
Удаляем слой «Колобоша», вместо него создаем слой объектов, допустим, с тем же названием «Колобоша». Выбираем «Вставить тайл-объект» из панели для объектов (или можете выбрать любую фигуру — Shape), нажимаем на тайл Колобоши и просто ставим объект в какое-нибудь место.
После чего нажимаем правой кнопкой мыши на объект и нажимаем на «Свойства объекта. ». Измените имя объекта на Kolobosha.

После чего сохраните карту.

В общем, ничего архисложного в редакторах карт нету. Пора переходить к считыванию карты.

Считывание карты

Для считывания XML файлов создана отличная библиотека TinyXML, скачайте ее исходники.

Создайте проект Visual Studio. Подключите файлы TinyXML (или просто запихайте все эти файлы в проект, за исключением xmltest.cpp :) )
Теперь подключаем includ'ы и lib'ы SFML в «Проект->Свойства». Если не знаете, как это делать — добро пожаловать в Гугл

Создаем Level.h для карт


Это начало файла.

Дальше идет структура объекта

Разберем её.
Как уже говорилось, в TME каждый объект может иметь параметры. Параметры берутся из XML файла, записываются в properties, и потом их можно получить любой из первых трех функций. name — имя объекта, type — его тип, rect — прямоугольник, описывающий объект. И наконец, sprite — спрайт (изображение) — часть тайлсета, взятая для объекта. Спрайта может и не быть.

Теперь идет структура слоя — она очень проста


В слое есть прозрачность (да, да, мы можем делать полупрозрачные слои!) и список из тайлов.

Дальше идет класс Level:

LoadFromFile загружает карту из указанного файла. Это сердце класса Level.
GetObject возвращает первый объект с указанным именем, GetObjects возвращает список объектов с указанным именем. Вообще-то, по-хорошему, следовало использовать тип (type) объекта, но мне было удобнее вылавливать блоки и игрока через имя, так как в редакторе имя показывается сверху объекта, а тип — нет.
Draw рисует все тайлы (не объекты!), беря себе экземпляр RenderWindow.

Теперь создаем Level.cpp:

Первым мы обрабатываем структуру объектов


Для Layer реализация не нужна, переходим к Level:

Остальные функции Level:

С Level.h окончено!

Протестируем его.
Создаем main.cpp и пишем:

Карта может выглядеть как угодно!

Можете поиграться с объектами:

image

image

Когда вы наиграетесь с объектами, наступит пора Box2D:

Коробки-коробочки

Мы хотим создать 3D-экшон платформер, суть такова…
На карте расположены объекты — с названиями player — игрок, enemy — враг, block — блок, money — монетки.
Мы загружаем игрока, заставляем его повиноваться нажатиям клавиши и силе Ньютона.
Враги ходят туда-сюда, отталкивают слишком близко находящегося игрока и погибают, если игрок прыгает на них
Блоки закрепляются «в воздухе» как статичные объекты, на них игрок может прыгать
Монеты ничего не дают, просто исчезают при столкновении с игроком

Открываем main.h, стираем то, что там было написано, и пишем:

Здесь у нас подключены level.h и Box2D.h. iostream нужен для вывода в консоль, random — для генерации направления движения врага.
Далее идут игрок и векторы, каждому врагу, монетке, игроку полагается свой Object и b2Body (тело в Box2D).

Внимание — блокам этого не полагается, так как они взаимодействуют с игроком только на уровне физики Box2D, а не в игровой логике.


srand(time(NULL)) нужен для рандома.

Загружаем карту, создаем b2World, передавая ей гравитацию. Кстати, гравитация может исходить из какого угодно направления, и гравитация из (0,10) действует сильнее (0,1). Потом мы берем нужный нам размер тайлов

Далее создаем тела блоков:

Блоки — статические тела, они не имеют массы и висят в воздухе:

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

Создаем тело блока в world. Далее мы с телом не работаем (в смысле, нигде не храним):

Каждому телу принадлежит несколько shape — фигур. Я не буду подробно разбирать эту тему, так как блокам (и остальным телам) хватает всего-то одного прямоугольника.

Связываем фигуру с телом.

Затем мы делаем то же самое с врагами, монетами и игроком, за небольшими различиями:

Означает, что тело не может вращаться.

Все тела созданы, осталось инициализировать графику!

Хорошо понятный код, создает окно с указанным размером и заголовком:

Тут мы создаем вид (View) для окна.

Зачем это надо? Для того, чтобы придать игре пиксельный стиль, мы умножаем размер экрана на 2 с использованием sf::View и все картинки рисуются в 2 раза выше и шире.

Окно закрывается по нажатию на красный крестик. Такой код был ранее:

Тут уже интереснее! Мы добавляем скорость игроку по нажатию клавиш WAD:

Тут мы обновляем физический мир Box2D. Первый аргумент принимает частоту обновления мира (раз в 1/60 секунд), а также количество velocityIterations и positionIterations. Чем выше значение последних двух аргументов, тем реальнее получается физика игры. Так как у нас нету никаких сложных фигур, как в AngryBirds, а только прямоугольники, то нам достаточно по разу.

Здесь мы обрабатываем столкновение игрока с другими телами:

Обработка столкновения с монетами.
Если какая монета столкнулась с игроком, она просто уничтожается и стирается из векторов:

Если враг сталкивается с игроком, проверяется, выше игрок врага или нет. Если игрок выше врага, то он стирается, а игрок подскакивает вверх.

Если иначе, то игрок отскакивает от врага:

Игрок движется направо или налево в соотвествии с его текущим положением относительно врага.

Если скорость врага равна 0, то ему скорость придается вновь — он движется либо направо, либо налево. Визуально это выглядит как движение рывками.

Работа с графикой. Берем позицию игрока, изменяем центр вида и используем наш вид

Устанавливаем спрайтам игрока, монет и врагов позиции, полученные из b2Body:

Очищаем окна, рисуем тайлы карты, потом игрока, монеты и врагов, после чего представляем окно.

Читайте также: