Концепция приложения: Классическая аркадная игра, где вы управляете платформой, отбивающей шар, чтобы сбить все блоки на уровне.
Состав приложения:
Материалы к проекту:
Игра будет состоять из одного уровня, последующие уровни можно будет сделать по образцу.
Настройка приложения
Для начала потребуется найти картинки, которые будут у нас в качестве блоков. Пусть это будут яблоки.


Далее, нужно изображение для площадки (от которой будет отскакивать шар). Например, такое:

Поскольку в MIT App Inventor нет простого способа определить, коснулся ли шар конкретной границы экрана (например, нижней). Поэтому для отслеживания касания нижней границы экрана мы используем следующую хитрость: создаём у нижнего края игровой области спрайт-объект, ширина которого равна ширине экрана. Этот спрайт выполняет роль «зоны поражения». Вместо проверки «коснулся ли шар нижней границы?» мы проверяем более простое и контролируемое событие: «Произошло ли столкновение шара со спрайтом-ловушкой?». Если да — отнимаем жизнь.
Чтобы как-то разнообразить дизайн, сделаем так, чтобы каждая такая полоса была раскрашена в свой цвет, как предупреждение на светофоре. Для этого используем цвета красный, желтый, зеленый (т.е. спрайт будет иметь изображение в виде залитого цветом прямоугольника).



Также для звукового сопровождения нам понадобятся звуки удара, проигрыша и победы.
Теперь перейдем к настройкам.
- Название приложения — «Арканоид».
- Иконка — можно выбрать из ранее загруженных (например, яблоко) или добавить свою.
- Остальные настройки — по умолчанию.
Дизайн-макет
Внешний вид приложения будет выглядеть вот так:

Состав компонентов:

и медиафайлов:

Первым делом настроим Экран:
- Выравнивание по горизонтали — Центр,
- Выравнивание по вертикали — Верх,
- Цвет фона, фоновый рисунок и анимацию можно оставить по умолчанию или сделать свои,
- Ориентация экрана — широкоформатный (т.е. горизонтальный),
- Отключаем показ заголовка и статус-бара.
- Галочку с «Прокручиваемый» можно не убирать, у нас и так будет расчет размера в процентах от размера экрана.

Добавим Горизонтальное расположение. В нем будут располагаться кнопки и основная информация об игре. Его настройки:
- Выравнивание по горизонтали и вертикали — Центр Центр.
- Высота — автоматически.
- Ширина — наполнить родительский.

Внутрь расположения добавим две Кнопки. Это будут кнопки старта и перезапуска. Оформить их можно по своему вкусу. Главное, что у первой:
- название компонента — Старт,
- текст — «Старт».
У второй:
- название компонента — Заново,
- текст — «Заново».


Далее внутрь расположения после кнопок добавляем две Надписи. Сюда будут выводится очки и жизни. Оформление, опять же, любое, главное — это название компонентов и их содержимое.
У первой надписи:
- название компонента — Очки,
- текст — «Счет: 0».
У второй надписи:
- название компонента — Жизни,
- текст — «Жизни: 3».


Далее добавляем еще две Надписи. В эти надписи у нас будут выводится сообщения о победе и проигрыше. Оформление также можете сделать любым, но лучше таким, чтобы визуально эти надписи отличались от счета и жизней. Например, проигрыш черный:

Победа — красная:

Плюс к оформлению, не забываем, чем еще должны отличаться эти надписи. У проигрыша:
- название компонента — Проигрыш,
- текст — «Не повезло».
У победы:
- название компонента — Победа,
- текст — «Победа!».
Ключевая особенность этих надписей — они должны быть скрыты, потому что показываться должны только при определенных условиях.


С горизонтальным расположением закончили. Теперь двигаемся дальше и добавим Холст — основное игровое поле. Его настройки:
- Цвет фона — сделайте любой, приятный вам. Главное, чтобы не он не сливался с блоками, площадкой и шаром, ну и самим экраном (чтобы было понятно, что это игровое поле). Напоминаем, что выбрать цвет можно, кликнув на кружок цвета и в палитре цветов отметить понравившийся вариант. Для более продвинутых пользователей можно ввести код цвета в поле ниже. После выбора не забудьте нажать Save.

- Фоновый рисунок можно не делать, если есть заливка цветом.
- Высота — 230 пикселей (фиксировано, чтобы лучше установить блоки и линии перехвата).
- Ширина — наполнить родительский.

Теперь добавим Шар. Это именно то, что будет двигаться на холсте и сбивать блоки. Его настройки:
- Цвет краски — любой, лишь бы не сливался с фоном.
- Радиус — 8. Можно больше/меньше, подбирайте по своему комфорту: чтобы шар был заметен, но не был слишком громоздким.
- Видимый — галочка стоит.
- Координаты вбивать не нужно. Просто установите шар мышкой где-нибудь в центре холста.
- Включено — галочка снята. Нам не нужно, чтобы шар работал без нажатия кнопки «Старт».
- Курс — 0 (по умолчанию).
- Интервал — 100 (по умолчанию).
- Скорость — 5 (средняя).

Теперь добавим блоки, которые будем сбивать. Для этого нам понадобится Изображение спрайта. Лучше добавить несколько, чтобы было интереснее играть. В нашем случае их 6. У них будут схожие настройки:
- высота — 30 пикселей,
- ширина — 30 пикселей,
высоту и ширину можете сделать больше/меньше в зависимости от выбранного изображения и вашего предпочтения; - изображение — желтое или красное яблоко (если используете предложенные картинки),
- название компонента, чтобы не путаться, но и не потерять их, лучше сделать по шаблону — Блок1, Блок2 и т.д.
т.е. ваш список компонентов, отвечающих за блоки, должен выглядеть примерно вот так:

Расставьте блоки равномерно в верхней части холста.
В итоге должны получится примерно такие настройки спрайтов. Отличатся они будут только координатами и изображениями.


Теперь сделаем площадку — от чего будет отскакивать шар. Для этого добавим еще одно Изображение спрайта. Разместите его в нижней трети холста, но не в самом низу — нам понадобится пространство, чтобы добавить линии ограничения. Настройки площадки:
- Высота — 10 пикселей,
- Ширина — 100 пикселей,
- Установить выбранное изображение площадки,
- Название компонента — Площадка,
- Остальные настройки по умолчанию.

Теперь добавим линии ограничения, их будет три: зеленая, желтая и красная.
Добавим первую линию — зеленую. Её нужно расположить чуть ниже, чем площадка. Например, если площадка располагается на высоте y = 170, то зеленая линия должна располагаться на высоте ниже y = 190. Напоминаем, что отсчет координат идет от левого верхнего угла, соответственно, чем ближе к низу экрана, тем координата y будет больше. В нашем случае отсчет идет от левого верхнего угла холста, т.к. спрайты привязываются именно к нему.
- Название компонента — Зеленая.
- Ширина — наполнить родительский.
- Высота — 5 пикселей.
- координаты:
- x = 0 (левая сторона экрана)
- y = 190 (или +20 пикселей к координате y вашей площадки).
- Изображение — ранее загруженная картинка зеленого прямоугольника.
Обратите внимание! Ширина загруженного изображения должна быть больше или равна ширины экрана, на котором планируется запускать игру.
В приложенных файлах ширина линий 1000 пикселей, что вполне хватит для большинства смартфонов. Если вы планируете делать игру также под планшеты, рекомендуем добавить более широкое изображение линий (от 2000 пикселей). В противном случае линия не будет доставать до правого края экрана.

Сделаем следующую линию контроля — желтую. Она должна располагаться ниже зеленой и появляться только тогда, когда шар коснулся зеленой. Добавим Изображение спрайта. Его настройки:
- Название компонента — Желтая.
- Ширина — наполнить родительский.
- Высота — 5 пикселей.
- координаты:
- x = 0 (левая сторона экрана)
- y = 210 (или +20 пикселей к координате y зеленой линии).
- Видимый — галочка снята.
- Изображение — ранее загруженная картинка желтого прямоугольника.

Добавим последнюю линию — красную. Она должна располагаться ниже желтой и появляться после того, как шар коснулся желтой линии. Добавим Изображение спрайта. Его настройки:
- Название компонента — Красная.
- Ширина — наполнить родительский.
- Высота — 5 пикселей.
- координаты:
- x = 0 (левая сторона экрана)
- y = 220 (или +10 пикселей к координате y желтой линии). Вообще в идеале нужно, чтобы красная линия была по самой нижней границе холста.
- Видимый — галочка снята.
- Изображение — ранее загруженная картинка красного прямоугольника.

Итак, холст готов, на нем есть все: шар, блоки, площадка и линии ограничения. Теперь осталось добавить немного: средство управления и проигрывания звука.
Добавим Сенсор Ориентации. Это невидимый компонент с минимумом предварительных настроек: есть только галочка включения/выключения. Оставим его включенным.

Добавим Проигрыватель, который будет отвечать за проигрывание звука (победа, проигрыш, удар). В настройках поставим:
- Звук — добавим звук удара, т.к. в игре он будет использоваться чаще всего.
- Установим громкость на 50, чтобы не было слишком громко.
- Остальное — по умолчанию.

Дизайн готов, можно переходить к программированию.
Программирование
В начале создадим две переменных: Счет и Жизни. Они должны иметь числовые значения. Счет будет равен 0, Жизни — 3.

Теперь создадим две процедуры, которые будут формировать надписи, отвечающие за счет и количество жизней. Удобнее использовать именно процедуры, чтобы каждый раз не прописывать несколько блоков.
Добавим первую процедуру Изменить Жизни, в ней добавим локальную переменную Жизни. Локальная переменная — это значение, которое будет использоваться внутри процедуры для последующей обработки. Чтобы добавить переменную, щелкнем на знак шестеренки.

Что должна делать данная процедура?
- Процедура получает на вход значение жизни. Т.е. в локальную переменную процедуры запишется входящее значение.
- Присваивает полученное значение глобальной переменной (чтобы жизни учитывались во всей игре).
- Заменяет значение количества жизней в надписи.
Первый пункт будет выполнен, когда будем вызывать процедуру, поэтому перейдем сразу ко второму: присваиваем полученное значение в глобальную переменную.

Затем требуется изменить текст надписи, чтобы скорректировать количество. Но загвоздка в том, что в надписи у нас не только число, но и текст «Жизни: «. Как тут быть? Использовать объединение строк! Мы каждый раз будем пересобирать надпись из двух частей: текста «Жизни: » (обязательно с пробелом после двоеточия) и значения переменной Жизни.

Обратите внимание! Сначала присваиваем значение, затем переписываем надпись
Процедура готова. По аналогии сделаем вторую — Изменить Счет. Можно скопировать процедуру жизней и заменить соответствующие пункты на относящиеся к счету.

Теперь запрограммируем управление площадкой. Площадка должна реагировать на наклон телефона вправо/влево. Для этого возьмем блок Когда Сенсор Ориентации Ориентация Изменена.

Когда ориентация телефона изменилась, площадка должна переместиться в нужную сторону. Для этого возьмем блок вызов Площадка Переместить В и установим координаты:
- х — текущая координата площадки + крен телефона (Сенсор Ориентации Катиться)
- y — не должна изменяться, т.к. площадка должна перемещаться в одной плоскости. Поэтому y = текущее положение y + 0.

Теперь запрограммируем кнопку старта. Что должно происходить при старте игры?
- Сама кнопка должна деактивироваться.
- Обнуляем счет и восстанавливаем жизни.
- Шар, где бы он ни был (на случай, когда одна игра уже была сыграна и шар перемещен от центра), должен переместиться в центр. Для этого делим ширину холста пополам и присваиваем это значение х, а y = 140 (или другое значение высоты, но шар должен располагаться выше площадки, т.е. начальная координата y шара должна быть меньше, чем координата y площадки. Напоминаем, что у площадки мы поставили 170).
- Шару должна быть задана начальная скорость (опять же на случай, когда уже была сыграна игра, в которой у шара была изменена скорость).
- Задаем шару случайный курс (наверх, чтобы шар сразу не улетел в линию ограничения: от 20 до 160).

Запрограммируем, что делать, когда шар коснулся края. Напоминаем, что конкретно трех краев: левого, правого и верхнего. Нижнего он коснутся не может — там установлены линии ограничения. Когда шар коснулся края, он должен отскочить в другом направлении, поэтому в блок вызов Шар Отскакивать мы добавим локальную переменную Край, чтобы её значение использовалось как курс для отскока (курс будет использован с противоположным знаком).

Теперь сам игровой процесс. Что делать, когда шар касается какого-либо объекта (а их у нас много: блоки, площадка, линии ограничения).
Для начала самое простое: добавим блок когда Шар Наложение с Объектом и запрограммируем проигрывание звука. На случай, если игра уже была проведена и звук был заменен на проигрыш или победу, следует предварительно присвоить проигрывателю звук удара.

Теперь будем добавлять условия, что происходит от соприкосновения с теми или иными объектами. Для наглядности будем делать это отдельными блоками ЕСЛИ — ТО.
Если шар касается площадки, он должен отскочить зеркально (угол падения равен углу отражения). Для этого будем вычислять новый курс шара по формуле: 360 (полный круг) — текущий курс шара.

Если шар попал в блок, то нужно:
- убрать блок с экрана (для этого выключим видимость блока),
- изменить зеркально курс шара (по аналогии с отскоком от площадки),
- изменить и вывести счет (для этого вызовем процедуру изменения счета, на вход которой передадим изменение текущего счет на 1).

По аналогии нужно сделать еще 5 таких программных блоков (если у вас всего 6 блоков для сбивания), заменяя в них название блока для касания (т.е. блок1, блок2, блок3 и т.д.).
Теперь запрограммируем касание линий. Первая — Зеленая, если шар её коснулся, должно произойти следующее:
- вызываем процедуру изменения жизни, куда на вход подаем текущее значение жизни — 1 (процедура перезапишет значение переменной и выведет это на экран),
- убираем зеленую линию,
- включаем видимость желтой линии,
- меняем курс шара по аналогии с другими отскоками.

Аналогично делаем блок для Желтой линии. Только в этот раз скрываем желтую, показываем красную:

Красная линия, тут уже интересней:
- запускаем процедуру изменения жизни на -1,
- убираем красную линию,
- выключаем движение шара,
- показываем надпись проигрыша,
- присваиваем проигрывателю звук проигрыша и включаем его.
Т.е. при касании красной линии игра прекращается.

Но в игре есть не только проигрыш, надо оформить и победу. Когда мы сбили все блоки (и счет стал равен 6):
- выключаем движение шара,
- показываем надпись победы,
- присваиваем проигрывателю звук победы и включаем его.

И маленький штрих, чтобы чуть усложнить игру: увеличим скорость, когда половина блоков будет сбита. Т.е. когда счет будет равен 3, скорость шара увеличивается.

Все эти блоки нужно добавить в когда Шар Наложение с Объектом. В итоге у нас получится вот такая длинная команда:

Осталось запрограммировать перезапуск игры, т.е. кнопку «Заново», которая расставляет все на свои места. Кнопка должна работать универсально, т.к. перезапуск будет осуществляться как после победы, так и после проигрыша. Поэтому, когда кнопка «Заново» нажата:
- перемещаем шар на центр холста чуть выше площадки,
- обнуляем счет,
- возвращаем жизни,
- скрываем надписи проигрыша и победы,
- выключаем движение шара,
- активируем кнопку Старт,
- показываем блоки для сбивания (в нашем случае 6 штук),
- скрываем желтую и красную линии,
- показываем зеленую.

Игра готова, можно тестировать.
Самостоятельная работа
- Попробуйте добавить еще один или несколько уровней. Это можно сделать либо на том же экране, изменив расположение блоков, либо с переходом к новому экрану.
- Попробуйте добавить бусты: например, периодически появляющийся спрайт, соприкосновение с которым будет увеличивать скорость шара.
- Сделайте ваш холст адаптивным: установите высоту холста не фиксированным количеством пикселей, а в зависимости от высоты экрана; расставьте блоки в зависимости от ширины и высоты холста (с помощью программных блоков и вычисления процентного соотношения); разместите линии ограничения в зависимости от расстояние (в процентах) от нижней границы экрана.