Продолжаю небольшой цикл с рассказом о том, как я делал из своего телефона геймпад, чтобы просто поиграть с друзьями в Broforce на ноутбуке. Сегодня поговорим о переключениях между сценами, чтению и записи в 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 довольно просто, буквально две строки.
Создадим функцию для обработки события нажатия OK_buttons. Можете сделать это быстро нажав на кнопку->узел->двойное нажатие по событию pressed() (нажата)
Программа попросит выбрать к кому будет привязана кнопка - выбираем скрипт нашего "меню".
data - наш Json объект. Json в целом очень удобный формат хранения данных, представляющий из себя список словарей. То есть множество из пар вида КЛЮЧ: ЗНАЧЕНИЕ. Либо один единственный словарь, как в нашем случае. data содержит два поля ip и port. Значение пользователя получаем через ранее созданные input_ip и input_port, добавим к каждому .text - уточняем, что мы хотим получить текст из узла LineEdit.
Открываем файл на запись (FileAccess.WRITE) через встроенный FileAccess.open, проверяем, что файл получилось открыть или создать (если файла не было, он автоматически будет создан), и записываем туда данные. Остальное, надеюсь, в комментариях не нуждается, да и в целом подробное описание каждого чиха лучше ощущается в видео формате.
Чуть не забыл о Label! Подключим его строкой:
Функция _ready сработает сама при первом заходе в сцену. Она спрячет на Label, так как пользователь его видеть не должен. Та самая заглушка которую можно было видеть выше, будет скрыта если запустить приложение. Функция show_message принимает два параметра - сообщение, и Label, который должен выйти из скрытности и показать сообщение. Реализовал так, чтобы не приходилось писать под каждый отдельный Label свою функцию. Теперь, когда будет нажата кнопка ОК, под строками покажется сообщение-статус.
Сцены
Для кнопки BACK_button - возвращения на предыдущую сцену - все куда проще:
Встроенные функции Godot позволяют легко переключаться между сценами, лишь бы вы правильно указывали пути и дерево было прогружено.
Сеть
В сцене контроллер для подключения к серверу я сделал функцию connect_to_server, но само подключение осуществляется через встроенную connect_to_host. Чтобы ей пользоваться необходимо создать объект StreamPeerTCP
Замечательно, теперь можем подключаться к TCP-серверам. Но это ещё не все.
Чертов poll. На самом деле не помню как точно обнаружил эту ошибку, но крови она мне выпила много. Дело в том, что в официальной документации на StreamPeerTCP забыли уточнить, что сервер желательно пинать, чтобы подключение не было отрублено. С одной стороны - логично. С другой - начинающий хлеб об этом не думает. _process ещё одна функция/фича Godot. Функция выполняется на фоне и делает это постоянно. Таким образом, если в теле оставите .poll и проверку статуса подключения (строки 39 и 40), то будет вам счастье. Строки с 41 по 44 были когда-то нужны для отладки - смотрел прием данных с сервера. Кто знает, когда пригодится.
Хорошо, подключили, как отправить данные? Тут на помощь приходят функции начинающиеся на put_ и также входящие в StreamPeerTCP. Чтобы было чуть понятнее, вот пример использования:
Таким образом отправляется сообщение в формате UTF-8. Это довольно примитивный уровень, но для закрытия текущей задачи его хватает.
Заключение
Чтож, следующая статья будет последнее. В ней я немного расскажу о том, как устроил сервер и ещё немного об обработке нажатий. Там же будет ссылка на исходные коды на финальные версии сервера/клиента. К сожалению, исходя из последних новостей, в новых версиях ОС для мобильников хотят полностью запретить возможность установки сторонних приложений, а значит собрать на дому и "поиграться" становится все меньше и меньше возможностей.