Привет! Сегодня мы разберем, как написать классическую игру "Змейка" на языке Go с использованием фреймворка Fyne, которая будет работать на Android, iOS и ПК. Это не просто учебный пример, а полноценное приложение с современным интерфейсом и оптимизацией.
Общая структура проекта
Импорты и зависимости
Объяснение импортов:
- fmt - для форматированного вывода (отображение счета)
- image/color - работа с цветами
- math, math/rand - математические операции и генерация случайных чисел
- sync, sync/atomic - синхронизация потоков
- time - работа со временем (таймеры, задержки)
- fyne.io/fyne/v2 и подпакеты - фреймворк для создания GUI
Кастомная тема оформления
Определение цветовой палитры
Методы темы Fyne:
Каждый элемент интерфейса запрашивает свой цвет по имени. Мы переопределяем только нужные нам цвета.
Модель данных игры
Перечисление направлений
iota автоматически присваивает последовательные значения константам.
Структура состояния игры
Почему atomic? Поля gameOver и score доступны из нескольких горутин одновременно. Atomic операции гарантируют, что не будет состояния гонки.
Настройки игры
Глобальные переменные и их назначение
Система команд
Главная функция main()
Инициализация приложения
Создание графических элементов
Оптимизация: пул объектов
Вместо постоянного создания и удаления объектов мы используем существующие, что значительно эффективнее.
Создание интерфейса
Запуск горутин
Игровой цикл (gameLoop)
Важность фиксированного шага времени: Игра должна работать с одинаковой скоростью независимо от производительности устройства.
Логика движения змейки
Проверка столкновений
Обработка съедания еды
Алгоритм размещения еды
Еда никогда не появляется на теле змейки - для этого используем алгоритм:
- Составляем список всех клеток поля
- Убираем из списка те, где находится змейка
- Случайно выбираем из оставшихся клеток
Цикл отрисовки
Адаптация к разным размерам экранов
Динамически вычисляем размер игрового поля:
Этот метод вызывается каждый раз при изменении размера окна
Управление на разных устройствах
На компьютере — клавиатура
На телефоне - сенсорные кнопки
Создаем виртуальный джойстик внизу экрана:
Fyne автоматически подстраивает размер кнопок под плотность пикселей экрана.
Особенности реализации для кроссплатформенности
Единая кодовая база
Код полностью одинаков для всех платформ. Fyne автоматически адаптирует:
- Размеры элементов под плотность пикселей
- Обработку ввода (касания/клики)
- Системные шрифты и иконки
Производительность
- Пул объектов избегает создания/удаления в рантайме
- Разделение логики и рендеринга гарантирует плавность
- Atomic операции обеспечивают безопасность многопоточности
Видео работы игры на смартфоне с ОС Android
Весь код игры и скомпилированный файл .apk есть на Boosty, переходите и скачивайте.
Этот код можно использовать как основу для других игр - тетриса, сапера, арканоида. Принципы остаются теми же: игровой цикл, разделение логики и отображения, адаптивный интерфейс.
Спасибо за ваше время и внимание! Ваша поддержка очень важна для меня! Если вам понравилась статья, пожалуйста, поставьте лайк!
Подпишитесь на мой Телеграм-канал, чтобы быть в курсе новых статей.
Удачи!