Вполне себе приемлемый вариант - представить тело объекта в виде точек, которые будут соединяться в отрезки. Коллизии проверять посредством пересечения отрезков. Я реализовывал такой механизм - работает довольно шустро при большом количестве объектов(в несколько сотен, а то и тысяч), расставленных по всей карте. Однако, здесь нужно грамотно подойти к оптимизации. Перебирать все отрезки - очень медленно и убьет FPS мгновенно. Поэтому первое, что нужно сделать: рассчитывать Bounding Box тела и проверять пересечения тела сначала с ним, а потом уже при необходимости(если пересекается с боксом) проверять пересечение с отрезками. В больших мирах такой оптимизации так же будет недостаточно, т.к. перебирать все-равно придется все боксы. Единственный вариант - поделить мир на огромные мета-боксы, в которые занести все объекты попадающие в этот Bounding Box и сначала проверять пересечение объекта со всеми соседними мета-боксами, включая и тот, в котором находится сам объект, а потом уже проверять пересечения уже с bounding box'ами каждого объекта, включенного в мета-бокс.
В одной из тем я скидывал демку 2Д танков, в которых можно посмотреть этот механизм в действии. Кстати, все движения и повороты я считал с помощью тригонометрических функций, но все-равно все работало очень быстро. Если просчитывать скажем с помощью матриц, то можно получить еще больший плюс к производительности. Мой пост с демкой
Сообщение отредактировал Storm54 - Четверг, 24 Апреля 2014, 03:24
А можно сделать обновления игры как в WOT ? Т.Е что-бы обновлялось каждый раз когда выходит новая версия причем нужно будет учитывать какая версия сейчас установлена. Как это можно сделать ?
Можно. Пишешь лаунчер, который будет запускаться первым и при необходимости обновлять игру, а затем уже саму эту игру и запускать. Хотя, конечно, такой ответ тебя не устроит, т.к. тебе нужен пример в пару строк кода. Готового варианта нет. Пишешь сам все ручками.
Для начала разбиваешь всю игру на ассет бандлы, в которых будет храниться вся информация. Как именно будет игра разбита - тебе решать. Лично у меня отдельные бандлы под следующие категории: Модели, текстуры, скрипты, локации. Бандлы эти так же собираешь вручную, благо документации в интернете полно, да и в юнити уже есть классы, облегчающие этот процесс. При запуске лаунчер должен запросить список всех необходимых файлов с сервера и их MD5, после чего пробежаться по всем файлам, указанным в списке и в случае отсутствия файла или несоответствия его контрольной суммы, скачать новый файл с сервера, заменив существующий.
На самом деле можно игру и не разбивать на ассет бандлы, но тогда в большинстве случаев придется обновлять практически весь клиент даже при самом незначительном обновлении.
Класс Vector3 по большому счету содержит в себе 3 float переменных. Каждую переменную можно найти по отдельности, достаточно найти первую переменную - остальные по сути лежат в смещении +4 и +8 байт соответственно.
Цитата
Я под directx делаю. Значит wallhack сделать сложнее?
Меньше чем за 1 день сделают. Их клепают десятками. Как написали выше:
Цитата
Чаще всего работают, с рендером игры (D3D или OpenGL)
Так что технологии остаются такими же, соответственно и способы реализации те же.
Посмотрел информацию в группе. Все, что удалось узнать:
Игра в стиле приключений, экшена и хоррора. Игра будет страшной.
Она будет бесплатная.
Создатели: DarkLight Team Nightlight Games
Скриншоты представляют из себя простые сцены со стандартными объектами. Странное сотрудничество у вас с Nightlight Games - для инди-разработчиков у них слишком много администрации - аж целых 4 директора во главе с ген. директором. Для сравнения: в газпроме и то совет директоров состоит всего из 11 человек, а ведь это огромная корпорация.
Конечно может. Либо посредством изменения функции, которая проверяет этот процесс, либо чит может запустить левый процесс с этим именем. В общем любую проверку на клиенте можно свести на нет. Сервер должен анализировать работу клиента и в случае некорректных данных принимать меры - других вариантов нет. На клиенте же реализовывать какой-либо античит - только усложнить работу создателям читов, тем самым снизить потенциальное количество читеров.
Сообщение отредактировал Storm54 - Вторник, 22 Апреля 2014, 23:52
Либо писать свой аналог возможностей Unity3D, то бишь систему загрузки геометрии, расчет коллизии и т.п. Либо создать специальный системный клиент, каждый экземпляр которого будет закинут в соответствующую комнату с игроками и будет контролировать весь игровой процесс. Собственно идентификацию такого клиента на сервере можно производить по очень длинному ключу. Однако, тут нужно смотреть, насколько это будет затратный процесс. По сути можно ограничиться и одним экземпляром такого системного клиента - это позволит значительно сократить расход оперативной памяти, но реализовать такое приложение будет значительно труднее.
Сообщение отредактировал Storm54 - Вторник, 22 Апреля 2014, 23:29
Первым делом нужно написать античит, который будет защищать от спидхака, включаемого посредством Cheat Engine, т.к. его попробуют первым делом. Так же желательно ввести защиту переменных, если, конечно, всякие параметры полета пули, урона и т.п. не считаются на сервере. Про анти аим можешь забыть - его просто невозможно написать, т.к. на сервере проверить, действительно ли игрок, а не программа, прицелилась точно в голову, невозможно. На клиенте же писать анти аим так же невозможно - любой античит на клиенте можно отключить. Это касается базовых античитов, которые должны быть в любой онлайн игре. Хоть и читы на подобии спидхака и аима, бессмертия, скорострельности могут доставить неприятности другим игрокам, все же они не такие уж и критичные - достаточно сделать возможность кикнуть игрока с комнаты посредством голосования. "Обезопасить" нужно так же и сервер, чтобы он все поступающие данные проверял не только на валидность, но еще и игнорировал те команды, которые в принципе не мог прислать клиент. Например: Игрока убили и он ждет респауна. А что, если в этот момент чит отправит команду на стрельбу из оружия или метания гранаты?! В лучшем случае получится, что мертвый игрок стреляет и выглядеть это будет очень странно, а может и просто получиться краш сервера(тут все зависит от кода на сервере). Или, например, мертвый игрок садится в машину и начинает разъезжать по карте. На сервере такие моменты нужно учесть в первую очередь. Лично я написал несколько разных классов, каждый из которых обрабатывает только те команды, которые в нем описаны. Эдакий менеджер состояний получается.
Сообщение отредактировал Storm54 - Вторник, 22 Апреля 2014, 01:08
На последней версии Unity3D я столкнулся с похожей проблемой. Иногда проект не компилируется. Решения я так и не нашел - возможно в новой версии это исправят. Чтобы не пере-создавать проект, достаточно что-нибудь добавить/удалить в скрипте(например поставить пробел), чтобы контрольная сумма поменялась, тогда Юнити пере-соберет скрипты. Так же там есть баг с удалением деревьев: если удалить последнее дерево с ландшафта, то редактор вылетает.
Сообщение отредактировал Storm54 - Пятница, 18 Апреля 2014, 11:07
Жужа, смотря что ты подразумеваешь под хорошим софтом. Конечно, я не могу создать в одиночку конкурента таким проектам, как Adobe Photoshop или Blender - у меня попросту не хватит сил и времени. Однако, приложения, которые довольно хорошо справляются со своей задачей и при этом стабильно работают, я все же могу продемонстрировать. Пару лет назад я делал 2D танки с мультиплеером. Я не хотел использовать готовые движки, дабы сильно не подстраиваться под них, поэтому взял лишь минимум: Qt библиотеки и HGE (хотя, по сути можно было использовать и DirectDraw c DirectSound) Демка Помимо клиента и сервера в комплект входит несколько редакторов, в частности ModelEditor, VehicleEditor и MapEditor.
Управление в редакторе и самой игре:
Управление в самой игре достаточно простое: WASD - движение и Пробел - огонь. Tab - список игроков.
Редактор моделей Базовый объект игрового мира - модель. Моделью в своей игре я назвал объект, который помимо спрайта несет еще и твердость. Редактор моделей как раз и нужен для того, чтобы эту твердость удобно нанести на спрайт. Для начала желательно(если не хотите создать невидимое препятствие) загрузить спрайт(в меню спрайт). Спрайт - обычная картинка в формате jpg, png или bmp. После загрузки спрайта(если нужно сделать объект частично или полностью непроходимым) можно включить режим редактирования точек(в меню редактирование) ЛКМ добавляет точку, ПКМ убирает последнюю поставленную точку. Средняя кнопка мыши включает/отключает отображение курсора(удобно при замыкании фигуры). После завершения редактирования модель нужно сохранить(лучше всего сохранить в каталог Data/Models, т.к. оттуда другие редакторы загружают все модели)
Редактор транспорта Транспорт - объект, управляемый игроком. Загружаем модель(в меню модель), которая будет выступать в качестве танка, после чего устанавливаем ей точку выстрела(Редактирование->режим перемещения точки выстрела) - оттуда будут лететь снаряды. СКМ - отключить режим установки точки выстрела. После чего нужно установить характеристики для транспорта(меню характеристики) - там есть несколько готовых шаблонов. Там же нужно выбрать модель снаряда. Сохраняем получившийся транспорт в Data/Vehicles.
Редактор карт Собственно основной редактор, соединяющий воедино все ранее созданные объекты. Можно открыть уже готовую карту в Data/Maps и посмотреть как все устроено. Если же хотите создать новую карту, то нужно выбрать модель для добавления на карту(меню модели) после чего активировать режим добавления объектов(меню редактирование, либо нажать среднюю кнопку мыши) Колесиком мыши можно менять масштаб, а если зажать клавишу Alt, то колесико мыши будет поворачивать объект. ЛКМ добавляет объект на карту, ПКМ убирает последний добавленный объект. Перед сохранением карты обязательно нужно настроить транспорт для каждой команды(меню транспорт), а так же установить точки спавна(меню редактирование) Теперь карта готова к игре! Можно сохранить ее(для использования в игре, нужно сохранить ее в Data/Maps и обязательно указать имя New.map)
Присоединение к серверу:
В файле Client.ini содержится информация, которую будет использовать приложение для присоединения к серверу. По умолчанию установлены значения для локальной сети. Можно поставить внешний IP адрес и тогда другие игроки смогут присоединятся(если у хоста есть белый IP) Так же можно в параметре IP указать StormServer, тогда клиент будет присоединятся к моему серверу(если он доступен, конечно) сервер я специально буду держать где-то в периоде с 14:00 до 20:00 по МСК (буду периодически заходить)
Собственно, особенность этих танков в том, что в них полностью исключена возможность читерства. Сервер так же просчитывает движение всех игроков и корректирует их. Для этого я разработал свой алгоритм. Причем нет никаких рывков при любом пинге - все максимально сглажено. При расчете всех данных сервер забегает вперед, чтобы более точно смоделировать ситуацию на поле боя с учетом задержки всех игроков.
Сообщение отредактировал Storm54 - Пятница, 18 Апреля 2014, 11:07