Code Monkey home page Code Monkey logo

gyboml's Introduction

Get Your Bombs off My Lawn!

A two-player game for Android. The goal is the destruction of your opponent's base by bombarding it with various missiles, and the protection of your own base by shielding it with constructions made of destructible blocks. Demo link

Demo

Key features:

  1. Turn-based strategy with real-time physics
  2. Easy to learn, hard to master

Installation and launch instructions (for the user)

To install the latest version, download the application in the apk format from the attached files to the latest release. During installation, you will need to grant permission to install applications from third-party (non-Play Store) sources. You can confidently do this: our game is open-source and does not contain malicious components

System requirements

  1. Target platform - Android
  2. Android version - 7.0 and above
  3. Minimum RAM - 2 GB
  4. Minimum screen resolution - 480 x 800

Comparison with similar games

We were inspired by Angry Birds и Worms, let's look at how our project stands out

Product GYBoML Angry Birds Worms
single-player - + +- (bots)
multi-player + - +
in-game economy + - -
cool physics + + -
variativity in gameplay + - +

Installation (for developers)

Latest release:

	git clone https://github.com/zhenyatos/GYBoML/

Building client application

  • Download Android Studio
  • In Android Studio:
    • Files...
    • Open...
    • Choose client directory
    • Build (Ctrl + F9)
    • For debugging Shift + F9, without debugging Shift + F10

Building server application

Просмотр и отладка кода

  • Download Intellij Idea
  • In Intellij Idea:
    • Files...
    • Open...
    • Choose server directory
    • Next, proceed as for building client application

Building JAR executables for client and server

  • Install the Maven utility for your operating system.
  • Add the apache_/bin directory address to the PATH environment variable.
  • Ensure that the JAVA_HOME environment variable exists and points to a JDK no older than version 8.
  • Navigate to the root of the project.
  • Execute the command mvn package.
  • Launch the network client:
    • Navigate to the directory net-client/target.
    • Execute the command:
      java -jar ???_WithDependencies.jar
      (The archive name is approximate and may change from version to version.)
  • Launch the server:
    • Navigate to the directory server/target.
    • Similarly to the network client, execute the appropriate command.

To connect to the server, the client must send a request req. The server will then display information about the client connection in stdout.

To pass the turn to the client, write the command:

pass

To disconnect the client and server, write the following in the console:

q

The current version of the code is located in the develop branch. However, be cautious: some features may be unstable.

Project team

Git workflow (in Russian)

Статья atlassian и статья на хабре

В репозитории есть две основные ветки - origin/master и origin/develop. Сливать с ветвями напрямую нельзя. Необходимо сделать pull request, который будет разрешать техлид. Также присутствуют ветви, соответствующие задаче, в них реализуемой.

Ветка origin/develop является главной веткой разработки. Она всегда содержит собирающийся без ошибок код. По окончании очередного спринта ветвь origin/develop при достаточной стабильности сливается в origin/master, образуя новый "релиз".

Каждая новая функциональность является соответствующей задачей (или issue) на ZenHub (или любой другой agile платформе) и имеет свое название, вкратце описывающее суть задачи. Для реализации соотвествующей функциональности надо создать новую ветку на базе ветки origin/develop в формате: {номер задачи}-{название задачи}. Это нужно для того, чтобы по ветке можно было легко найти задачу, которую реализует эта ветка, на agile платформе.

При успешной реализации функциональности соответствующая ей ветвь сливается обратно в develop, предварительно делая git rebase, если это необходимо (а именно - когда за время разработки этой функциональности произошли коммиты в origin/develop и нужно перебазировать текущую ветку для успешного слияния без конфликтов).

Сообщения к коммитам:

Читайте https://m.habr.com/ru/post/416887/

  1. Отделять заголовок от тела пустой строкой.
  2. Ограничивать заголовок 50 символами.
  3. Писать заголовок с заглавной буквы.
  4. Не ставить точку в конце заголовка.
  5. Использовать повелительное наклонение в заголовке.
  6. Переходить на новую строку в теле на 72 символах.
  7. В теле отвечать на вопросы: "Что?" и "Почему?", а не "Как?".
  8. Писать #{номер issue} в заголовке

Замечания:

  1. Один коммит должен содержать одно целостное осмысленное добавление новой функциональности. Не надо делать несколько коммитов в ветке, реализуя некоторую функциональность (по типу 'Updated a.cpp' -> 'Updated b.cpp' -> 'Updated README.txt'). Обычно, одна ветка функциональности - это один коммит. Для "сплющивания" нескольких последовательных(!) коммитов в один используется git rebase -i COMMIT_SHA, где COMMIT_SHA - хэш коммита, идущего перед первым в серии сплющиваемых коммитов. Если не понятно - подробнее тут

Стандарт кодирования

  • Классы именуем по принципу: каждое слово с заглавной буквы:
    • class MainActivity
    • class BaseWeapon
  • Последнее слово в имени класса обозначает категорию объектов, к которым он относится:
    • class MainActivity
    • class FirstLevel
    • class WoodDefense
  • Функции и переменные именуем в camel-case:
    • Object getYourBombsOffMyLawn()
    • void setWeaponToViking(Gamer viking)
    • int bombsCount
  • Аргументы функций при написании реализаций и при вызове не отделяем пробелами:
    • int getGamersCount(Forest f)
    • int gamersCount = getGamersCount(forest)
  • Все вложенные по смыслу инструкции смещаем относительно родительских на четыре пробела (во всех IDEA-подобных IDE по умолчанию осуществляется нажатием Tab):
for (int i = 0; i < 10; i++) {
	a[i] += i;
	if (a[i] == 0) {
	    a[i] = -1;
	    break;
	}
}
  • Фигурные скобки для формирования блоков команд ставятся всюду одинаково: левая скобка на одной строке с инициатором блока (шапкой функции, условным оператором, циклом), правая скобка - на следующей строке после последней команды блока:
Status foo(Object bar) {
	if (bar == null) {
		b = new Object(...);
		b.value = 0;
	}
}
  • Все флаги оформляем в enum заглавными буквами:
enum Status {
	OK(0),
	BAD(1);
	...
}
  • Общие правила: все переменные должны именоваться так, чтобы по названию угадывалась их семантика. Не должно быть объектов с абстрактными многозначными в контексте программы именами. Пример как не надо делать:
void printTwoWeirdNumbers(int[] array) {
	int cnt1 = 0, cnt2  = 0;
	for (int i = 0; i < array.length; i++)
		if (array[i] % 2 == 0)
			cnt1++;
		else
			cnt2++;
	System.out.println(...); // печатаем количества
}

Вот так оптимально:

void printEvenOddCount(int[] array) {
	int evenCount = 0, oddCount = 0;
	for (int i = 0; i < array.length; i++)
		if (array[i] % 2 == 0)
			evenCount++;
		else
			oddCount++;
	System.out.println(...); // печатаем количества
}

gyboml's People

Contributors

jiija avatar kystyn avatar slmtnm avatar via8 avatar zhenyatos avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar

gyboml's Issues

Деревянный блок

Создать класс PhysicalWoodenBlock, отнаследовав от Destructible, сделать графическую версию.

Принять решение по работе с сервером

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

  • Выбрать способ, с помощью которого игроки будут подключаться к игровой сессии. Вкратце описать суть способа
  • Выбрать способ обмена игровых данных в игровой сессии (p2p/сервер и т.п.). Вкратце описать суть способа
  • Расписать какие технологии потребуются

Файл в котором будет вся необходимая информация залить в папку Description, в ветку
docworks-server (создать), после согласования вся документация будет слита в master

Первая версия приложения

Для получения первой версии необходимо:

  • Установить и настроить Android SDK
  • Создать проект, присоединить необходимые модули, настроить
  • Собрать и получить .apk файл

Необходимая информация https://www.jetbrains.com/help/idea/android-support-overview.html
Коммитить в ветку first-version (создать)

Нарисовать текстуру блока и снаряда

В ближайшее время потребуются текстуры пассивных игровых объектов. Разработать текстуру одного блока (деревянного) и одного снаряда (самого стандартного).

Cклад снарядов - интерфейс

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

Work: Вторник - Четверг

Выстрел!

При нажатии на кнопку выстрела генерируется снаряд из выбранной ячейки оружейной и запускается из дула пушки.

  • Реализовать механику с вращением дула вокруг оси для выбора углового направления игроком
  • Реализовать обработку столкновений PhysicalBasicShot как наследника Shot с PhysicalCastle как наследника Destructible.

Изучаем JBox2D (2)

Физический движок который мы будем использовать, туториал под C++, но аналогичные классы Java интуитивно находятся: https://www.iforce2d.net/b2dtut/ Ключевые моменты вынесены в качестве подзадач, изучайте только если планируете работать в проекте с физикой (2 человека максимум)

  • Что такое Testbed и как добавить туда свой тест
  • Основные классы и как они связаны: BodyDef, FixtureDef, Shape (предок PolygonShape, EdgeShape)
  • Типы тел и как в зависимости от них меняется поведение объекта
  • Collisions: как регистрировать столкновения и отвечать на это каким-то действием

Подзадача считается выполненной если можете работать с тем что в ней расписано, оценивайте сами

Выбрать git workflow

Для проекта требуется единый способ работы с VCS Git: выбрать набор правил, желательно с ссылками на примеры использования оного и записать в Readme.md.

Интерфейс игрока: стрельба

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

Изучаем инструменты LibGDX, связанные с графикой (LWJGL+) (2)

Здесь лежит краткий гайд по инструментам которые будут нам полезны при работе с графикой (менеджер текстур, редактор физики и т.д.):
https://www.codeandweb.com/texturepacker/tutorials/libgdx-physics

Требуется освоить целиком, изучайте только если планируете работать в проекте с графикой (2 человека максимум)

Иерархия классов

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

Описание продукта

Добавить описание продукта на русском и английском в Readme.md, оно включает в себя:

  1. Под какую платформу
  2. Цель игры
  3. Key feature's

Нарисовать бэкграунд

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

Класс PhysicalBasicShot

Для текстуры базового снаряда получить basic_shot.xml, затем создать экземпляр класса Body ему соответствующий. Обернуть в PhysicalBasicShot - наследника BasicShot созданного на основе Shot.

Текстура замка

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

Кнопка передачи хода

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

Изучаем JBox2D (1)

Физический движок который мы будем использовать, туториал под C++, но аналогичные классы Java интуитивно находятся: https://www.iforce2d.net/b2dtut/ Ключевые моменты вынесены в качестве подзадач, изучайте только если планируете работать в проекте с физикой (2 человека максимум)

  • Что такое Testbed и как добавить туда свой тест
  • Основные классы и как они связаны: BodyDef, FixtureDef, Shape (предок PolygonShape, EdgeShape)
  • Типы тел и как в зависимости от них меняется поведение объекта
  • Collisions: как регистрировать столкновения и отвечать на это каким-то действием

Подзадача считается выполненной если можете работать с тем что в ней расписано, оценивайте сами

Описать спорные механики

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

  • Могут ли блоки висеть в воздухе?
  • Будут ли фазы и если да, то какие?

Файл с информацией залить в папку Documentation, в ветку docworks-client (создать), после согласования вся документация будет слита в master

Текстура башни

Нарисовать текстуру башни с орудием. Подвижные части должны быть нарисованы отдельно, анимация их движения будет обеспечена физическим движком. Должны быть части текстуры с изменяемым цветом (для первого игрока - красный, для второго - синий, как вариант, но лучше под цвет карты контрастное что-то).

Изучаем инструменты LibGDX, связанные с графикой (LWJGL+) (1)

Здесь лежит краткий гайд по инструментам которые будут нам полезны при работе с графикой (менеджер текстур, редактор физики и т.д.):
https://www.codeandweb.com/texturepacker/tutorials/libgdx-physics

Требуется освоить целиком, изучайте только если планируете работать в проекте с графикой (2 человека максимум)

Релиз очередной версии приложения

Собрать, запустить, протестировать, чеклист

  • Связь с сервером
  • Передача хода
  • В свой ход можно выбрать снаряд и сделать выстрел,
  • Все стабильно отображается на экране

Дополнение иерархии классов

Дополнить класс Shot (снаряд), с учетом генерации оным Damage'а при столкновении с Destructible объектом. Написать систему материалов для Destructible объектов.

Описать игровой дизайн

Необходимо получить подробное описание игры, понятное команде, для этого:

  • Описать как распределяется право первого хода
  • Описать внешний вид игрового поля
  • Описать ключевые игровые механики

Файл с информацией залить в папку Documentation, в ветку docworks-client (создать), после согласования вся документация будет слита в master

Класс PhysicalCastle

Отдельно для каждой части текстуры (основа замка и башенка-выступ), получить castle_%part_name%_.xml, затем создать экземпляры класса Body им соответствующие и скрепить их (как вариант расположением в пространстве т.к. замок неподвижен). Обернуть все данные в PhysicalCastle - наследника Castle.

Класс PhysicalTower

Отдельно для каждой части текстуры получить tower_%part_name%_.xml, затем создать экземпляры класса Body им соответствующие и скрепить их при помощи Joint'ов. Обернуть все данные в PhysicalTower - наследника Tower.

Слей это!

Необходимо слить все наработки, которые были сделаны в третьем спринте и не влиты в девелоп

Физические версии классов

Для следующих классов:

  • Tower
  • Castle
  • BasicShot

получить их физические версии, для этого использовать PhysicsEditor LibGDX и текстуры соответствующих объектов сцены.

Развернуть серверное приложение

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

Графические версии классов

Добавить графические версии классов Tower, Castle и Ball, которые могут быть отрисованы на экране по их физическим версиям. Здесь как удобно, желательно использовать паттерны.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.