Как запустить динозаврика Google на тачбаре? Пишем игру на Python
Не знаете, чем заняться на новогодних праздниках? Предлагаем отложить нарезку оливье и взяться за новый проект — написать свою игру для тачбара. В тексте показываем, как это сделать на Python всего за час.
Вот что получится, если будете следовать инструкции.
С 2016 года у некоторых моделей MacBook Pro есть сенсорная OLED-панель. Она заменяет функциональные клавиши, закладки и элементы настроек.
Для программирования тачбара не обязательно погружаться в Swift и AppKit — достаточно знания Python и библиотеки PyTouchBar. С последним познакомимся подробней: напишем игру с динозавриком и освоим встроенные инструменты модуля.
Используйте навигацию, если нужно изучить конкретные шаги, а не читать инструкцию целиком:
Делаем меню и знакомимся с элементами библиотеки
Кнопка «играть»
PyTouchBar работает в связке с Tkinter. Для начала нужно установить и первый, и второй модули. А после — подготовить GUI-окно, которое будет отображаться на тачбаре. И добавить, например, кнопку «играть».
После запуска программы кнопка отобразится на панели.
Для окрашивания кнопки можно использовать встроенную константу PyTouchBar.Color. Или передать в функцию кортеж (r, g, b, a), где r, g, b, a — значения от 0 до 1.
Если нажать на кнопку, ничего не произойдет. Для запуска подпрограммы нужно добавить аргумент action и сослаться на имя функции.
Подпрограмма start нужна для запуска игровой сцены game.
Настройка скорости динозаврика
Библиотека поддерживает не только простые кнопки, но и так называемые «степперы» — с помощью них можно вводить числовые значения. В нашем случае — скорость динозаврика.
После запуска программы элементы отобразятся на панели.
На самом деле PyTouchBar поддерживает больше элементов. Некоторые из них мы добавим в игру ниже. Полный список ищите в официальной документации.
Загружаем игровую сцену из кактусов
Представление 2D-сцены
После нажатия кнопки «играть» должна сработать специальная функция game, которая нужна для отрисовки сцены — динозаврика и кактусов. Один из вариантов — добавить их с помощью кнопок, которые мы будем называть чанками.
Каждый чанк — целочисленное значение:
- -2 — динозавр врезался в кактус,
- -1 — кактус,
- 0 — плоскость,
- 1 — динозаврик,
- 2 — динозавр перепрыгнул через кактус.
Карту можно представить так:
Визуализация элементов
Кнопки поддерживают параметр image: на фон можно поставить любое статическое изображение.
Так, например, можно «пройтись» циклом по списку map и наполнить список buttons кнопками с изображениями, выбранными по значениям чанков.
В результате схема карты преобразится в игровую сцену.
Что нужно учитывать
Для запуска сцены нужно закрыть root-окно и запустить новое. PyTouchBar не поддерживает обновление Tkinter-программ.
Но как тогда заставить динозаврика бежать?
Заставляем динозаврика бежать
Чтобы динозаврик побежал, нужно как-то обновлять сцену без root.update(). То есть уничтожать настоящую сцену с помощью root.destroy() и запускать новую с обновленными параметрами map. Получается некое обновление кадров.
Удаление старых кадров
Автоматизировать удаление старых кадров с помощью root.destroy() можно с помощью встроенного метода root.after(). Он умеет запускать отложенные функции.
1000 — время, спустя которое удалится root-окно. Чем меньше значение, тем быстрее бежит динозаврик.
Создание новых кадров
Сам динозаврик не двигается. Обновляется только задний план — ландшафт сцены.
По сути, генерировать новые кадры можно разными способами. Выберем один из самых простых: будем делать срез списка на один элемент и добавлять рандомный чанк в конец. А после — запускать на новой карте игровую сцену game.
На тачбаре это выглядит вот так:
Покадровое обновление игровой сцены.
Для большей плавности нужно создать ассеты для промежуточных кадров. И добавить в игровую сцену дополнительный цикл при отрисовке чанков.
Добавление событий
Предпоследний этап — то, ради чего играют в Google-динозаврика, — «паркур по кактусам».
Чтобы добавить прыжок, нужно завести переменную jump — к ней мы будем прибавлять единицу при нажатии на кнопку с динозавром. И модифицировать список map таким образом, чтобы в первом чанке кактус и динозавр могли встретиться несколькими способами.
→ Динозаврик врезался в кактус — чанк -2. Комбинация [1, -1], jump = 0.
→ Динозаврик перепрыгнул кактус — чанк 2. Комбинация [1, -1], jump = 1.
Вот как «сценарии» записаны в программе:
В коде отрисовки сцены также нужно добавить новые события:
На тачбаре это выглядит вот так:
Итоговый результат.
Выводим количество очков
Если динозаврик все же врезался, игру необходимо завершить: показать игроку количество набранных очков и сообщение.
Подсчет очков
Для подсчета очков нужно завести переменную points и прибавлять к ней единицу каждый раз, когда динозаврик перепрыгивает через кактус. Но с выводом сообщения немного сложней.
Вывод сообщения
Чтобы вывести сообщение, нужно создать новое окно Tkinter, подготовить его и добавить текстовое поле.
Элемент Label поддерживает разные шрифты, цвета и масштабы. Полный список параметров есть в официальной документации.
Притом вызвать функцию finish нужно после отрисовки сцены.
Как закрыть сообщение и программу?
У PyTouchBar есть особенность: с помощью библиотеки можно модифицировать встроенную кнопку escape. Например, сделать ее кнопкой для закрытия программы.
Полная версия кода доступна на GitHub. Подключайтесь и предлагайте свои улучшения.
На что еще способна библиотека?
Даже с ограничениями библиотека кажется интересной. С помощью нее можно написать софт для решения повседневных задач. Например, сделать дополнительный ряд кнопок для всяких спецсимволов, если надоела раскладка Бирмана.
Но Doom с помощью PyTouchBar запустить будет сложно: не понятно, как «вытягивать» отдельные кадры и управлять игрой через панель. Для более сложных проектов лучше «прыгнуть в нору за кроликом» и программировать тачбар с помощью Objective-C.
Напишите в комментариях, какую еще программу или игру можно написать для тачбара. И подпишитесь на блог Selectel, чтобы не пропустить обзоры, новости, кейсы и полезные гайды из мира IT.
Читайте также:
Вы молодец но опоздали на 5 лет )
нууу, как говорится
лучше поздно чем никогда))
Мде, игра для тачбара на макбуке... Звучит как интересный опыт, но охват аудитории у такого проекта будет околонулевой
А какая программа для тачбара могла бы найти своего пользователя? Поделитесь идеями — необязательно, чтобы это была игра)
Что можно вывести на полоску 0,5 см? ряд кастомных кнопок, больше ничего, для игр нормальный экран же есть, зачем извращаться...
суть-то в опыте. я не делал такого, мне интересно, и сделаю)
Можно, например, вывести Doom, если правильно сделать раскадровку и с высокой частотой обновлять бэкграунд кнопок)