Оглавление:

Space Invaders в Micropython на Micro: bit: 5 шагов
Space Invaders в Micropython на Micro: bit: 5 шагов

Видео: Space Invaders в Micropython на Micro: bit: 5 шагов

Видео: Space Invaders в Micropython на Micro: bit: 5 шагов
Видео: Самая маленькая игровая 8-битная консоль в мире на Базовом устройстве ATOM 2024, Ноябрь
Anonim
Image
Image

В наших предыдущих статьях мы исследовали создание игр на GameGo, портативной игровой консоли в стиле ретро, разработанной TinkerGen education. Созданные нами игры напоминали старые игры Nintendo. В сегодняшней статье мы сделаем шаг назад, в золотой век аркадных игр. Мы воссоздадим игру Space Invaders в Micropython на микроконтроллере Micro: bit, а также будем использовать расширение BitPlayer Micro: bit, которое позволяет нам играть в игру более удобно.

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

Запасы

TinkerGen BitPlayer

BBC Micro: бит

Шаг 1: основной цикл

Джойстик
Джойстик

В этом уроке я буду часто использовать слово «метод». Метод в python чем-то похож на функцию, за исключением того, что он связан с объектом / классами. Итак, для упрощения вы можете прочитать это как «функция внутри класса». Вы можете узнать больше о методах здесь.

Входим в основной цикл с

пока не game_over:

состояние. Внутри мы получаем количество захватчиков, вероятность их появления и количество необходимое для перехода на следующий уровень из словаря уровней. Затем мы проверяем движение влево-вправо с помощью методов экземпляра Listen_Dir экземпляра класса JoyStick. Если одно из условий оценивается как True, мы увеличиваем / уменьшаем x-значение нашего игрового персонажа. Мы ограничиваем его до [-2, 2] двумя условиями if. Затем мы инициализируем экземпляр класса DisplayBuffer и проверяем нажатия кнопок «щит» или «пуля». Мы используем метод DisplayBuffer.set () для установки объектов для последующего рендеринга. Для рендеринга щита мы используем DisplayBuffer.set () напрямую, но для пуль и захватчиков мы добавляем их в соответствующий список и устанавливаем () их один за другим в цикле for со следующим кодом для последующего рендеринга с помощью DispBuffer.render ():

для b в маркерах: b.render (dispBuf) для v в vaders: v.render (dispBuf)

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

dispBuf.render ()

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

Шаг 2: джойстик

Джойстик
Джойстик

BitPlayer легко держать и использовать, с двухосевым джойстиком, таким как контроллеры Gameboy или PSP, он также включает в себя еще 6 программируемых кнопок, обозначенных как L, R, A, B, C и D. Для полного погружения и интерактивности BitPlayer сам оснащен зуммером, вибромотором и портом Grove I2C для подключения дополнительных периферийных устройств, таких как OLED-дисплей.

Мы используем только левый-правый переключатель джойстика для этой игры, для полного примера использования всех кнопок BitPlayer вы можете взглянуть на joystick_example.py в репозитории GitHub этого проекта. При создании экземпляра класса JoyStick мы проверяем чтение по оси X по умолчанию и сохраняем это значение в self. Read_X. Затем в функции Listen_Dir мы проверяем, превышает ли отклонение от этого значения по умолчанию значение переменной чувствительности (попробуйте настроить его самостоятельно, если вы чувствуете, что JoyStick слишком чувствителен), и возвращаем True или False в соответствии с обнаруженным направлением.

Давайте посмотрим на конкретный пример того, как это работает:

Скажем, наше значение по оси X по умолчанию равно 0. Затем, если мы переместим джойстик вправо:

New_X = JoyStick_X.read_analog () # New_X = 200

Right = New_X - self. Read_X #Right = 200 Left = self. Read_X - New_X #Left = -200

Затем, когда мы проверяем направление:

Precision = 150if Right> Precision: # 200> 150 True Get_Rocker = DIR ['R'] elif Left> Precision: # -200> 150 False Get_Rocker = DIR ['L'] else: Get_Rocker = DIR ['NONE'] if Dir == Get_Rocker: вернуть True иначе: вернуть False

Шаг 3: Показать буфер

Буфер дисплея
Буфер дисплея

Класс DisplayBuf отвечает за управление светодиодным экраном. Это делается с помощью двух методов: set () и render (). set () изменяет значения, соответствующие пикселям светодиодного экрана. Как вы помните, пиксели на экране Micro: bit LED могут быть представлены в виде строки или списка - «00000: 00000: 00000: 00000: 00000» - это пустой экран. «00000: 00000: 00000: 00000: 00100» - это экран с тускло освещенным пикселем в центре нижнего ряда.

00000:

00000

:00000

:00000:

00100"

Это обозначение может быть проще обработать:)

Итак, во время основного цикла мы вызываем метод set () DisplayBuf, чтобы установить все наши объекты, которые должны отображаться на экране. Затем мы используем метод render (), чтобы отображать их все на экране одновременно.

Шаг 4: захватчики, пули и игрок

Захватчики, пули и игрок
Захватчики, пули и игрок

Bullets и Invaders относятся к классу Mover. Экземпляры класса Mover имеют свои координаты x, y и скорость, а также яркость. Класс Mover имеет два метода экземпляра: set () и move (). set () просто вызывает метод DisplayBuf set () с обновленными координатами для сохранения для последующего рендеринга на светодиодной матрице. Метод move () обновляет координату экземпляра в соответствии со скоростью экземпляра - это пригодится позже, когда нам нужно изменить скорость захватчиков по мере прохождения уровней.

Класс Bullet и класс Invader являются подклассами класса Mover. Здесь мы используем так называемое наследование. Функциональность super () позволяет нам вызывать методы суперкласса в подклассе без необходимости повторять код.

Шаг 5: сделайте это по-своему

Сделай сам
Сделай сам

Поздравляю! Вы только что воссоздали классическую игру Space Invaders на Micro: bit с помощью крутого игрового оборудования. Конечно, отсюда вы можете улучшить код игры - например, на данный момент в игре только один уровень - вы можете добавить более сложные. Кроме того, как вы помните, в оригинальной игре перед игроком плавают камни, которые вы также можете добавить.

Если вы делаете улучшенную версию игры, поделитесь ею в комментариях ниже! Для получения дополнительной информации о BitPlayer и другом оборудовании для производителей и преподавателей STEM посетите наш веб-сайт https://tinkergen.com/ и подпишитесь на нашу новостную рассылку.

TinkerGen недавно создал кампанию на Kickstarter для MARK (Make A Robot Kit), набора роботов для обучения программированию, робототехнике и искусственному интеллекту!

Исходный код Micropython из hexkcd / micro-vaders был изменен для работы с TinkerGen BitPlayer.

Рекомендуемые: