Как сделать игру на икс
Как записать игру на диск для Xbox 360
Сегодня расскажу вам как правильно записать диск с игрой для Xbox 360.
Начнем с самого главного – привод.
Запись дисков поддерживается приводами с чипом от MTK (Mediatek):
— Lite-on iHas B, C, и D все модели
— Поддерживается большинство моделей: ASUS, Samsung, Pioneer
Вы можете узнать поддерживает ли у вас запись дисков, об этом я напишу ниже.
Диск VS я покупал в ашане ( по цене 40 рублей, в других они стоили около 100)
Verbatim я покупал реже, так как они стоят дороже.
Если у вас это все есть в наличии, то можно приступать к записи диска
Шаг 1. Проверка образа
Скачиваем образ диска с интернета, их вы можете найти практически на любом торрент-трекере
Скачиваем программу [ссылка 1] ABGX360. Она поможет нам проверить образ, пропатчить и исправить все необходимое
Устанавливаем и настраиваем программу так, как указано на картинках и сохраняем настройки.
В окошке над настройками выбираем наш заранее скачанный образ и нажимаем Launch
В конце мы ожидаем увидеть такую портянку:
(Во время проверки у вас должен быть подключен интернет)
Шаг 2. Подготовка к записи
Скачиваем программу BurnerMAX Payload Tool. [ссылка 2]
Данная программа нужна для того что бы записать в недоступном, для обычного режима записи, участке диска.
Данную программу нужно запускать перед каждой записью диска и оставлять до самого конца записи.
Шаг 3. Трем сыр. Запись диска
Скачиваем и устанавливаем программу. ImgBurn [ссылка 3 ]
Выбираем пункт запись образа на диск.
Как видите, на картинке так же отображается количество информации которое можно записать на диск ( оно должно совпадать с кол-вом информации в программе BurnerMax)
Выбираем его для записи
Нажимаем запись. Наслаждаемся игрой.
В случае проблем или возникновения вопросов, задавайте в комментариях, постараюсь ответить
Как создаются видеоигры от идеи до продажи
Многие геймеры с удовольствием проходят игру за игрой и требуют от разработчиков еще, но понятия не имеют, сколько времени уходит на создание видеоигр. В зависимости от масштабов проекта и сложности реализации его отдельных составляющих, производство одной игры может занять как несколько месяцев, так и перерасти в годы тяжелой работы.
Именно поэтому разработка видеоигр – это титанический труд, который даже сложнее производства фильмов. В этой статье разберем все этапы создания игр по порядку, чтобы вы поняли, как это происходит.
Цель будущего проекта
Все начинается с того, что руководитель проекта должен придумать цель для будущей игры. То есть, если команда хочет, чтобы их детище стало мегапопулярным и собрало огромную кассу, то предстоит длительное время размышлять, что это будет за игра, почему ее могут купить и, самое главное, как спланировать задачи, чтобы проект удалось выпустить вовремя, пока на него еще есть спрос.
На первом этапе руководитель проекта также должен определиться с жанром. По сути, это вообще фундамент каждой видеоигры, который в процессе разработки может обрастать дополнениями. Тем не менее полностью менять жанр посреди производственного процесса глупая затея, проще будет начать создание с нуля. Также на первом этапе нужно определиться с сеттингом. Сеттинг – это разновидность стилистик или виртуальных миров, к которым принадлежит проект. Например, фэнтези, sci-fi, стимпанк, постапокалипсис, анимэ, Вторая мировая война и еще масса других вариантов. Когда разработчики поставили перед собой цель, определились с жанром и сеттингом, они могут идти дальше.
Инструменты для разработки
Первым делом разработчики определяются с языком программирования, который и будет основным инструментом для разработки игры. Этим занимается команда программистов, которая должна в зависимости от жанра и сеттинга подбирает подходящий язык программирования. С его помощью создатели начинают оперировать двухмерными и трехмерными объектами в игре, а также привязывают к нему изображения, видео и звуки. Язык программирования словно нить с иголкой помогает сшить все элементы будущей игры воедино.
Также важной частью инструментов для разработки является движок. Сегодня уже никто не делает игры используя исключительно один язык программирования, потому что есть готовые модули, которые и называются движками. Они содержат в себе базовый функционал, который упрощает разработку, но чтобы слепить из готовых инструментов стоящую игру, придется писать много кода. Собственно, это и отнимает больше всего времени в процессе разработки.
Игровая механика
Когда разработчики определились с инструментами, они начинают создавать игровую механику. На деле, это самая важная составляющая любой игры, а не графика, как считают многие неокрепшие в мире видеоигр умы, да простят меня графодрочеры. Механика проекта – это реализация его геймплея. Разработчики должны прописать как будет двигаться персонаж, что будет происходить во время битвы с противниками, как работают бонусы или прокачка и многое другое, зависит от жанра.
Если представить игру в виде автомобиля, то его механика – это все основные системы внутри конструкции, которые заставляют транспортное средство двигаться и выполнять какие-то задачи. Вряд ли вы сильно обрадуетесь, если машина будет иметь потрясающий внешний вид, но из-за кривой механики во время езды ее постоянно будет вести то влево, то вправо. Именно поэтому механику в играх всему голова.
Прототипирование для чайников: как сделать хорошую игру
Что касается реализации игровой механики, то все начинается с программирования объектов, к которым относится главный герой и другие модели. Далее идет программирование управления и написание физического движка. Второй, как правило, отвечает за движения объектов, которые происходят без воздействия на них игрока. И, наконец, разработчики садятся за написание искусственного интеллекта (ИИ), который помогает оживить NPC, врагов и прочих персонажей в игре.
Место действия
Когда игровая механика готова, разработчики переходят к созданию уровней. Получается, что у них на руках уже есть определенная сводка правил, которая работает, и нужно разработать места, где они будут применяться. В каждой игре есть уровни и определенные локации. Даже в проектах с открытым миром есть конкретные области, которые реализуются отдельно и потом собираются по кусочкам, просто в готовом виде игроки это не замечают.
Как правило, созданием уровней занимаются левелдизайнеры. Причем сотрудников на эту должность берут из числа заядлых геймеров. Только человек, который регулярно играет, может понять, как от перемещения главного героя и объектов в конкретной локации будут меняться игровые ситуации. Все это прорабатывается до мелочей, так что не думайте, что уровни создаются на скорую руку, лишь бы сделать красивое оформление. Над каждым участком игры работают профессионалы и это занимает кучу времени.
Что из себя представляет профессия геймдизайнер и что нужно делать на должности
Внешний вид игры
Только после того, как у проекта уже появилась механика и базовые модели уровней, разработчики садятся за графику. Им нужно украсить блеклые формы красивой картинкой, чтобы подчеркнуть сеттинг проекта и в игру было приятно играть. Изначально дизайнеры рисуют арты, которые кучу раз переделываются или улучшаются. Когда появляются окончательные варианты артов, в дело вступают люди, которые занимаются 3D моделированием. Они создают виртуальные модели на основе рисунков.
Далее разработчики делают анимирование 3D моделей, которые ранее были созданы, и переходят к завершающему этапу создания графики. На нем нужно сделать фоны для уровней, добавить какие-то спецэффекты и украсить игровое меню. Когда все наконец-то будет готово можно двигаться дальше.
Увлекательная история
Как правило, уже после создания «костяка» игры и графической составляющей создатели переходят к сюжету. Чтобы проект купили, он должен быть интересным, и поэтому с каждым годом на эту составляющую игры делают все больший акцент. Есть студии, которые изначально придумывают сюжет и прописывают его до мельчайших деталей, а потом уже садятся за разработку. Такой вариант тоже возможен и он работает, но большая часть игр все же делается по старинке, сразу со скелета, а потом уже добавляют какой-то сюжет.
Если вы думаете, что на этом этапе достаточно придумать историю и как-то подвязать под нее игру, то ошибаетесь. Разработка сюжета включает в себя реализацию диалогов, видеовставки, заскриптованные сцены, случайные события в игре и даже изменение повествования в зависимости от действий игрока, если это предусмотрено игрой.
Звуковое сопровождение
Согласитесь, какой бы красивой и увлекательной не была игра, если в ней нет звука, то вы вряд ли задержитесь в ней дольше, чем на пару минут. Последний этап процесса разработки включает в себя создание звуковых эффектов. Они не просто помогают услышать игру, а могут положительно сказаться на ощущении атмосферы. Опытные разработчики делают невероятные вещи со звуком, которые помогают их проектам громко выстреливать на этапе продаж.
Кроме звуковых эффектов, также записывается музыка и делается озвучка персонажей. Без этого тоже никуда, и часто богатые студии даже привлекают известных музыкантов или актеров на это дело. В итоге в игре могут звучать песни вашей любимой группы, либо какой-то персонаж заговорит голосом популярного голливудского актера. Когда в проекте появляется звук, он практически завершен, но разработчикам нужно решить последнюю задачу, от результата которой напрямую зависит успех игры.
Тестирование
Практически за каждый вышеописанный этап отвечает отдельный человек или группа людей. Игры всегда создаются по частям, параллельно с завершением определенных ее кусочков программисты собирают из всего этого полноценный пазл. После того, как они накинут на проект звук, можно перейти к этапу тестирования, который часто доставляет больше всего проблем.
На этом этапе финальная версия проекта переходит в руки тестировщиков. Им нужно месяцами проходить один участок игры за другим и выискивать в нем ошибки. Каждая игра — это огромный проект, над которым работают десятки, а то и сотни человек, поэтому проблем в них куча. Задача тестеров отловить большинство из них и отдать отчет программистам, чтобы те исправили ошибки. Именно большинство, ведь избавиться от всех багов невозможно. Не было еще ни одной игры, которая на релизе была бы идеальной. Такой ее может сделать только качественная поддержка от разработчиков в будущем, но об этом позже.
Кто такие игровые тестировщики и почему это одна из самых неблагодарных профессий в IT
Продажа игры
Когда проект наконец-то готов или находится на завершающей стадии разработки, в дело вступает издатель. Его основная задача заниматься рекламой, локализацией и выбором площадок для продажи проекта. Если игру делает инди-студия, то этим она занимается самостоятельно, потому что у нее либо ограниченный бюджет, либо его нет. Издатель же дает деньги на реализацию в самом начале разработки, поэтому он так важен для создателей видеоигр.
Пожалуй, самая сложная задача – это выбор способа распространения игры. Дело в том, что сегодня есть множество онлайн площадок с играми и с каждым годом их становится все больше. У всех этих Steam, Origin, Epic Store и прочих виртуальных магазинчиков своя аудитория и свои правила для разработчиков. При этом именно издатель выбирает с кем сотрудничать, чтобы ему было выгодно, и потом игра может появиться либо только в одном магазине, либо во всех сразу. Естественно, не обходится без физических носителей, но их выпускают только если проект популярен и его делает крупная компания. Инди-игры на дисках вы не увидите, их можно купить только в онлайн магазинах, есть пара исключений, но они появляются только в том случае, если проект от независимых разработчиков стал известен во всем мире. Чтобы заработать еще денег, выпускают тираж дисковой версии.
Техническая поддержка
Казалось бы, после того как игра разработана и поступила в продажу, разработчики могут забить на нее и спокойно ждать поступления денег на счет. Некоторые так и делают, только с таким подходом на одном выпущенном проекте их существование как разработчиков игр заканчивается. Популярные студии постоянно следят за развитием игры и непрерывно выпускают патчи, которые исправляют ошибки в проекте или что-то в нем меняют, например, баланс, если он важен в игре. У некоторых компаний даже есть полноценные отделы технической поддержки, где люди не занимаются разработкой проекта, а подключаются только после релиза для создания патчей.
Также к поддержке игры можно отнести создание многочисленных DLC, на которых можно снова заработать денег. При этом они добавляют в уже знакомую игру еще несколько часов геймплея. Некоторые DLC получаются прямо-таки отличными, но есть и те, за которые вы отваливаете чуть ли не всю стоимость полноценной игры, а получаете контента буквально на час.
Именно так выглядят все этапы разработки видеоигр, и лишь изредка последовательность может меняться. Сказать сколько времени занимает разработка игры, даже в среднем, сложно. Если это конвейеры, которыми так любят злоупотреблять ребята из EA и Ubisoft, то им достаточно 10-12 месяцев, чтобы выпустить новый CoD или Assassin’s Creed.
Когда речь идет о создании новой части GTA, то на разработку уходят годы, и это при том, что игру делают сотни человек. Соответственно, предугадать сколько будет разрабатываться игра невозможно, этого не знают даже создатели. Ведь мы прекрасно знаем, что практически каждый третий проект по несколько раз откладывают, но теперь вы хотя бы понимаете почему, работы тут навалом.
Создание браузерных 3d-игр с нуля на чистом html, css и js. Часть 1/2
Современная вычислительная техника позволяет создавать классные компьютерные игры! И сейчас, достаточно популярны игры с 3d-графикой, так как, играя в них, ты окунаешься в вымышленный мир и теряешь всякую связь с реальностью. Развитие интернета и браузерных технологий сделало возможным запускать головоломки и стрелялки в любимом Хроме, Мозилле или еще в чем-то там (про Эксплорер помолчим) в онлайн-режиме, без загрузки. Так вот, здесь я расскажу о том, как создать простую трехмерную браузерную игру.
1. Инструменты для разработки
Я использую для проверки сайтов и игр только 2 браузера: Chrome и Mozilla. Все остальные браузеры (кроме того самого Эксплорера) построены на движке первого, поэтому использовать их я не вижу смысла, ибо результаты точно такие же, как и в Chrome. Для написания кода достаточно Notepad++.
2. Как реализуется трехмерное пространство в html?
Посмотрим на систему координат блока:
По умолчанию, дочерний блок имеет координаты (left и top) 0 пикселей по x и 0 пикселей по y. Смещение (translate), также 0 пикселей по всем трем осям. Покажем это на примере, для чего создадим новую папку. В нем создадим файлы index.html, style.css и script.js. Откроем index.html и запишем туда следующее:
В файле style.css зададим стили для элементов “container” и “world”.
Сохраним. Откроем index.html c помощью Chrome, получим:
Попробуем применить translate3d к элементу “world”:
Как вы поняли, я перешел в полноэкранный режим. Теперь зададим смещение по оси Z:
transform:translate3d(200px,100px,-1000px);
Если вы снова откроете html-файл в браузере, то никаких изменений вы не увидите. Чтобы увидеть изменения, нужно задать перспективу для объекта “container”:
Квадрат отдалился от нас. Как работает перспектива в html? Взглянем на картинку:
Теперь повернем “world” вокруг какой-нибудь оси. В сss можно использовать 2 способа вращения. Первый – вращение вокруг осей x,y и z. Для этого используются transform-свойства rotateX(), rotateY() и rotateZ(). Второй – вращение вокруг заданной оси с помощью свойства rotate3d(). Мы будем использовать первый способ, так как он больше подходит для наших задач. Обратите внимание, что оси вращения выходят из центра прямоугольника!
Заметно смещение против часовой стрелки. Если же мы добавим rotateY(), то получим смещение уже по оси Y. Важно заметить, что при вращении блока оси вращения также поворачиваются. Вы также можете поэкспериментировать с различными значениями вращения.
Теперь внутри блока “world” создадим еще один блок, для этого добавим тег в html-файл:
В style.css добавим стили к этому блоку:
То есть, элементы внутри блока “world” будут трансформироваться в составе этого блока. Попробуем повернуть “square1” по оси y, добавив к нему стиль вращения:
transform: rotateY(30deg);
«Где вращение?» — спросите вы? На самом деле именно так выглядит проекция блока “square1” на плоскость, образуемую элементом “world”. Но нам нужна не проекция, а настоящее вращение. Чтобы все элементы внутри “world” стали объемными, необходимо применить к нему свойство transform-style:preserve-3d. После подстановки свойства внутрь списка стилей “world” проверим изменения:
Отлично! Половина блока “square” скрылась за голубым блоком. Чтобы его полностью показать, уберем цвет блока “world”, а именно, удалим строку background-color:#C0FFFF; Если мы добавим еще прямоугольников внутрь блока “world”, то мы можем создать трехмерный мир. Сейчас же уберем смещение мира “world”, удалив строку со свойством transform в стилях для этого элемента.
3. Создаем движение в трехмерном мире
Для того, чтобы пользователь мог по этому миру передвигаться, нужно задать обработчики нажатия клавиш и перемещения мыши. Управление будет стандартным, какое присутствует в большинстве 3д-шутеров. Клавишами W, S, A, D мы будем перемещаться вперед, назад, влево, вправо, пробелом мы будем прыгать (проще говоря – перемещаться вверх), а мышью мы будем менять направление взгляда. Для этого откроем пока еще пустой файл script.js. Сначала впишем туда такие переменные:
Изначально клавиши не нажаты. Если мы нажмем клавишу, то значение определенной переменной изменится на 1. Если отпустим ее, то она снова станет 0. Реализуем это посредством добавления обработчиков нажатия и отжатия клавиш:
Номер 32 – код пробела. Как видите, тут появилась переменная onGround, указывающая на то, находимся ли мы на земле. Пока разрешим движение вверх, добавив после переменных press… переменную onGround:
Итак, мы добавили алгоритм нажатия и отжатия. Теперь необходимо добавить само передвижение. Что, собственно, мы передвигаем. Представим, что у нас есть объект, который мы двинаем. Назовем его “pawn”. Как и принято у нормальных разработчиков, для него мы создадим отдельный класс “Player”. Классы в javaScript создаются, как ни странно, с помощью функций:
Вставим этот код в script.js в самом начале файла. В конце же файла создадим объект данного типа:
Распишем, что означают эти переменные. x, y, z – это начальные координаты игрока, rx, ry – углы его поворота относительно осей x и y в градусах. Последняя записанная строка означает, что мы создаем объект “pawn” типа “player” (специально пишу тип, а не класс, так как классы в javascript означают несколько другие вещи) с нулевыми начальными координатами. Когда мы двигаем объект, координата мира изменяться не должна, а должна изменяться координата «pawn». Это с точки зрения переменных. А с точки зрения пользователя, игрок находится на одном месте, а вот мир двигается. Таким образом, нужно заставить программу изменять координаты игрока, обрабатывать эти изменения и двигать, в конце концов, мир. На деле это проще, чем кажется.
Итак, после загрузки документа в браузер мы запустим функцию, которая перерисовывает мир. Напишем функцию перерисовки:
В новых браузерах world будет соответствовать элементу с однако надежнее ее присвоить перед функцией update() с помощью следующей конструкции:
Мы будем изменять положение мира каждые 10 мс (100 обновлений в секунду), для чего запустим бесконечный цикл:
Запустим игру. Ура, теперь мы можем двигаться! Однако мир вылазит за пределы рамок элемента «container». Чтобы этого не происходило, зададим css-свойство для него в style.css. Добавим строку overflow:hidden; и посмотрим на изменения. Теперь мир остается в пределах контейнера.
Вполне возможно, что вы не всегда понимаете, куда нужно записывать те или иные строчки кода, поэтому сейчас я вам представлю файлы, которые, как я полагаю, у вас должны получиться:
Если у вас что-то по-другому, обязательно поправьте!
Мы научились двигать персонажа, однако мы еще не умеем поворачивать его! Поворот персонажа, конечно же, будет осуществляться с помощью мыши. Для мыши к переменным состояния клавиш press… мы добавим переменные состояния движения мыши:
А после обработчиков нажатия-отжатия вставим обработчик движения:
В функцию update добавим поворот:
Обратите внимание на то, что движение мыши по оси y вращает pawn по оси x и наоборот. Если мы посмотрим на результат, то ужаснемся от увиденного. Дело в том, что если смещения нет, то MouseX и MouseY остаются прежними, а не приравниваются к нулю. Значит, после каждой итерации update смещения миши должно обнуляться:
Уже лучше, мы избавились от инерции вращения, однако вращение происходит все равно странно! Чтобы понять, что все-таки происходит, добавим div-элемент «pawn» внутрь «container»:
Зададим ему стили в style.css:
Проверим результат. Теперь все ровно! Единственное — синий квадрат остается впереди, но пока оставим это. Чтобы сделать игру от первого лица, а не от третьего, нужно приблизить мир к нам на значение perspective. Сделаем это в script.js в функции update():
Теперь можно делать игру от первого лица. Скроем pawn добавив строку в style.css:
Отлично. Сразу скажу, что ориентироваться в мире с одним квадратом крайне тяжело, поэтому создадим площадку. Добавим в «world» блок «square2»:
А в style.css добавим стили для него:
Теперь все четко. Ну… не совсем. Когда мы нажимаем по клавишам, мы движемся строго по осям X и Z. А мы хотим сделать движение по направлению взгляда. Сделаем следующее: в самом начале файла script.js добавим 2 переменные:
Градус — это pi/180 от радиана. Нам придется применить синусы и косинусы, которые считаются от радиан. Что нужно сделать? Взгляните на рисунок:
Когда наш взгляд направлен под углом и мы хотим пойти вперед, то изменятся обе координаты: X и Z. В случае перемещения в сторону тригонометрические функции просто поменяются местами, а перед образовавшимся синусом изменится знак. Изменим уравнения смещений в update():
Внимательно просмотрите все файлы полностью! Если у вас что-то оказалось не так, то потом обязательно буду ошибки, из-за которых вы сломаете голову!
С движением мы почти разобрались. Но осталось неудобство: курсор мыши может двигаться только в пределах экрана. В трехмерных шутерах можно вращать мышью сколь угодно долго и сколь угодно далеко. Сделаем также: при нажатии на экран игры (на “container”) курсор будет пропадать, и мы сможем вращать мышью без ограничений на размер экрана. Активируем захват мыши при нажатии на экран, для чего перед обработчиками нажатия клавиш поставим обработчик нажатия мыши на “container”:
Теперь совсем другое дело. Однако лучше вообще сделать так, чтобы вращение производилось только тогда, когда курсор захвачен. Введем новую переменную после переменных нажатия клавиш press…
Добавим обработчик изменения состояния захвата курсора (захвачен или нет) перед обработчиком захвата курсора (извините за тавтологию):
А в update() добавим условие вращения “pawn”:
А сам захват мыши при клике по контейнеру разрешим только тогда, когда курсор еще не захвачен:
С движением мы полностью разобрались. Перейдем к генерации мира
4. Загрузка карты
Мир в нашем случае удобнее всего представить в виде множества прямоугольников, имеющих разное местоположение, поворот, размеры и цвет. Вместо цвета также можно использовать текстуры. На самом деле, все современные трехмерные миры в играх – это набор треугольников и прямоугольников, которые называют полигонами. В крутых играх их количество может достигать десятков тысяч в одном только кадре. У нас же их будет около сотни, так как браузер сам по себе имеет невысокую графическую производительность. В предыдущих пунктах мы вставляли блоки “div” внутрь “world”. Но если таких блоков много (сотни), то вставлять каждый из них в контейнер очень утомительно. Да и уровней может быть много. Поэтому пусть эти прямоугольники вставляет javaScript, а не мы. Для него же мы будем создавать специальный массив.
Откроем index.html и удалим из блока “world” все внутренние блоки:
Теперь создадим массив прямоугольников (запихнем его, примеру, между конструктором player и переменными press… в script.js):
Можно было это сделать в виде конструктора, но пока обойдемся чисто массивом, так как запуск цикла расстановки прямоугольников проще реализовать именно через массивы, а не через конструкторы. Я же поясню, что означают цифры в нем. Массив map содержит одномерные массивы из 9 переменных: [. ]. Я думаю, вы понимаете, что первые три числа – это координаты центра прямоугольника, вторые три числа – углы поворота в градусах (относительно того же центра), затем два числа – его размеры и последнее число – фон. Причем фон может быть сплошным цветом, градиентом или фотографией. Последнее очень удобно использовать в качестве текстур.
Массив мы записали, теперь запишем функцию, которая переделает этот массив в собственно прямоугольники:
Поясню, что происходит: мы создаем новую переменную, которая указывает на только что созданный элемент. Ему мы присваиваем id и css-класс (именно это и имеется ввиду под словом класс в языке javaScript), задаем ширину с высотой, фон и трансформацию. Примечательно, что в трансформации помимо координат центра прямоугольника мы указываем смещение на 600 и 400 и половины размеров для того, чтобы центр прямоугольника точно оказался в точке с нужными координатами. Запустим генератор мира перед таймером:
Теперь мы видим площадку с розовыми стенами и серым полом. Как видите, создание карты технически несложно реализовать. А в результате ваш код в трех файлах должен получиться примерно таким:
Если все хорошо, переходим к следующему пункту.
5. Столкновения игрока с объектами мира
Мы создали технику движения, генератор мира из массива. Мы можем передвигаться по миру, который может быть красивым. Однако наш игрок еще никак не взаимодействует с ним. Чтобы это взаимодействие происходило, нам необходимо проверять, сталкивается ли игрок с каким-нибудь прямоугольником или нет? То есть, мы будем проверять наличие коллизий. Для начала вставим пустую функцию:
А вызывать ее будем в update():
Как это происходит? Представим себе, что игрок – это шар с радиусом r. И он движется в сторону прямоугольника:
Очевидно, что если расстояние от шара до плоскости прямоугольника больше r, то коллизии точно не происходит. Чтобы узнать это расстояние, можно перевести координаты игрока в систему координат прямоугольника. Напишем функцию перевода из мировой системы в систему прямоугольника:
И обратную функцию:
Вставим эти функции после функции update(). Я не буду объяснять, как это работает, потому что мне не хочется рассказывать курс аналитической геометрии. Скажу, что есть такие формулы перевода координат при вращении и мы просто ими воспользовались. С точки зрения прямоугольника наш игрок расположен вот так:
В этом случае условие коллизии становится таким: если после смещения шара на величину v (v – это вектор) координата z между –r и r, а координаты x и y лежат в пределах прямоугольника или отстоят от него на величину, не большую r, то объявляется коллизия. В этом случае координата игрока по z после смещения будет составлять r или – r (в зависимости от того, с какой стороны придет игрок). В соответствии с этим, смещение игрока изменяется. Мы специально вызываем коллизию перед тем, как в update() координаты игрока будут обновлены, чтобы вовремя изменить смещение. Таким образом, шар никогда не пересечется с прямоугольником, как бывает в других алгоритмах коллизии. Хотя физически игрок будет представлять собой, скорее, случае куб, мы не будем обращать на это внимание. Итак, реализуем это в javaScript:
x0,y0 и z0 – начальные координаты игрока в системе координат прямоугольника (без поворотов. x1,y1 и z1 – координаты игрока после смещения без учета коллизии. point0, point0, point1 и point2 – начальный радиус-вектор, радиус-вектор после смещения без коллизии и радиус-вектор с коллизией соответственно. map[i][3] и другие, если вы помните, это углы поворота прямоугольника. Заметим, что в условии мы к размерам прямоугольника прибавляем не 100, а 98. Это костыль, зачем, подумайте сами. Запустите игру и вы увидите довольно качественные столкновения.
Как видим, все эти действия происходят в цикле for для всех прямоугольников. При их большом количестве такая операция становится очень дорогой, так как тут и так есть 3 вызова функций преобразований координат, которые тоже производят достаточно много математических операций. Очевидно, что если прямоугольники находятся очень далеко от игрока, то коллизию считать не имеет смысла. Добавим это условие:
Итак, с коллизиями мы разобрались. Мы спокойно можем взбираться и по наклонным поверхностям, а возникновение багов возможно только на медленных системах, если, конечно, возможно. По сути, вся основная техническая часть на этом закончилась. Нам осталось лишь добавить частные вещи, такие как гравитация, вещи, меню, звуки, красивую графику. Но это достаточно легко сделать, а к самому движку, который мы только что сделали, это отношения не имеет. Поэтому об этом я расскажу в следующей части. А сейчас проверьте то, что у вас получилось с моим кодом: