Skip to content

Commit

Permalink
Merge pull request #90
Browse files Browse the repository at this point in the history
Данный коммит включает в себя рефакторинг класса MainWindow, небольшие оптимизации производительности и исправления нескольких багов.
  • Loading branch information
anevero authored Jul 2, 2020
1 parent a9e6f15 commit f69d21b
Show file tree
Hide file tree
Showing 43 changed files with 1,412 additions and 1,215 deletions.
107 changes: 36 additions & 71 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,33 +30,28 @@ Tanks - 2D-игра, написанная на C++ с использование
несколько раз выпускались небольшие обновления, включающие в себя рефакторинг
кода и обеспечение совместимости проекта с актуальными версиями Qt.

Последняя версия программы - [0.8.1](https://github.com/anevero/tanks/tree/0.8.1).

В секции [releases](https://github.com/anevero/tanks/releases/tag/0.8.1)
можно найти архив с файлами программы, с помощью которого игру можно
запустить под 64-разрядной Windows, исполняемый файл программы для запуска
в 64-битных дистрибутивах Linux, а также apk-файл для установки игры на
Android-смартфон. Если вы хотите запустить игру на другой ОС, склонируйте
репозиторий и скомпилируйте проект самостоятельно (инструкции можно найти
ниже).

Для работы с игрой под Windows распакуйте загруженный архив и запустите
исполняемый файл *Tanks.exe*.

Перед запуском игры под Linux убедитесь, что ваш дистрибутив содержит
динамические библиотеки Qt версии 5.15. После скачивания файла
при необходимости разрешите его выполнение (например, в Ubuntu можно поставить
соответствующую галочку в свойствах файла или воспользоваться *chmod*). После
этого запустите игру с помощью команды *./tanks_X_linux64* в терминале.

Чтобы запустить игру на Android, установите опубликованный apk-файл. Если
Google Play Protect будет блокировать установку приложения, вы можете временно
отключить Google Play Protect (это можно сделать в настройках Play Market) или
установить программу через ADB.
Последняя версия программы - [0.8.4](https://github.com/anevero/tanks/tree/0.8.4).

В секции [releases](https://github.com/anevero/tanks/releases/tag/0.8.4)
можно найти установщики игры для 32- и 64-разрядной Windows, 64-разрядной
Ubuntu, а также apk-файл для установки игры на Android-смартфон.

Установщики для Windows и Linux были созданы с использованием утилиты
[CQtDeployer](https://github.com/QuasarApp/CQtDeployer). Для удаления программы
после ее установки на этих операционных системах достаточно запустить файл
*TanksTool* из папки, куда была установлена игра.

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

Если вы хотите запустить игру на другой ОС, склонируйте репозиторий и
скомпилируйте проект самостоятельно (инструкции можно найти ниже).

Учтите, что приложение тестировалось только на Windows 10 1803, Ubuntu 18.04 и
Android 7.0 с оболочкой MIUI 10. Корректная работа приложения на других ОС
(включая *любые версии* Android) не гарантируется.
нескольких Android-устройствах с разными версиями Android и разными оболочками.
Корректная работа приложения на других ОС (включая *любые версии* Android) не
гарантируется.

## Статус ветви master

Expand All @@ -76,18 +71,10 @@ Android 7.0 с оболочкой MIUI 10. Корректная работа п
* `cppcheck`: отвечает за статический анализ кода.
* `cpplint`: отвечает за статический анализ кода.

Сообщения, связанные со сборкой проекта, выводятся перед вердиктом выполнения
команды `make`. Сообщения, связанные со стилем кода, выводятся в самом конце
лога командами `cat`.

Замечания о неиспользуемых функциях не влияют на статус сборки, но подобные
сообщения стоит изучать и при необходимости явно обозначать функции как
*[[maybe_unused]]*. Все остальные предупреждения влияют на статус сборки, и
игнорировать их не стоит.

Используемый для проверки стиля кода статический анализатор, возможно, не
самый продвинутый, поэтому настоятельно рекомендуется обращать внимание на
предупреждения IDE.
Замечания `cppcheck` не влияют на статус CI (из-за большого количества
ложноположительных срабатываний), но рекомендуется все же обращать на них
внимание. Предупреждения `cpplint` влияют на статус сборки, и игнорировать их
нельзя.

## Сборка проекта с помощью QMake

Expand All @@ -100,9 +87,9 @@ Windows - с помощью **MinGW64**.
Сборка проекта под Android - несколько более сложная процедура. Немного
подробнее об этом можно почитать в
[документации](https://doc.qt.io/qt-5/android-getting-started.html).
Обратите внимание, что в проекте используются не совсем стандартные манифест
и скрипты Gradle. В последних можно найти информацию о том, какие версии
некоторых компонентов необходимы для сборки проекта.
Обратите внимание на то, что в проекте используются не совсем стандартные
манифест и скрипты Gradle. В последних можно найти информацию о том, какие
версии некоторых компонентов необходимы для сборки проекта.

Для редактирования переводов приложения следует использовать входящие в состав
Qt утилиты [lupdate](https://doc.qt.io/qt-5/linguist-manager.html#using-lupdate)
Expand Down Expand Up @@ -145,9 +132,10 @@ Qt конфигурационным файлам CMake. Пример (строк

Учитывайте, что при использовании CLion вам придется смириться со следующими
ограничениями:
* По умолчанию не будет работать дебаггер. Возможно, это можно исправить.
* По умолчанию с классами Qt не будет работать дебаггер. Вероятно, это можно
исправить.
* По умолчанию приложение нельзя будет скомпилировать, подписать и запустить
под Android. Возможно, существуют частичные решения этой проблемы.
под Android. Возможно, существуют решения этой проблемы.
* Для редактирования и генерации файлов перевода все равно нужны утилиты
Qt.

Expand All @@ -164,33 +152,10 @@ Qt.
версии Qt, проект может не скомпилироваться. Это связано с изменением структуры
манифеста в Qt 5.14-5.15.

## Активация СlangFormat в Qt Creator

Если вы планируете работать в среде разработки Qt Creator, для автоматических
правок стиля кода можно использовать встроенный в IDE плагин *СlangFormat*.

Для работы с плагином необходимо установить утилиту
[ClangFormat](https://clang.llvm.org/docs/ClangFormat.html).

В Linux используйте менеджер пакетов вашего дистрибутива, в частности, в Ubuntu:

`sudo apt-get install clang-format`

В Windows установка **Clang** и необходимых компонентов осуществляется с
помощью установочного файла, который можно загрузить с
[сайта LLVM](http://releases.llvm.org/download.html)
(раздел *Pre-built Binaries*, выберите ссылку, соответствующую разрядности
вашей системы).

Далее для активации плагина в Qt Creator пройдите в меню **Help -
About Plugins**, где поставьте галочку напротив пункта **Beautifier
(experimental)**. Перезагрузите IDE. После этого пройдите в меню **Tools -
Options - Beautifier**. Во вкладке **Clang Format** в выпадающем списке **Use
predefined style** выберите **Google**. Если вы используете Windows, в этой же
вкладке дополнительно требуется указать путь к утилите **clang-format**. Если
вы не изменяли стандартный путь установки, вам нужно выбрать файл
**C:\Program Files\LLVM\bin\clang-format.exe**. После всех этих операций
нажмите **Apply** и **OK**.
## Известные проблемы в работе игры

Реформат кода можно запустить в любой момент с помощью соответствующей опции
в выпадающем списке **Tools - Beautifier - ClangFormat**.
В связи с тем, что в последних версиях Qt использование QToolTip под Android
влечет за собой мгновенный segmentation fault и падение приложения
([баг-репорт](https://bugreports.qt.io/browse/QTBUG-83916)), соответствующая
функциональность (отображение здоровья по нажатию на танк) была отключена при
компиляции под Android и пока недоступна в игре.
2 changes: 1 addition & 1 deletion android/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<manifest package="org.tanks.tanks" xmlns:android="http://schemas.android.com/apk/res/android"
android:versionName="0.8.2" android:versionCode="7"
android:versionName="0.8.4" android:versionCode="8"
android:installLocation="auto">
<supports-screens android:largeScreens="true"
android:normalScreens="true" android:anyDensity="true"
Expand Down
17 changes: 17 additions & 0 deletions game_core/about_dialog.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "about_dialog.h"

#include <QScroller>
#include <QTextCursor>
#include <QUrl>

AboutDialog::AboutDialog(QWidget* parent)
Expand All @@ -24,3 +25,19 @@ AboutDialog::AboutDialog(QWidget* parent)
connect(buttons_, &QDialogButtonBox::accepted, this, &AboutDialog::accept);
connect(buttons_, &QDialogButtonBox::rejected, this, &AboutDialog::reject);
}

void AboutDialog::accept() {
ResetCursor();
return QDialog::accept();
}

void AboutDialog::reject() {
ResetCursor();
return QDialog::reject();
}

void AboutDialog::ResetCursor() {
QTextCursor cursor = html_widget_->textCursor();
cursor.setPosition(0);
html_widget_->setTextCursor(cursor);
}
5 changes: 5 additions & 0 deletions game_core/about_dialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@ class AboutDialog : public QDialog {
explicit AboutDialog(QWidget* parent = nullptr);
~AboutDialog() override = default;

void accept() override;
void reject() override;

private:
void ResetCursor();

QVBoxLayout* layout_;
QTextBrowser* html_widget_;
QDialogButtonBox* buttons_;
Expand Down
12 changes: 10 additions & 2 deletions game_core/constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ const QString kOrganizationName = "Tanks";
const QString kApplicationName = "Tanks";
const int kApplicationRestartCode = 438254263;

const int kMinutesPerRound = 10;

// New game dialog constants.
const int kMapsNumber = 4;
const int kTanksNumber = 3;
Expand All @@ -32,6 +30,16 @@ const QString kLanguageKey = "language";
const std::vector<int> kFpsOptions = {40, 50, 60, 90, 120, 240};
const std::vector<QString> kLanguages = {"en_US", "ru_RU", "be_BY"};

// Game constants;
const int kChargesNumber = 3;
const int kVirtualKeysNumber = 5;
const int kMinutesPerRound = 10;

const double kOpacityLevel = 0.6;
const int kMedicalKitSpawnPeriod = 20000;
const int kChargeSpawnPeriod = 15000;
const int kBoomCharge = 25;

} // namespace constants

#endif // GAME_CORE_CONSTANTS_H_
Loading

0 comments on commit f69d21b

Please sign in to comment.