Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam

Поддержка

Если вы не нашли ответ на свой вопрос, свяжитесь с нами.
Пикабу Игры +1000 бесплатных онлайн игр Погрузитесь в игру Бильярд 3D: русский бильярд — почувствуйте атмосферу настоящего бильярдного зала!

Бильярд 3D: Русский бильярд

Симуляторы, Спорт, Настольные

Играть

Топ прошлой недели

  • Carson013 Carson013 23 поста
  • Animalrescueed Animalrescueed 32 поста
  • Webstrannik1 Webstrannik1 52 поста
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

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

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
40
GooDCrafter
GooDCrafter
Лига Разработчиков Видеоигр

TerraPath #14⁠⁠

8 лет назад

Кратко о содержании сегодняшнего поста:

Тайлсет объектов.

Деревья большое одной клетки.
Буфер глубины.

Оптимизация рендера.

Решил начать день с того чтобы вынести объект из текстуры мира в отдельные файлы.
Зачем?
Ну это дает нам пару плюсов:
- Мы можем с легкостью менять отдельные объекты, не затрагивая всю текстуру.
- Имя текстуры совпадает с именным ID объекта, поэтому нам не нужно руками назначать текстуру объектам.
- Можно легко добавить анимацию в этот же файл.
- Движок сам собирает тайлсет, нам больше не надо самим размечать положения текстур и как-то их группировать (яркий пример скрин ниже, как можно заметить, полы идут первым рядом, второй ряд это объекты, а снизу стены).

Было:

Стало:

Собранный тайл сет выглядит вот так:

Алгоритм сборки крайне неэффективный, но все же я его напишу:

Есть куда более эффективные способы упаковки текстур, но я решил сделать пока проще, чтобы ускорить разработку, а улучшить его всегда можно.
Вот кстати очень хороший алгоритм:
http://blackpawn.com/texts/lightmaps/
И хорошая статья на хабре:
https://habrahabr.ru/post/136225/

Как вы могли заметить деревья теперь занимают две клетки вместо одной.
В игре это выглядит вот так:

Для того чтобы всё это правильно отображалось, а игрок скрывался за деревьями я добавил буфер глубины.

Следовательно нужда в сортировке сущностей перед каждой отрисовкой пропала, потому что теперь этим будет заниматься видеокарта.
Подробнее можно почитать тут:
https://ru.wikipedia.org/wiki/Z-%D0%B1%D1%83%D1%84%D0%B5%D1%...

Также я оптимизировал рендер чанков.

Разделив рендер пола и объектов.
Теперь все установки текстур и моделей делаются только один раз перед отрисовкой пола или объектов, вместо (количества чанков на экране), что немного подняло ФПС.

А на этом всё, спасибо, что дочитали.

Также не пропустите прошлые посты:

https://pikabu.ru/profile/GooDCrafter


Ссылка на группу в вк(есть играбельная демка):

https://vk.com/terrapath

Показать полностью 8
[моё] Gamedev Разработка игр Инди-разработка Terrapath Indigamedev Разработка Длиннопост
1
30
GooDCrafter
GooDCrafter
Лига Разработчиков Видеоигр

TerraPath #13⁠⁠

8 лет назад

Кратко о содержании сегодняшнего поста:

Плавное освещение.
Первый тест мультиплеера.

Плавное освещение.

Решил начать с обновления освещения, но оказалось всё не так просто.
Задумка была использовать регулярную сетку, где каждая вершина совпадала бы с игровым полем и её цвет был равен сумме цветов соседей / 4.

Получалось что каждая точка усредняет значение света вокруг себя.
А дальше мы просто интерполируем между вершинами и получаем плавное освещение.
Но не всё так просто.
В основе нашей сетки лежат треугольники.
И...
мы получаем вот такую вот штуку:

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

В итоге я решил вернуться обратно к цветному квадрату, но немножко переделать его шейдер.
И в итоге получил правильную интерполяцию:


И вот собственно результат.

Мне немножко показалось странным кубическое освещение, поэтому я переписал алгоритм распространения света, чтобы заливка шла по кругу.

Как по мне получилось очень годно, но есть небольшой нюанс.
Я освещаю стены максимальной яркостью вокруг них, и всё вроде бы хорошо, да?

но в сглаженном варианте получается вот такая штука:

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

Если у вас есть идеи как это исправить пишите.
Может чего вместе сможем придумать.

Еще парочка интересных скринов с разработки освещения:

Я также переписал освещение убрав рекурсию, что немножко подняло производительность.

Первый тест мультиплеера.
Провёл закрытый тест мультиплеера.
Это было классно. Немножко покрафтили, позанимались пиксельартом, исследовали местные горы, и даже поиграли в салочки :D

Контента правда не хватает.
В след апдтейте его будет уже больше, и я подумываю о том чтобы провести открытый тест мультиплеера всем вместе, что думаете?

А также:
- Я исправил баг прилипания к стенкам по Y, это была ошибка в движке коллизии, из-за чего игрок медленнее двигался по X если касался стены.
- Добавил вывод DrawCall'ов.
- Подключил гит, да я знаю что я слоупок.
Ну и так по мелочи, разные улучшение, исправления и оптимизации.

А на этом всё, спасибо, что дочитали.

Также не пропустите прошлые посты:

https://pikabu.ru/profile/GooDCrafter


Ссылка на группу в вк(есть играбельная демка):

https://vk.com/terrapath

Показать полностью 17
[моё] Gamedev Разработка игр Инди-разработка Terrapath Indigamedev Разработка Длиннопост
22
29
GooDCrafter
GooDCrafter
Лига Разработчиков Видеоигр

TerraPath #12⁠⁠

8 лет назад

Кратко о содержании сегодняшнего поста:
Улучшение графики.
Еще немножко про мультиплеер.
Новая демка.

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

Добавил анимацию покачивания предметов:

Улучшение в сервере:
- Теперь сервер обновляет состояние всех объектов 40 раз в секунду.
- Синхронизация анимации разрушения.
- Удаление объектов.

- Синхронизация времени.
- Обработка дисконнекта. C выводом причины дисконнекта(выключение сервера/выход/ошибка и тд).

- Проверка версии протокола.

- Консольное управление сервером:

1)Выключение сервера(stop).

2)Установка времени из консоли(time <время в формате 0-24>, можно задавать дробью например 9:30 это 9.5).

- Рабочий пинг.
- Синхронизация предметов как дроп.
- Синхронизация инвентаря.
- и многое другое.
Также я немного ускорил кирку и сделал мини оптимизация рендера в чанках.

Новую версию с мультиплеером можно скачать в группе.
Контента в ней чуток меньше чем в прошлых(нету врагов), но уже есть мультиплеер.
Порт для сервера пока жестко всшит.


А на этом всё, спасибо, что дочитали.

Также не пропустите прошлые посты:

https://pikabu.ru/profile/GooDCrafter


Ссылка на группу в вк(есть играбельная демка):

https://vk.com/terrapath

Показать полностью 2
[моё] Gamedev Разработка игр Инди-разработка Terrapath Indigamedev Разработка Гифка Длиннопост
11
38
GooDCrafter
GooDCrafter
Лига Разработчиков Видеоигр

TerraPath #11⁠⁠

8 лет назад

Кратко о содержании сегодняшнего поста:

Примитивный интерфейс.
Обработчик пакетов.
Интерполяция движения.
Чат.

Обработка авторизации.
Фильтры пакетов
.
Рубрика вопросов.


Вот мы и перешли в эру альфы.
Чтобы работать с сетевой частью, я сразу создал очень примитивный интерфейс:

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

Текстовый поля можно редактировать как обычные формы в браузере и тд.
Ну то есть есть поддержка выделения текста, Ctrl+C, Ctrl+V и тд.

Дальше я занялся обработчиком пакетов:

Особенностью получилось, то что я могу передавать пакет обработчик, а он сам попадет в нужную функцию. Получается очень удобно и просто.
Достигается такая фишка за счёт генериков и лямбд.
Код становится чище и понятнее.

Интерполяция движения.
Как долго я закончил написания ядра сервера, я начал переносить логику игры на сервер, начал с движения персонажа, но оказалось не всё так просто.
На клиенте используется предсказание для игрока. Поэтому на большинство своих действий игрок видит сразу, без задержки, а вот остальные игроки нет.
Они двигались рывками и чтобы исправить это я стал интерполировать их положение с прошлого.
Как это работает? Когда от сервера приходит новая позиция для сущности, она смещается с текущий позиции на новую за 100мс.
Получается очень плавно движение, без рывков.

Также сразу решил сделать чат:

Следующим шагом стал система авторизации на сервере.
Я составил протокол передачи данных, и после его успешного завершения игрок появляется на сервере, а на клиенте пропадает плашка "Connecting..."

Это дает защиту от случайных коннектов, а также чтобы игрок не видел не загруженный мир.

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

А также по части сети:

Инициализация игрока.

Синхронизация игроков.

Установка тайлов и объектов.

Синхронизация анимации игрока.

Вот как-то так это выглядит:


А на этом всё, спасибо, что дочитали.
Также не пропустите прошлые посты:

https://pikabu.ru/profile/GooDCrafter


Ссылка на группу в вк(есть играбельная демка, но без сети, с сетью скоро будет):

https://vk.com/terrapath

А теперь рубрика вопросов:
1)Как вы считаете, стоит писать большие посты или средние.
И как вы оценивайте этот пост, длинный средний?
2)Я пока решаю куда публиковать игру, в целом то есть два варианта:
Это стим или же поднять собственный сайт.
С одной стороны я думаю про стим, но увы стим уже не приносит столько трафика новым играм.
Что думаете об этом?
3)Тут несколько людей продвигают идею опенсорса, и возникает такой вопрос, стали бы вы донатить на разработку данной игры тем самым делая её бесплатной?
4)Я тут решил отказать от стоковой музыки, и начать кооп с музыкантами, есть кого вы могли бы посоветовать? Сразу оговорюсь что платить много я не смогу, сам свожу тут концы с концами. Можно как вариант 2-3 трека за небольшую плату, а остальные после выхода игры.
Я мало верю что кто-то захочет просто работать со мной за идею, но вера это единственное что у меня есть.
5) Тоже самое и с художниками, само собой пиксельарт.


PS: Во накатил вопросов то :)

Спасибо всем кто ответит хотя бы на часть из них.

Показать полностью 5
[моё] Gamedev Разработка игр Инди-разработка Terrapath Indigamedev Разработка Гифка Длиннопост
18
36
GooDCrafter
GooDCrafter
Лига Разработчиков Видеоигр

TerraPath #10 Сеть 2⁠⁠

8 лет назад

Кратко о содержании сегодняшнего поста:

Неблокирующий сервер
Протокол
Полезные ссылки


В прошлый раз мы остановились на многопоточном блокирующем сервером.
Сегодня же мы рассмотрим неблокирующий однопоточный сервер.
В этой статье мы уйдем больше в сторону Java, хотя реализация такого сервера возможна и на других языках.
Мы будем использовать Java.NIO;

К сожалению, информации о написании неблокирующего однопоточного сервера не так много как хотелось бы, но в итоге я собрал несколько полезных ссылок, где рассказывается о сервере на NIO. Ссылки будут ниже.
Сбор информации и планирование архитектуры сервера заняло у меня около 1 недели. Само же ядро сервера было написано за 4 дня.

Начнём.
Первым изменением у нас будет указать сокету, чтобы он не блокировался:

socket.cofigureBlocking(false);

теперь операции accept/write и read не будут останавливать программу.
Но теперь нет гарантии что мы что-то прочитали или что-то записали, мы сами должны за этим следить, а accept возвращает null если подключения нет.

В целом всё хорошо, но есть одно НО. Наш сервер безостановочно крутит это цикл раз за разом нагружая систему. Мы можем увести поток в сон на короткое время 4-16 мс, но есть решения намного круче.
Это селектор. Что же это такое?
Эта такая классная штука которая просыпается только тогда когда есть данные которое нужно обработать, а если их нет, то он просто блокирует выполнение.

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

Selector selector = Selector.open();
selector.register(socket, OP_READ | OP_WRITE);

Есть 4 ключа:
OP_READ - чтение
OP_WRITE - записать
OP_CONNECT - если сокет подключился к удалённому сокету(только клиент)
OP_ACCEPT - если удалённый сокет подключился к нашему(только сервер)

Ключи можно комбинировать записывая их через '|'.
Работает эта фишка за счёт битовых операции.

Код сервера теперь выглядит так:

Очень важно: client.socket().setTcpNoDelay(true);
отключает алгоримт Нейгла, чтобы уменьшить задержку передачи данных.

Код клиента выглядит примерно также, за исключением создания сокета и ключа в селекторе.

Написав такие реализации я стал думать как их грамотно объединить.
Я не хотел дублировать код в игре 2 раза: один раз для синглплеера, второй для мультиплеера.
Поэтому решил сделать такой хитрый ход конём.
Синглплеером будет локальный сервер запущенный в этой же программе.
В чём же его особенность? А в том что к нему нельзя будет подключится из вне, только если игрок сам этого не захочет.

Я стал думать как это сделать и родилась такая концепция.
Класс SocketBase - основа работы с селектором
от него наследуются:
SocketClient
SocketServer

Но оказалось всё не так просто, сервер обрабатывает на одном селекторе сразу много подключении, а клиент только одно, код чтения и записи дублируется, к тому же нет возможности локально подключится, не подключая сервер к порту.

Тогда я разделил это вот так:
ServerBase
---ServerLocal
---ServerNetwork

ClientBase
---ClientLocal
---ClientNetwork
И тут тоже оказалось всё не так гладко, код также дублировался, хотя и было исправлена проблема с локальной игрой(без настоящего подключения к сети).

Я внимательно обдумал концепцию того что я хочу сделать и тут меня осенило
А ведь серверу вообще не обязательно знать работает он с подключением из сети или локально.
Так родилась идея каналов:
Channel
---ChannelLocal
---ChannelNetwork

Суть в том что все каналы могут принимать и отправлять данные, а как они это делают уже скрыто реализацией.
Но чтобы сетевые каналы работали я создал специальный класс Network, именно он занимается ChannelNetwork. Создается он в отдельном потоке и работает через селектор.
Network
---NetworkClient
---NetworkServer

Что позволяет создавать сервер локально, а если нужно чтобы к нему могли подключится из вне, то я просто пишу server.bind(порт), в этот момент создается NetworkServer внутри сервера и начинает обрабатывать сетевые подключения.
Это всё позволяет играть в синглплеер, а в любом удобный момент открыть сервер для сети.
Хоть такая возможность и есть, но я не уверен что буду её делать.
Но хостить сервер из игры точно можно будет, только через меню.

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

Проще говоря мой сервер может работать не подключаясь к сети. Само собой если сервер запустили как отдельное приложение, то он подключается к сети.

Финальная структура выглядит так:

Протокол

Чтобы как-то обмениваться данными между клиентом и сервером нам нужны правила.

Так как отправляет и принимаем мы байты, нам нужно как-то их разделять.

Есть в целом 3 популярных метода:

1)Фиксированный размер данных.

2)Специальный маркер конца сообщения(пакета).

3)Запись длинны в начало сообщения.


1 способ неудобен тем что мы не можем передавать данные разного размера(к примеру чат).
Хорошо подходит для очень маленьких игр и если нет желания делать свой протокол.

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

3 способ нам подходит больше всего.

Структура пакетов и игре выглядит так.
Длинна пакеты - 2 байта
ID пакета - 2 байта
Данные - N байт

Длинна записывается в байтах и равна 2 байта(ID пакета) + N байт(данные).
Следовательно максимальный размер пакета 65 535(т.к. 2 байта = 16 бит = 65 535).
Тоже самое и для ID пакета 65 535 различных вариантов пакетов.

Примеры пакетов:
<id> <название>
<данные>

1 Login
int protocol;
String username;

3 ConnectionApproved
int playerID;

33 TileSet
int x, y, id;

На момент написания статьи в игре уже 29 пакетов, нумерация идет не по порядку, и представлены они в виде такой структуры:

А на этом всё, спасибо, что дочитали.
Код в статье близок к Java, но упрощен для лучшего понимания концепции.

Также не пропустите прошлые посты:

https://pikabu.ru/profile/GooDCrafter


Ссылка на группу в вк(есть играбельная демка):

https://vk.com/terrapath

Полезные ссылки по сокетам:
1)https://www.youtube.com/watch?v=DEVaahWFY9s - очень полезное видео по написание сервера/клиента по NIO, на русском.
2)http://www.baeldung.com/java-nio-selector
3)https://www.cordinc.com/blog/2010/08/java-nio-server-example.html
4)http://www.javaportal.ru/java/articles/useselectfast.html
5)http://www.studytrails.com/java-io/non-blocking-io-multiplexing/
6)http://tutorials.jenkov.com/java-nio/index.html - целый учебник по NIO.
7)http://www.quizful.net/post/java-socket-programming - полезная статья для новичков о сокетах в целом.
8)http://adblogcat.com/asynchronous-java-nio-for-dummies/

Полезные ссылки по написанию своего сервера:
1)https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
2)https://habrahabr.ru/post/328702/
3)https://habrahabr.ru/post/211202/
4)http://wiki.vg/Protocol - протокол майнкрафта.
5)https://seancode.com/terrafirma/net.html - протокол террарии.

PS: Вот это я разогнался, наверное надо было разбить эту статью на две или даже три.
Если кто-то дочитал до сюда скажите мне :D

Показать полностью 5
[моё] Gamedev Разработка игр Инди-разработка Terrapath Indigamedev Разработка Длиннопост
24
47
GooDCrafter
GooDCrafter
Лига Разработчиков Видеоигр

TerraPath #9 Сеть 1⁠⁠

8 лет назад

Кратко о содержании сегодняшнего поста:
Сеть

Товарищ @Kopnu попросил более технические посты. Раз это интересно, то почему бы не попробовать расписать подробнее.

Начнём мы с простого сервера, а дальше перейдем к более сложному. Я начал кодить сразу с сложного, но чтобы было понятно как развивалась идея я начну с простого. Хочу передать ход своих мыслей, не знаю насколько это получится, но будет вот такой подблог.
Надеюсь вам понравится, приятного чтения.

Начнём мы с основных понятий:
Для сервера мы будем использовать протокол TCP через сокеты.
Что такое TCP вы можете почитать тут:
https://ru.wikipedia.org/wiki/TCP/IP

Почему я выбрал TCP, а не UDP?
TCP гарантирует доставку, а также порядок.
Это значит если я шлю: 1 2 3 4 5, то другой сокет увидит: 1 2 3 4 5.
А в случае с UDP может оказаться так: 4 1 3 2 5 или так 3 4 1 2 5.
Вы спросите а зачем же тогда вообще нужен UDP? Ну он работает чуток быстрее чем TCP, но мы теряем гарантию доставки и порядок.
UDP в основном используют в шутерах, где важны последние данные, чем старые.
А вот в нашем случае потеря пакетов может быть большой проблемой, игрок ставит тайл, а до сервера эти данные не доходят.


Что же такое Сокет? Это такое подключение между разными программами, которые могут даже находится на другой машине.
Можно представить это так: Каждая машина в сети имеет 65535 возможных портов. И любая программа может занять любой из них, если это разрешит ОС.
Когда мы подключаемся к какой-то машине мы указываем IP и порт (порт не всегда указывается так как может быть всшит в программу).
Есть два вида сокетов: Socket и ServerSocket.
В чём различие:
Обычный сокет способен подключится к IP адресу + порт, и передавать и принимать оттуда данные.
ServerSocket же подключается к некоторому порту который мы укажем и ждёт подключения, если же кто-то подключился то он нам возвращает Socket который связан с другой машиной.

В сам же сокет мы можем писать/читать байты. Можно провести аналогию с файлом. Но есть небольшой подвох изначально сокеты блокирующие.
Это значит что подключение/чтение и запись останавливают программу.
Яркий пример:

Socket client = server.accept();//Остановит программу до тех пор пока не появится подключение.


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

Почему не можем?
Вот такой код:

Как легко заметить в (1, 2, 3) программа просто останавливается пока не будет завершено действие.
Она будет работать так:
Примет подключение (1).
Прочитает данные если они есть, либо же будет ждать их (2).
Напишет ответ если он есть, либо же остановится навсегда (3).
И снова вернется ждать подключения (1).

Что-то эта схема не похожа на постоянные обмены сообщениями.

Поэтому мы переходим на многопоточный сервер.

Что же такое поток?
Его можно представить как отдельно запущенную программу которая имеет доступ к памяти первой программы. Потоки работают на ядрах процессора, что дает очень большой выигрыш по скорости, но если их будет слишком много это только замедлит работу программы. С потоками есть еще одна сложность, данные между ними нужно сихнронизировать, а иначе может получится такая вот фигня:

int value = 0;

поток А пишет в value = 10;
поток B читает из value и видит 0.

Самособой если программа остановилась в одном потоке, все остальные потоки продолжают работать.

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

Он также будет останавливаться, до тех пор пока не будет подключения, а как оно появится создаст новый поток и передаст туда это подключение.

Все же новые потоки будут работать так:

Архитектура потоков выглядит так:

Клиент:
1)Основной поток на основную логику игры и рендер.
2)Поток на сеть.

Сервер:
1)Основной поток на обновление сервера.
2)Поток который ждет подключения.
3..N)Новые потоки для каждого подключения.

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

А на этом всё, спасибо, что дочитали.

Также не пропустите прошлые посты:

https://pikabu.ru/profile/GooDCrafter


Ссылка на группу в вк(есть играбельная демка):

https://vk.com/terrapath


Спасибо всем кто подписывается лично на меня, и на паблик в вк.

Приятно осознавать что людям интересно что я делаю.

Количество людей в паблике стало больше 100 :D


В следующий раз расскажу про пакеты и неблокирующие сокеты.
PS: Перечитал сам пост и мне кажется что всё равно получилось слишком сложно D:
Стоит ли вообще продолжать писать об сервере?

Показать полностью 3
[моё] Gamedev Разработка игр Инди-разработка Terrapath Indigamedev Разработка Длиннопост
20
41
GooDCrafter
GooDCrafter
Лига Разработчиков Видеоигр

TerraPath #8⁠⁠

8 лет назад

Кратко о содержании сегодняшнего поста:

Первый враг и спавн врагов.
Простая боевая система.
Вращение персонажа.
Улучшение графики инструментов.

Превью при установке пола.

Вторая демка.

Начал день с добавления первого врага.
Решил для тестов взять зомби(ретекстуринг главного героя).

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


Там где есть враги должен и быть способ их победить. Поэтому у всех сущностей появилось здоровье, а игрок обзавелся красивым Health баром.
На данный момент атаковать можно только инструментами.
Статы такие:
Кирка[Урон: 50, скорость: медленная];
Топор[Урон: 25, скорость: нормальная];
Боевая система еще далека от совершенства, как минимум в ней нет дистанционного оружия, но начать с чего-то нужно же.

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

Сама боевка выглядит как-то так:

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

Были добавлены дополнительные спрайте для текстуры персонажа, и теперь он вращается при движении или при клике.

Теперь инструменты рисуются когда персонаж их держит, а также появилась анимация добычи ресурсов:

Добавил превью при установке пола, многие просили:

А также:

Уменьшил дистанцию крафтстолов.

Уменьшил коллизию игрока.

Изменен баланс добычи инструментов.

И несколько мелких улучшений и исправлений.

Новую версию можно скачать в группе в вк.
Для работы игры требуется Java 8.
Демка не оптимизирована, т.к. это ранний прототип. Об найденных багах пишите сюда или же в группу.Известный баг: игра иногда отказывается запускать на встроенных видеокартах от интел. Лечится это установкой 64 битной Java.

А на этом всё, спасибо, что дочитали.Также не пропустите прошлые посты:https://pikabu.ru/profile/GooDCrafter
Ссылка на группу в вк:https://vk.com/terrapath
PS: Следующий пост уже будет о сетевой части.
Сетевая часть заняла у меня много времени, но уже многие вещи синхронизируются. Игра очень сильно выросла архитектурно.
Также я принял решение что персонажи будут хранится отдельно от миров.
Почему?
Потому-что это дает некоторые плюсы:
1)Карта ограничена, а это значит что некоторых артефактов может просто не оказаться или не хватить на всех игроков (известная проблема в террарии).
2)При обновлении игры, если генератор был улучшен, легко переехать на новую карту.
3)Легко играть с другом в его мире своим основным персонажем.
В общем что вы думаете об этом?
Небольшой бонус:

Показать полностью 8
[моё] Gamedev Разработка игр Инди-разработка Terrapath Indigamedev Разработка Гифка Длиннопост
41
34
GooDCrafter
GooDCrafter
Лига Разработчиков Видеоигр

TerraPath #7⁠⁠

8 лет назад

Кратко о содержании сегодняшнего поста:

Смена дня и ночи.

TimeController.

Демка.


В итоге получаем такую вот гифку:

Небольшое объяснения в чем суть всех моих постов.
Я хочу показать полный процесс разработки игры: от прототипа к релизу.
Заодно начать получать фидбек по игре пока она только создается.
А также рассказывать о технических решениях.


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

Получилось много матана для написания своего кругового градиента, но в итоге я это сделал. Суть его работы заключается в следующем:
Мы принимаем текущие значения времени.
Находим левую и правую опорную точку(цвет).

И интерполируем между ними.
Получаем очень плавный переход времени, с возможностью менять опорные точки(цвет) на ходу.
Апи установки цвета выглядит так:

Ну и чтобы это всё было удобно тестировать, я написал TimeController: простенький интерфейс для работы с временем.

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


Смена дня и ночи не просто красит сцену, а используется в расчётах освещения:

На гифках сложно передать плавность смены дня и ночи, поэтому лучше проверить в демке.


Демку можно скачать в группе в вк.
Демка не оптимизирована, т.к. это ранний прототип.
Известный баг: игра иногда отказывается запускать на встроенных видеокартах от интел. Лечится это установкой 64 битной Java.


А на этом всё, спасибо, что дочитали.

Также не пропустите прошлые посты:

https://pikabu.ru/profile/GooDCrafter


Ссылка на группу в вк:

https://vk.com/terrapath


PS: Я также закончил написание ядра сервера. Так что скоро ждите вкусные посты про написания сервера.

Показать полностью 3
[моё] Gamedev Разработка игр Инди-разработка Terrapath Indigamedev Разработка Гифка Длиннопост
11
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии