3D-диорама "Монумент сообществу серии S.T.A.L.K.E.R."
Небольшая диорама, которая посвящается фанатам серии S.T.A.L.K.E.R., что продолжали и продолжают поддерживать интерес к Чернобыльской Аномальной Зоне.
В центре композиции у нас одиночка Васян Рентген, который только что одолел самого опасного мутанта Зоны...
Сделано с помощью Blender, Godot и GIMP. Музыка и образ персонажа взяты из серии игр S.T.A.L.K.E.R..
Игру не получилось сделать игра утонула в багах так что осталось только это видео
F моей попытке в c# на годоте
следующая игра должна быть VN но пока что идей нет
Обновление игры Экспедиция: Мир Тени
Сегодня выпустил очередное обновление, после которого планирую на время переключиться на Инктобер:
Игра переведена на последнюю версию движка - Godot 4.5.
Обновлены модели космонавтов - учёных, членов экипажа и военных. Они стали более детализированными и используют уникальные текстуры, а не общий текстурный атлас, и ещё будут улучшаться в будущем.
Добавлена новая миссия, в которой Экспедиции предстоит помочь Стражам отбить атаку Тени на первый подземный комплекс. В ходе её разработки получилось найти и устранить несколько багов ИИ юнитов.
Также изменена механика уничтожения кристаллов Тени - теперь для этого используется лазерный резак.
Ссылки на игру:



НОВАЯ ИГРА АЛЕКСАНДРА ШАПОШНИК! LimeCore Games!
НОВАЯ ИГРА АЛЕКСАНДРА ШАПОШНИК! LimeCore Games!
Морковка в лабиринте загадок - это увлекательный 2D платформер-головоломка, который бросает вызов игрокам, предлагая им преодолеть хитроумный лабиринт, полный опасностей и загадок.
Главный герой и цель
Вы играете за отважную морковку, чья главная задача - найти ключ и открыть дверь, ведущую к свободе. Этот квест требует от игроков сообразительности, ловкости и стратегического мышления.
Игровые механики
Препятствия и опасности:
Острые шипы, грозящие проткнуть нашего героя
Стреляющие пушки, выпускающие снаряды через определенные интервалы
Сложные платформы, требующие точных прыжков и расчета времени
Интерактивные элементы:
Кнопки, активирующие или деактивирующие различные механизмы
Устройства, меняющие направление гравитации, что позволяет морковке ходить по потолку
Играть тут: https://yandex.ru/games/app/460929
Мобильный геймпад на Godot. Часть 3: Сервер, клиент, Broforce
Чтож, вот и финал. Спустя клиента на Godot, который может отправлять данные о нажатия, нужен сервер - для приема и отправки на ViGem.
Сервер
Итак, серверная часть. Тут не так и много магии, как могло бы показаться.
get_ip - функция получения текущего ip сервера. ip назначается маршрутизатором, потому может меняться и желательно знать актуальный ip для того, чтобы показать его клиенту;
get_port - тут много не заморачивался и задал статичный, хотя можно проверять порт на занятость и искать любой свободный.
Так как способ отправки данных из прошлой части имеет нюанс - Json объект может отправляться кусками, то на сервере мы его собираем: строки 105, 130-134. То есть собираем данные пока не получим символ } - конец объекта.
Функции left_joystick_float, right_joystick_float, press_button и release_button встроены в библиотеку vgamepad, которую можно спокойно установить через pip. И все. Сервер принимает данные, смотрит какая метка в j_data['M']:
LJ - левый стик;
RJ - правый стик;
P - кнопка нажата;
U - кнопка отжата.
Остальные данные это координаты стика или же конкретная кнопка. Дальше данные передаются драйверу. На этом магия кончается.
Заключение
Написание такого рода материала для меня хороший способ поднять мою ленивую жэпу и поделать какие-то дела, напрячь мозг хоть немного. Ещё так удобно закреплять знания в голове. Для меня сплошные плюсы, а вам... может узнали что-то новое. Честный обмен :) Д-а-а-а, там еще есть части с экспортом в apk, установками sdk, настройками окна в проекте, но опять же это все для формата туториала, чем данный цикл статей, увы, не является. Теперь, как и обещал, ссылка на полный код. Хотел на git, но потом решил на ЯндексДиск скинуть сразу и готовый apk, если не хотите собирать самостоятельно, и код и драйвер.
Ссылка на видео с игрой в Broforce на таком вот импровизированном геймпаде, на случай, если вам кажется игра на этом деле невозможной.
Глупо спорить, что это жуть как неудобно. Вещь жизнеспособная, ситуативная, забавная. Мне было приятно делать этот геймпад и смешно на нем играть.
Мобильный геймпад на Godot. Часть 2: Сцены, Json, Сеть
Введение
Продолжаю небольшой цикл с рассказом о том, как я делал из своего телефона геймпад, чтобы просто поиграть с друзьями в Broforce на ноутбуке. Сегодня поговорим о переключениях между сценами, чтению и записи в json-объект и передачу данных по сети.
Json
После первой + 1.5 статей у нас есть сцена с кнопками. Её мы назначим главной, чтобы при запуске приложения она нас сразу встречала после запуска программы. Теперь создадим сцену с настройками. В этот раз это будет узел Control, вместо Node2D, потому что в Control входят так нужные нам строки с записью текста. Зависимости такие:
Menu - узел Control содержащий все элементы
IP_line - узел LineEdit, строка куда пользователь впишет IP адрес
PORT_line - узел LineEdit, строка куда пользователь впишет порт
Save_data - узел Label, строка с текстом-статусом выполнения
buttons - Node2D узел, включающий в себя кнопки TouchScreenButton. Подтверждение введенных данных и возвращение на предыдущую сцену, соответственно.
Получить данные, которые пользователь будет писать в строках IP_line и PORT_line довольно просто, буквально две строки.
@onready var input_ip = $IP_line
@onready var input_port = $PORT_line
Создадим функцию для обработки события нажатия OK_buttons. Можете сделать это быстро нажав на кнопку->узел->двойное нажатие по событию pressed() (нажата)
Программа попросит выбрать к кому будет привязана кнопка - выбираем скрипт нашего "меню".
data - наш Json объект. Json в целом очень удобный формат хранения данных, представляющий из себя список словарей. То есть множество из пар вида КЛЮЧ: ЗНАЧЕНИЕ. Либо один единственный словарь, как в нашем случае. data содержит два поля ip и port. Значение пользователя получаем через ранее созданные input_ip и input_port, добавим к каждому .text - уточняем, что мы хотим получить текст из узла LineEdit.
Открываем файл на запись (FileAccess.WRITE) через встроенный FileAccess.open, проверяем, что файл получилось открыть или создать (если файла не было, он автоматически будет создан), и записываем туда данные. Остальное, надеюсь, в комментариях не нуждается, да и в целом подробное описание каждого чиха лучше ощущается в видео формате.
Чуть не забыл о Label! Подключим его строкой:
@onready var savedata_result := $Save_data
Функция _ready сработает сама при первом заходе в сцену. Она спрячет на Label, так как пользователь его видеть не должен. Та самая заглушка которую можно было видеть выше, будет скрыта если запустить приложение. Функция show_message принимает два параметра - сообщение, и Label, который должен выйти из скрытности и показать сообщение. Реализовал так, чтобы не приходилось писать под каждый отдельный Label свою функцию. Теперь, когда будет нажата кнопка ОК, под строками покажется сообщение-статус.
Сцены
Для кнопки BACK_button - возвращения на предыдущую сцену - все куда проще:
get_tree().change_scene_to_file("res://Controller/controller.tscn")
Встроенные функции Godot позволяют легко переключаться между сценами, лишь бы вы правильно указывали пути и дерево было прогружено.
Сеть
В сцене контроллер для подключения к серверу я сделал функцию connect_to_server, но само подключение осуществляется через встроенную connect_to_host. Чтобы ей пользоваться необходимо создать объект StreamPeerTCP
var peer : StreamPeerTCP = StreamPeerTCP.new()
Замечательно, теперь можем подключаться к TCP-серверам. Но это ещё не все.
Чертов poll. На самом деле не помню как точно обнаружил эту ошибку, но крови она мне выпила много. Дело в том, что в официальной документации на StreamPeerTCP забыли уточнить, что сервер желательно пинать, чтобы подключение не было отрублено. С одной стороны - логично. С другой - начинающий хлеб об этом не думает. _process ещё одна функция/фича Godot. Функция выполняется на фоне и делает это постоянно. Таким образом, если в теле оставите .poll и проверку статуса подключения (строки 39 и 40), то будет вам счастье. Строки с 41 по 44 были когда-то нужны для отладки - смотрел прием данных с сервера. Кто знает, когда пригодится.
Хорошо, подключили, как отправить данные? Тут на помощь приходят функции начинающиеся на put_ и также входящие в StreamPeerTCP. Чтобы было чуть понятнее, вот пример использования:
peer.put_utf8_string(message)
Таким образом отправляется сообщение в формате UTF-8. Это довольно примитивный уровень, но для закрытия текущей задачи его хватает.
Заключение
Чтож, следующая статья будет последнее. В ней я немного расскажу о том, как устроил сервер и ещё немного об обработке нажатий. Там же будет ссылка на исходные коды на финальные версии сервера/клиента. К сожалению, исходя из последних новостей, в новых версиях ОС для мобильников хотят полностью запретить возможность установки сторонних приложений, а значит собрать на дому и "поиграться" становится все меньше и меньше возможностей.