Привет Stopgame! Возможно, некоторые из вас знают меня по таким хитам как «Симулятор Симулятора» и «Симулятор упоротой лисы». А если не знаете, то это только к лучшему.
Мне 20 лет, я бородат программист, и я делаю игры. Недавно мы с моим знакомым 3D-моделлером делали игру про танки. Это было ужасно. Все ездят, стреляют друг в друга! А ведь в танках наверняка сидят живые люди! В конце концов, моя пацифистская сущность не выдержала и сказала «ДОКОЛЕ». Теперь мы в срочном порядке меняем концепцию игры и начали мы с артиллерии! Make Love, Not War!
Ладно, шутки шутками, но мы с вами все-таки находимся в блоге с гордым названием GameDev. Если вы пришли сюда только за котами с радужкой между задних лап, то можете смело переходить к комментам. Если же вам интересны такие фразочки как «тестирование», “разработка”, «углы наводки», «стрельба с упреждением» то велкам под спойлер.
Как я уже сказал, игра у нас про танки. Называется она Tank Exist. Не спрашивайте меня, что значит это название, я сам не знаю.
Однако помимо танков присутствует и другая техника, например вертолеты и турели. В один момент мне очень уж захотелось, чтобы в проекте была стационарная артиллерия, которая будет стрелять по игроку. Не вопрос! Пишем 3D-моделлеру жалобное письмо в духе «ну сделай арту, ну пожалуйста», и через некоторое время получаем результат:
3Dmax у меня кстати лицензионный. Шучу, нет.
Для разработки игры я использую Unity Engine. Я просто процитирую одного умного человека с хабра — «Это замечательный движок, на котором действительно быстро и легко можно сделать очень плохую игру, в которую, в здравом уме, никто и никогда не будет играть. Чтобы создать хорошую игру, все же придется перелопатить документацию, вникнуть в некоторые особенности и набраться опыта разработки»
Ладно, в общем, хватаем за шкирку модельку, и пихнаем ее в Unity. После некоторых размышлений было решено сделать платформу в два раза шире.
Однако толку от такой артиллерии не сильно много, она не умеет вращать башней и не умеет стрелять. Но ведь ЯЖПРОГРАММИСТ.
Для начала научим артиллерию стрелять. В Unity cделать это проще простого, берем модель снаряда, прикручиваем к ней систему частиц для следа и физический компонент под названием Rigidbody для того что бы на снаряд действовала гравитация. В нужный момент времени создаем этот снаряд возле ствола, и придаем ему импульс. Все остальное возьмет на себя физический движок Unity.
Теперь научим артиллерию не просто стрелять, а самостоятельно наводиться и попадать в цель.
В горизонтальной плоскости по задумке башня может поворачиваться на все 360 градусов. Теперь сделаем, чтобы башня поворачивалась в сторону игрока. Сделать это несложно. Просто мысленно делим пространство на две части относительно ствола. Если танк игрока находится в синей части, поворачиваем башню направо, если в зеленой части – налево.
А теперь мы разберемся с вертикальной наводкой, здесь все гораздо интереснее. По задумке угол должен меняться от -10 до 45 градусов. Если вы не прогуливали уроки физики в школе, то наверняка знаете, что именно при угле в 45 градусов достигается максимальная дальность «броска». То есть в нашем случае, чем больше угол – тем дальше летит снаряд. Теперь нам нужно, что бы артиллерия рассчитывала расстояние до игрока, и на основе этого выставляла нужный угол наводки ствола. И если расчет расстояния от артиллерии до игрока делается одной строчкой кода, то для того что бы из этого расстояния получить нужный угол пришлось слегка извратиться. Дело в том, что я из тех людей, которые прогуливали пары физики и матана в универе, и поэтому решил даже не пытаться выводить формулу для определения угла из расстояния.
Я поступил по-другому. Я написал немного кода для того что бы артиллерия отстреляла снаряды с интервалом в один градус, и записала в текстовый файл дальность и длительность полета снаряда для каждого угла. Получилась табличка формата {угол, дальность, время полета снаряда}
Как это выглядит в графическом виде можно видеть на графиках ниже. Красная линия – зависимость дальности полета снаряда от угла наводки. Зеленая линия – зависимость времени полета снаряда от угла наводки. (Картинка кликабельна)
Теперь просто учим артиллерию пользоваться этой табличкой и дело готово! Например, до игрока 60 метров, то арта смотрит по таблице, и видит что при угле 6 гр. дальность 62.93м, а при угле 5 гр. 59.07. Считаем так – 5 + ((60 — 59.07)/( 62.93 — 59.07)) = 5.24 – это угол на который нужно навестись артиллерии. Называется это умной фразой «линейная интерполяция». Конечно, такой способ является упрощенным, однако его точности хватает.
Замечательно, артиллерия умеет стрелять, и даже попадает по танку игрока!
Но. Но танк движется, а до другого края карты снаряд летит 6 секунд. И пока этот снаряд долетит, танк игрока будет очень далеко. Значит нужно научить артиллерию стрелять с упреждением.
К счастью сделать это несложно. Смотрим на каких координатах находится игрок сейчас, смотрим на каких координатах игрок находился 20мс назад. При помощи таблицы рассчитываем, сколько времени до игрока будет лететь снаряд. Немного математики и геометрии, и артиллерия знает, где будет находиться игрок на момент прилета снаряда, если будет продолжать двигаться в ту же сторону. Именно в эту точку арта и будет целиться.
Например если известно что при текущем расстоянии снаряд будет лететь до игрока 2 секунды, ситуация будет выглядеть следующим образом. Кстати это называется «экстраполяция» и широко применяется в онлайн-играх для предсказания координат игрока при высоком пинге.
На скриншоте ниже видно, что артиллерия целится вовсе не в игрока, а в точку, куда этот самый игрок едет.
Теперь, если игрок не маневрирует, то ему очень скоро придет полярный лис. На этом мой рассказ об артиллерии закончен, до свидания!
Да, кстати, я сюда ведь не просто так зашел, а нагло пиариться, ага. В общем если вам вдруг внезапно захотелось следить за новостями проекта, вот вам — http://vk.com/tankexist
Лучшие комментарии
Результат? Игра про лису принесла мне за полгода два бакса с рекламы, не думаю что тут будет намного больше с моими навыками «продвижения») Зато у меня есть теперь много опыта, и что показать будущему работодателю при приеме на работу.
И в конце концов — делать игры это весело! Это просто нереально круто, когда «мертвая» артиллерия, танк, или еще что-то вдруг начинают двигаться, стрелять, взаимодействовать с окружающим миром. Да и вообще понимание что это ты, ты сделал этот маленький мир со всеми этими правилами, ты вдохнул в него жизнь. Пожалуй это можно понять только лично приняв участие в процессе)
Здравствуйте, мне 18, я
бородатучусь на программиста, и все игры которые я сделал были консольными программками, написанными в школе. Но глядя на гринлайт (особенно на игру 15 летнего чувака) я думаю зачем я вообще учу основы программирования, принципы работы ленты Тьюринга, хранение информации и т.п., если можно слепить из дефолтных моделек человечков, дать им стандартные анимации, придумать фишку игры и продавать? Если я соберусь в ближайшее время делать игрушки, то скорее всего это будет из за спортивного интереса, а не ради наживы.Теперь по теме:
Хитрец)
Чувак, это просто ОФИГЕННО.
Что мне еще нужно сделать что бы я мог называть себя программистом? Может снова начать писать рогалики в консольке?
скажи это моей сессии
может она отстанет?и еще 300 строк кода сверху, а снизу одному Exlain'y известно)Рассказывать конкретно о проекте не вижу пока смысла, все равно он еще не готов. Когда выйдем на стадию бета-теста, и понадобится много людей чтобы проверить мультиплеер, тогда и расскажу подробно)