Как сделать тетрис для андроид

Как написать свой Тетрис на Java за полчаса

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

В предыдущих статьях этой серии мы уже успели написать сапёра, змейку и десктопный клон игры 2048. Попробуем теперь написать свой Тетрис.

Нам, как обычно, понадобятся:

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

С чего начать?

Получение данных от пользователя

Код, честно говоря, достаточно капитанский:

Интерфейсы для клавиатурного и графического модулей

Так как многим не нравится, что я пишу эти модули на LWJGL, я решил в статье уделить время только интерфейсам этих классов. Каждый может написать их с помощью той GUI-библиотеки, которая ему нравится (или вообще сделать консольный вариант). Я же по старинке реализовал их на LWJGL, код можно посмотреть здесь в папках graphics/lwjglmodule и keyboard/lwjglmodule.

Интерфейсы же, после добавления в них всех упомянутых выше методов, будут выглядеть следующим образом:

Отлично, мы получили от пользователя данные. Что дальше?

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

Сюда же добавим проверку на переполнение поля (в Тетрисе игра завершается, когда фигурам некуда падать):

Так, а теперь мы напишем класс для того магического gameField, в который мы всё это передаём, да?

А инициализировать мы их будем так:

А вот теперь мы переходим к классу, который отвечает за хранение информации об игровом поле и её обновление.

Класс GameField

Этот класс должен, во-первых, хранить информацию о поле и о падающей фигуре, а во-вторых, содержать методы для их обновления, и получения о них информации – кроме тех, которые мы уже использовали, необходимо написать метод, возвращающий цвет ячейки по координатам, чтобы графический модуль мог отрисовать поле.

Хранить информацию о поле…

…и о падающей фигуре

TpReadableColor — простой enum, содержащий элементы с говорящими названиями (RED, ORANGE и т.п.) и метод, позволяющий получить случайным образом один из этих элементов. Ничего особенного в нём нет, код можно посмотреть тут.

Это все поля, которые нам понадобятся. Как известно, поля любят быть инициализированными.
Сделать это следует в конструкторе.

Конструктор и инициализация полей

А что это там за spawnNewFigure()? Почему инициализация фигуры вынесена в отдельный метод?

На этом с хранением данных мы закончили. Переходим к методам, которые отдают информацию о поле другим классам.

Методы, передающие информацию об игровом поле

Таких метода всего два. Первый возвращает цвет ячейки (для графического модуля):

А второй сообщает, переполнено ли поле (как это происходит, мы разобрали выше):

Методы, обновляющие фигуру и игровое поле

Сдвиг фигуры

Что мы сделали в этом методе? Мы запросили у фигуры ячейки, которые бы она заняла в случае сдвига. А затем для каждой из этих ячеек мы проверяем, не выходит ли она за пределы поля, и не находится ли по её координатам в сетке статичный блок. Если хоть одна ячейка фигуры выходит за пределы или пытается встать на место блока – сдвига не происходит. Coord здесь – класс-оболочка с двумя публичными числовыми полями (x и y координаты).

Поворот фигуры

Логика аналогична сдвигу:

Падение фигуры

Сначала код в точности повторяет предыдущие два метода:

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

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

Теперь GameField реализован почти полностью — за исключением геттера для фигуры. Её ведь графическому модулю тоже придётся отрисовывать:

Теперь нам нужно написать алгоритмы, по которым фигура определяет свои координаты в разных состояниях. Да и вообще весь класс фигуры.

Класс фигуры

Реализовать это всё я предлагаю следующим образом – хранить для фигуры (1) «мнимую» координату, такую, что все реальные блоки находятся ниже и правее неё, (2) состояние поворота (их всего 4, после 4-х поворотов фигура всегда возвращается в начальное положение) и (3) маску, которая по первым двум параметрам будет определять положение реальных блоков:

Rotation мод здесь будет выглядеть таким образом:

Соответственно, от самого класса Figure нам нужен только конструктор, инициализирующий поля:

И методы, которыми мы пользовались в GameField следующего вида:

Вдобавок, у фигуры должен быть цвет, чтобы графический модуль мог её отобразить. В тетрисе каждой фигуре соответствует свой цвет, поэтому цвет мы будем запрашивать у формы:

Форма фигуры и маски координат

Чтобы не занимать лишнее место, здесь я приведу реализацию только для двух форм: I-образной и J-образной. Код для остальных фигур принципиально не отличается и выложен на GitHub.

Храним для каждой фигуры маску координат (которая определяет, насколько каждый реальный блок должен отстоять от «мнимой» координаты фигуры) и цвет:

Реализуем методы, которые использовали выше:

Ну а сами маски координат я предлагаю просто захардкодить следующим образом:

Т.е. для каждого объекта enum‘а мы передаём с помощью импровизированных (других в Java нет) делегатов метод, в котором в зависимости от переданного состояния поворота возвращаем разные реальные координаты блоков. В общем-то, можно обойтись и без делегатов, если хранить в каждом элементе отсупы для каждого из режимов поворота.

Источник

Как я делал Brick Game на Unity3D для Android и получил блокировку от Google

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроидВикипедия: Brick Game («Игра с кирпичами»; также его называют «Тетрис») — игровое устройство, работающее на гальванических элементах, снабжённое несколькими предустановленными играми и чёрно-белым (монохромным) экраном. На таких устройствах практически всегда присутствует игра, аналогичная «Тетрису», хотя вместе с ней часто имеются и другие игры. Существуют разные виды устройств с разным количеством игр.

Я расскажу о том, как (и почему) создавал симулятор Brick Game на Unity3D для Android с тетрисом, змейкой, гонками, танчиками и прочими играми, об эксперименте с монетизацией, а также о том за что Google Play может заблокировать подобное приложение и как его потом разблокировать.

Предыстория. «Тетрисы» без тетриса

Однажды захотел поиграть в Тетрис (сперва именно в игру Тетрис, а не в то устройство, что у нас в детстве называли «тетрисом»). Порылся в Google Play, нашел только две официальные версии от EA games. Поразился количеству бесполезных (по моему мнению) модных фишечек и наличию внутриигровых платежей. В Тетрисе! В целом ощущения были «не те».

И тут я вспомнил о такой штуковине как Brick Game и как на нём здорово было играть в Тетрис. Подумал, что в Google Play наверняка должен быть симулятор, и не ошибся. Таких симуляторов нашлось множество. Я поставил самый популярный и… не нашел тетриса среди игр. Кроме того посреди экранчика из квадратиков красовалось меню из кнопок с современными сглаженными шрифтами, с помощью которого нужно было стартовать игру, переключать звук и так далее. Не реалистично. Странно, миллион скачиваний и такие недоработки. Проверил остальные симуляторы — ещё плачевней да и тетриса нет почти нигде, а там где он есть — реализован кривовато, играть неудобно. Не говоря уже о реалистичности графического воплощения.

В общем решил я заполнить пробел и создать свой симулятор, с хорошим тетрисом и реалистичным экраном, для себя и для всех.

Из Википедии (а позже и на своём опыте, об этом читайте ниже) узнал, почему нет игры Тетрис во многих популярных симуляторах.

В 1996 году предполагаемый автор Тетриса (кстати, выходец из СССР), вместе с неким Хенком Роджерсом (англ. Henk Rogers) создал за рубежом компании The Tetris Company LLC и Blue Planet Software, пытаясь получить прибыль от бренда Tetris. The Tetris Company LLC (TTC) зарегистрировала слово Tetris как торговую марку. С тех пор несколько компаний купили у TTC лицензию на торговую марку. По американским законам, игру нельзя защитить авторским правом (только запатентовать), поэтому основным имуществом компании является торговая марка Tetris. Несмотря на это, TTC преследует клоны игры под именами, непохожими на Tetris. В мае 2010 года юрист TTC послал письмо в Google с требованием убрать с рынка Android Market все 35 клонов данной игры, хотя их имена не схожи с именем «Tetris».

Разработка. Выбор инструмента

Вначале предстояло выбрать между 1) Unity3D и 2) Android + какая-нибудь библиотека либо на голом Android API.

У меня ранее были эксперименты и с Unity3D и C# и с Java + Android, поэтому и рассматривал эти варианты.

1) Плюсы:
+ много готовых функций которые пригодятся для такого симулятора
+ возможность моментально проверить работу приложения в редакторе прямо на ПК

Минусы:
– большой вес *.apk файла — от 20 Мб
– дольше запускается
– прожорливость (батарея садится быстрее, больше греется)

2) Плюсы:
+ маленький вес («платишь» в основном за вес графических файлов)
+ высокая скорость запуска и экономия батареи

Минусы:
– придется писать больше кода (точнее, абстракций, либо утонуть в процедурном коде)
– медленный процесс тестирования на эмуляторе/устройстве

Наверняка не все согласятся с моими оценками, это дело личных умений и вкуса. Я пожертвовал размером и прожорливостью в пользу быстроты разработки и избрал Unity3D.

Разработка. Графическое представление

Начал с рисования скина с кнопками и экраном. Рисовал в векторном графическом редакторе, прорисовал все детали вплоть до каждого кубика на экране и палочки в циферных LCD блоках. Полного фотореализма достигнуть не удалось, особенно с кнопками, но в целом вышло неплохо. Экспортировал в PNG и закинул в Unity, на Quad, в качестве текстуры.

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

Позже добавил еще два скина — с большим экраном и повёрнутый.
Скин с большим экраном (может быть удобен на устройствах с небольшой диагональю дисплея):

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

Не долго думая, экран решил оживлять с помощью маленьких квадратиков с неактивными пикселями. То есть подложка у меня вся состоит из активных пикселей, а сверху объекты с неактивными пикселями, которым я переключаю видимость, а именно флаг enable. Класс дисплея содержит самый обычный модифицируемый массив из 200 элементов (10х20) (по ячейке на каждый квадратик), работать с ним удобно.

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

Помучался немного с расстановкой, возможно где-то и остались небольшие смещения, но их не заметно, ведь самое главное, что активные пиксели, которые ярче, расставлены строго по сетке и это вшито в картинку, поэтому масштабирование (при использовании качественного сглаживания) не должно испортить расстановку квадратиков. Проверил — так и вышло, всё ровно и аккуратно, радует глаз, решение «в лоб» сработало с первого раза.

Вокруг кнопок в ненажатом состоянии есть небольшая тень, для анимации кнопок я добавил маски с дыркой под кнопку и затенением которые появляются при нажатии и делают кнопку визуально вжатой в корпус.

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

Коллайдеры кнопок сферические и радиусом чуть выступают за пределы кнопок, чтобы легче было попасть (особенно это актуально для верхнего ряда маленьких кнопок).

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

Разработка. Звук

Пока работал над приложением нашел на городском рынке самый настоящий Brick Game, принес домой, и записал звуки нажатия и отпускания реальных кнопок. Многих игроков, кстати, эти звуки раздражали, я выпустил обновление, которое отключает эти звуки в режиме Mute, но даже сквозь пиликанье самого устройства пробивался звук нажатия кнопок и люди просили сделать эти звуки тише. А мне так нравились эти звуки, что не хотелось их приглушать.

Пиликанье сгенерировал заранее простейшим синтезатором (смешал несколько типов волн).

Разработка. Логика

Первой игрой которую я добавил в свой симулятор был, конечно же, Тетрис. Здесь я постарался: симметричная система поворотов, отскоки от стен и пола при повороте, проворачивание на 180 градусов в узком колодце, справедливый генератор выбора фигурки, скольжение после мягкого падения, управление (хорошая отзывчивость в целом, резкое падение двойным нажатием вниз, поворот в обратную сторону кнопкой вверх) и даже знаменитый T-spin вроде бы удалось сделать. В итоге мне было удобнее и приятнее играть в эту игру на своём симуляторе в смартфоне, чем на реальном Brick Game. Не говоря уже об официальном Тетрисе для Android который больше похож на цирковое представление, чем на тетрис (ИМХО).

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

В Unity3D можно использовать C# и все прелести ООП, что я и сделал. Написал базовый класс для всех игр (с банальным названием Game) и добавлял их по одной, наследуясь от этого класса.

Добавил змейку, гонки, еще несколько видов тетриса (например с фигурками из 5 блоков), понг, позже танчики, арканоид… Впихнул туда также парочку несвойственных этому устройству игр: Digger и Bomber. Digger получился сверхсложным и непонятным, но решил его оставить в качестве изюминки.

Сделал стандартную анимацию заливки экрана при проигрыше (с представлением дисплея в коде в виде массива это было элементарно), анимацию взрыва для гонок и пары других игр. К классам прибавились Sprite, AnimatedSprite. Например, каждая фигурка тетриса у меня это Sprite, и после сдвига этого спрайта можно проверять столкновения с игровым полем и реагировать соответственно.

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

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

Раскрутка

Из 39 тысяч, лишь пара сотен человек пришли по ссылкам из интернета, которые я оставлял на разных сайтах, посвященных Android-играм. Все остальные — самостоятельно нашли приложение в поиске Google Play.

Монетизация

Вас, должно быть, смутило, что я у себя считаю только скачивания. Как показала моя статистика от постоянных пользователей притока мало, в основном играют новоскачавшие, половина скачавших вообще удаляет приложение сразу или на следующий день, а те, кто оставил — играют настолько редко, что слабо влияет на статистику.

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

Блокировка и разблокировка

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

4 Октября игру заблокировали и Google Play Support прислали мне письмо о том, что моё приложение “has been removed from Google Play because it violates our metadata policy. This app won’t be available to users until you submit a compliant update.”, что значит — что-то не так с описанием или названием. Никаких подробностей, что именно их не устроило они не сообщили. Мол, читай правила, догадывайся сам, исправляй либо подавай аппеляцию.

Я сразу предположил, что виной всему наличие в симуляторе игры в тетрис и упоминание об этом в описании. Но это же симулятор устройства, в котором всегда был тетрис (в первых Brick Game вообще кроме тетриса ничего не было)! И так уж сложилось, что устройство Brick Game у нас называли «тетрисом» хоть это и неверно, но прижилось, стало нарицательным.

Но всё же достоверно причину я не знал, поэтому ничего не меняя подал апелляцию.

Через 2 дня пришел ответ:

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

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

Вот такой вот маразм, нельзя писать, что у тебя в игре есть тетрис, даже если он там есть, а лучше вообще его убрать, наверное, чтобы в дальнейшем не было проблем. Можно было бы сэкономить время если бы они сразу написали, что дело в слове tetris в описании.

Подверг описание цензуре:

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

Приложение после этого разблокировали. Не исключаю, что в будущем могут влепить блокировку за то, что там есть тетрис на скриншоте или что он есть в самом симуляторе.

Источник

Как сделать тетрис для андроид

Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроид

Краткое описание:
Классический тетрис в ретро стиле

Описание:
Отличный классический тетрис.
+ Удобное настраиваемое управление (кнопки можно менять местами)
+ Возможность подсвечивать столбик с падающей фигурой
+ Одноцветные или многоцветные фигуры на выбор
+ Красивая пиксельная графика в ретро стиле
+ Восьмибитная музыка из оригинального тетриса
+ Настраиваемая скорость, от неспешной расслабляющей игры до хардкорной бойни
+ Сохранение игры при выходе
+ Таблица рекордов

Кстати, игра написана мной, причем это моя первая игра. Так что можете оставлять в комментах свои предложения и замечания.

Русский интерфейс: да

Скачать: версия: 1.3
Как сделать тетрис для андроид. Смотреть фото Как сделать тетрис для андроид. Смотреть картинку Как сделать тетрис для андроид. Картинка про Как сделать тетрис для андроид. Фото Как сделать тетрис для андроидTetris-1.3.apk ( 550,86 КБ )

Сделайте копию оригинала, а то те что есть тупят, а ваш наподобе, но всё равно не то.

Когда то на 15 скорости гонки, теннис, и стройку прошёл :smoke:

Ещё бы звук смещения влево и вправо, и сделать чтобы фигурка при соприкосновении с уже установленными фиксировалась не сразу, а с небольшой задержкой, как в прочих тетрисах, а то если стакан заполнен на 2/3 то практически гарантировано проигрываешь. Если возможно добавить функцию настроек управления, чтобы менять клавиши местами.
Ну, а если помечтать, то можно бы сделать 2 режима, классический, и как в Brick Games с новыми фигурами и бонусами в виде стреляющих или проваливающихся до первой пустоты одиночных кубиков.
З.Ы. И да полоску отключаемой сделать не помешало бы, и ещё сетку на фоне сделать, только еле заметную. И мелодий ещё несколько штук бы, имеющаяся то что надо, а не корявые миксы как у ЕА.
З.З.Ы. Но в целом весьма, и весьма, неплохой тетрис :yes2:
З.З.З.Ы. В общем столько ещё понаписывал, что наверное пойду искать таблетки от ЕЩЁ и ЖАДНОСТИ 😀

Обновил версию в щапке, исправил баг при котором один и тот же результат записывался в рекорды несколько раз, просьба перекачать всем, кто играет.

Большое спасибо за отзывы (и за плюсы, лол).
А теперь по пунктам:

Звук смещения влево и вправо я сначала сделал, но он звучал так часто, что мешал. Посмотрим, может что-нибудь менее выделяющееся сделаю.

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

Не играл в Brick Games, надо будет глянуть. Но вообще этот тетрис делался как первая игра на андроид, исключительно для разминки и проверки своих сил перед чем-то более грандиозным 🙂
Первая версия была за 12 часов вообще сделана (от момента появления идеи до заливки на форум). Так что изначально не задумывалось сильное развитие этой игры.

Это легко устроить.

Вот тут потруднее, я сам к музыке имею отдаленное отношение, так что банально нашел что-то типа нот текущей мелодии и перенабрал их 8бит-трекере (прога для создания 8битной музыки). Могу сделать вторую мелодию из тетриса еще.

Ах да, сейчас сессия, такие дела. Раньше чем дней через 5 не ждите апдейтов.

P.S. Пишите в комментариях, в какие бы вы еще игры поиграли в похожем стиле оформления?

Мне именно местами менять, расположение устраивает

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *