- Разработка игры Пазлы на С++ для Android
- 1 Применимость шаблона проектирования Декоратор
- 2 Как нарисовать фигурные контуры фрагментов?
- 3 Как вырезать фигурный фрагмент изображения?
- Tile Puzzles: Cats 1.47
- Скриншоты игры
- Особенности геймплея
- Cat Puzzle 1.7
- Пазлы для андроид кот
- Управление сообществом
- Комментарий дня
Разработка игры Пазлы на С++ для Android
В статье описывается разработка очередной игрушки на С++, Qt для Android. В игре вы можете собирать пазлы из своих собственных картинок (любых изображений, имеющихся на телефоне).
Приложение с открытым исходным кодом, без рекламы, весит 8-10 Мб. Можно загрузить с google play, а можно — посмотреть исходники.
Трудно закончить первое приложение. Дальше процесс идет проще, так как у вас накапливаются наработки. Так, в этот раз я активно пользовался заготовками, краткие аннотации к которым приведены в статье «Разработка казуальных игр с помощью Qt Framework«. В частности, с их помощью выводится справка о программе, реализовано иерархическая система окон, отображается часть игровой сцены и выполняется ее масштабирование жестами пальцев.
Код, выполняющий открытие изображений на телефоне я заимствовал отсюда и оттуда. Просмотреть другим способом содержимое SD-карты/внутренней памяти не получилось (у каждого производителя телефонов в этом плане есть свои заморочки). Код по первой ссылке прекрасно работал на моем телефоне (Asus), но отказался работать на аппаратах товарищей (Huawei и Samsung).
Что есть в этой статье:
Игра реализована с помощью графического фреймворка Qt. Фрагменты пазла наследуют класс QGraphicsItem и помещаются на сцену ( QGraphicsScene ), за отображение (прокрутку и масштабирование) отвечает QGraphicsView . На заднем фоне отображается сетка, составленная из QGraphicsRectItem , которые задают «точки привязки» для элементов пазла.
1 Применимость шаблона проектирования Декоратор
Если вы не слышали о таком шаблоне проектирования — загляните туда.
Фрагмент пазла должен:
- отображать нужную картинку;
- отображать рамку при выделении мышью (пальцем);
- позволять себя перетаскивать;
- поворачиваться на 90 градусов при клике (если не имел место факт перетаскивания);
- устанавливаться в «правильную» позицию (после установки — игнорировать все события мыши).
Всю эту функциональность можно реализовать в одном единственном классе, но это плохое решение, нарушающее, как минимум, Single Responsibility Principle. Нужно попытаться распределить эти обязанности между несколькими классами. Паттерн «Декоратор» может показаться подходящим решением, ведь он:
- является гибкой альтернативой порождению подклассов с целью расширения функциональности [5];
- смешивать функциональность — отдельно реализуем отображение, выделение, перетаскивание и … смешиваем.
- добавлять и удалять функциональность к уже существующим объектам прямо во время выполнения (было бы здорово после «установки» элемента пазла — удалить функциональность перетаскивания и поворота);
рис. 1 Диаграмма классов шаблона Декоратор
Выглядит здорово, но в нашем случае работать не будет. Очень важная особенность, которую я не нашел у GoF [5] и поэтому пишу этот раздел — декораторы должны быть независимы друг от друга. Очевидно, если между декораторами есть зависимости, то «смешивать их как угодно» не получится. В нашем случае сразу несколько декораторов должны бы были обрабатывать события мыши, но:
- в каком порядке им это делать?
- при отпускании фигуры ( mouseReleaseEvent ) важно «имел ли место факт перетаскивания», т.к. от этого зависит необходимость вращения фигуры. А это явная зависимость от декоратора, выполняющего это перетаскивание;
- для проверки корректности установки фрагмента пазла, нужно получить информацию о его повороте (зависимость от декоратора вращения).
В момент проектирования эти зависимости не были так очевидны. В итоге, я отказался от «гибкой альтернативой порождению подклассов» и реализовал такую иерархию (с удовольствием приму предложения по рефакторингу):
Вывод: если вы хотите применить Декоратор — посмотрите внимательно, не появятся ли у конкретных декораторов взаимные зависимости.
Если вам понравился этот раздел — вы будете в восторге от «Дополнительных штрихов» Влиссидеса [6].
2 Как нарисовать фигурные контуры фрагментов?
Итак, исходное изображение разрезается на фигурные фрагменты:
Программа генерирует матрицу из кривых, как показано на приведенной картинке, а кривые генерируются случайным образом для каждого открываемого изображения. Для этого, программа хранит набор «опорных точек», описывающих один «крючек» фрагмента пазла, для каждой из них генерируется случайное смещение в небольшой окрестности (радиуса d ), как показано на рисунке:
В коде это реализовано так:
Задача немного осложняется тем, что:
- для крайних фрагментов программа вместо крючков, использует прямые;
- крючки могут быть «выгнутыми» и «вогнутыми», при этом выгнутые — увеличивают размеры фрагмента, а это важное при дальнейшей его заливке содержимым изображения;
- у смежных фрагментов имеются общие крючки и они должны иметь одинаковую форму, однако если у одного она выгнута, то у второго — вогнута.
В связи с этим, формируются две матрицы из горизонтальных и вертикальных крючков, которые необходимо соединить в контуры. Если до сих пор эти данные было удобно хранить в виде векторов опорных точек, то теперь нужно по ним построить плавную кривую ( QPainterPath ), для этого применяется стандартная функция кубической интерполяции cubicTo :
Полученные кривые соединяются в контур, для этого предварительно выполняется их смещение:
Итак, мы построили множество контуров, по которым теперь нужно разрезать изображение.
3 Как вырезать фигурный фрагмент изображения?
Лучший способ вырезать фигурную часть изображения — это залить контур нужной формы некоторым цветом и наложить на изображение маску. Тут основная проблема в том, что для наложения маски нам нужен QPixmap , а нарисовать контур с прозрачным фоном — можно на QImage :
Теперь, чтобы маска наложилась в правильное место, нужно вырезать соответствующий прямоугольник из исходного изображения. Затем, мы сможем сформировать QGraphicsPixmapItem, который и будем перемещать по графической сцене:
Тут описаны не все технические детали, однако, при необходимости, вы можете задать вопрос на нашем форуме.
Значительная часть работы была выполнена Брюхановой Ульяной, в рамках диплома.
Литература
- Страница приложения на Google Play.
- Репозиторий с исходным кодом проекта.
- Разработка казуальных игр с помощью Qt Framework.
- Шаблон проектирования Декоратор. Пример использования.
- Э. Гамма Приемы объектно-ориентированного проектирования. Паттерны проектирования / Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. – СПб.: Питер, 2009. – 366 с.
- Влиссидес Джон. Применение шаблонов проектирования. Дополнительные штрихи. : Пер. англ. М.: Издательский дом «Вильямс»
Источник
Tile Puzzles: Cats 1.47
Требуется Android 4.1 и выше! Категория: Головоломки, Логические Особенности: Пазлы, Животные, Фото, Развивающие Разработчик: TAM CO
Скриншоты игры
Особенности геймплея
Tile Puzzles: Cats – перемещай частички пазлов, ищи нужные элементы и соединяй их с остальными, чтобы образовать окончательную картинку с котиком.
Все любят котиков и это бесспорный факт. Разработчики этого приложение вместили 150 различных фотографий с милыми кошками, котами, котятами в одну игру. А смысл игры заключается в том, что тебе нужно собрать пазл воедино и получить окончательную картинку. Головоломка имеет пять уровней сложности. Начать игру можно с отбора картинки, их здесь море и могут возникнуть трудности с выбором, так как все картинки очень милые и их все хочется собрать. Исходное изображение разделяется на множество элементов пазла. Частички пазла легко перемещать в разных направлениях. Собранная картинка сохраниться, даже если возникнет необходимость выйти из игры. Своими достижениями и конечным вариантом картинки можно делиться в социальных сетях. Ты можешь выбрать сложность игрового процесса в зависимости от своего возраста.
Источник
Cat Puzzle 1.7
Котики Пазлы — это логическая игра, в которой необходимо из множества фрагментов рисунка составить цельную картинку. Выделяйте и меняйте местами фрагменты, чтобы собрать рисунок целиком. В головоломке Котики Пазлы вас ждут множество красивых картинок котиков и различные уровни сложности. Игра сделана так, чтобы в неё могли поиграть как взрослые, так и дети. Ваш ребенок или вы любите котиков? Эта игра для вас!
- Легкое освоение
- Простой и интуитивно понятный интерфейс
- Множество красивых котиков
- 5 уровней сложности
- Подходит для любого возраста: детей, взрослых
Игра поможет вам:
- Улучшить пространственное мышление
- Улучшить внимательность и методичность
- Улучшить образное и логическое мышление
- Проверить насколько вы терпеливы
Пройдите все уровни и станьте экспертом в области собирания котиков пазлов! Вы или ваш ребенок мечтаете собрать красивых котиков? У вас есть такая возможность в игре котики пазлы. Поставьте все фрагменты на свои места и получите удовольствие от собранной картинки. В этой игре вы можете весело проводить время и приобретать полезные навыки как для себя, так и для ваших детей.
Вы хотели проверить своё терпение или вам просто нравятся пазлы? Эта игра для вас! Станьте гуру пазлов, собрав всех котиков! Удачи!
- Больше котиков
- Соревнования
- Достижения
- Интересные режимы игры
Источник
Пазлы для андроид кот
Создание программ на языках C и C++ и всё что с этим связано — приложения, статьи, курсы, советы, обсуждения и специфический юмор.
Соблюдайте правила Pikabu:
Помимо этого ЗАПРЕЩЕНО:
— Размещать в сообществе посты стиля «Подскажите как стать программистом», «Подскажите как удалить вирус», «Подскажите как установить программу», «Подскажите как починить монитор/телевизор/мышь/тостер/клавиатуру» или «Напишите за меня лабу в универ». Пожалуйста размещайте такие посты вне этого сообщества или в соответствующих для этого сообществах.
Управление сообществом
Комментарий дня
Мы так с соседом сделали денди мультиплеер. Когда я просёк что сигнал на приставке соседа снизу ловится на мой телевизор (причем в цвете и со звуком). То сначала это просто был для меня этакий twitch я смотрел как сосед играет в игры и тихо завидовал. Родители приставку мне не покупали, а поиграть хотелось. В какой-то момент мне пришло в голову что видео и звук уже в телевизоре, нужно только передать управление с джойстика и можно играть вдвоём. (Почему-то очевидная идея просто собраться у него и поиграть мне в голову не пришла, родители соседа были достаточно строгие и частых гостей не привечали. Я предложил офигительную идею разрезать провод джойстика, удлиннить его и провести этот кабель в квартиру через форточку. Соседу идея показалась интересной, но он не соглашался резать собственный джойстик так как сильно сомневался, что что-нибудь из этой ерунды получится. В итогде был найден и куплен (на все мои сбережения) джойстик, который подходил к разъему соседа. В роли удленнителя выступил 6 жильный телефонный кабель. Нужно было понимать, что ни малейшей идеи о распиновки у меня в 7 лет не было, грубо говоря отрезать, спаять жилы заизолировать синей изолентой и надеяться что сработает. Но вы не представляете этот восторг когда я притащил бухту кабеля с джойстиком на одном конце и коннектором на другом. Подключил к разъему приставки и оно заработало, можно было играть вдвоём. Отдельная эпопея как мы протягивали кабель, к счастью кабель был тонкий и проходил в щель от форточки. Из остатков кабеля так же были сделаны удлиннители для телефона (телефоны были проводные). Так в 1993-1994 году у нас был не только мультиплеер, но и голосовой чат каждый день часа по 2-3 после школы но до прихода родителей. Так продолжалось около полугода, мы приходили домой после школы и резались в Черепашек Ниндзя вторых и третьих, Double Dragon в Контру и Танчики. Родители со временем просекли, что именно мы построили и с удивлением отнеслись с пониманием, просили играть поменьше и после уроков, но убирать конструкцию не заставили. Были и мелкие конфликты, связанные с тем, что у меня кнопки Start и Select не было а у друга были, так что контроль над игрой у меня был значительно меньший чем у него. Например другу могло надоесть играть в контру и он специально умирал а потом нажимал end вместо continue. В принципе завершение игры тоже было на соседе и тут я ничего поделать не мог. Закончилось всё внезапно, сосед с родителями переехал, а в той квартире поселился хмурый подросток лет 17 которому приставки были не интересны. Родители мне потом всё-таки купили Сегу уже и история с супе-удлиннителем джойстика забылась. Странно, больше 30 лет прошло, лица того парня уже не вспомнить, даже имени полного Артем его звали, кажется. Где он что с ним? Зато память сохранила запах канифоли, синей изоленты, обожённый палец при пайке (паял я увлечённо, но довольно плохо) и восторг игры без приставки, но с приставкой. Наш голосовой чат через телефон. Следующий раз я поиграл в мультиплеер в только 1997 году, это был компьютерный клуб и игра Command and Conquer.
Источник