Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,8 @@ compile_commands.json

# QtCreator local machine specific files for imported projects
*creator.user*



/.idea/
!Controller/ui_controller.h
81 changes: 81 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
cmake_minimum_required(VERSION 3.20)
project(Game)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
#set(CMAKE_AUTOUIC ON)

find_package(Qt6 COMPONENTS
Core
Gui
Widgets
REQUIRED)

set(RESOURCES
Resources/resources.qrc)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(GAME_OBJECTS
GameObjects/Interface/damageable.cpp
GameObjects/Interface/entity.cpp
GameObjects/Entities/Mobs/Basis/mob.cpp
GameObjects/Entities/Towers/tower.cpp
GameObjects/Entities/Towers/TowerSlots/tower_slot.cpp
GameObjects/Entities/Projectiles/autoguided_projectile.cpp
GameObjects/Entities/Projectiles/magic_projectile.cpp
GameObjects/Interface/graphics_object.cpp
GameObjects/Entities/Projectiles/projectile.cpp
GameObjects/Entities/Mobs/skeleton.cpp
GameObjects/Entities/Mobs/cobra.cpp
GameObjects/Entities/Mobs/hedgehog.cpp
GameObjects/Entities/Mobs/dwarf.cpp
GameObjects/Entities/Towers/magic_tower.cpp
GameObjects/Entities/Towers/cannon_tower.cpp
GameObjects/explosion.cpp
GameObjects/Entities/Traps/bear_trap.cpp
GameObjects/Entities/Traps/bomb.cpp
GameObjects/coin.cpp
GameObjects/Entities/Projectiles/linear_autoguided_projectile.cpp
GameObjects/Entities/Projectiles/cannon_projectile.cpp)

set(UTILITIES
Utilities/damage.cpp
Utilities/time.cpp
Utilities/vector_f.cpp
Utilities/Resources/pixmap_loader.cpp
Utilities/timer.cpp
Utilities/route.cpp
Utilities/wave.cpp
wave_manager.cpp
Utilities/animation.cpp
Utilities/utility.cpp
Utilities/randomaizer.cpp)

set(UI
UI/tooltip.cpp
UI/textured_box.cpp
UI/linear_menu.cpp
UI/linear_layout.cpp
UI/button.cpp
UI/padding_box.cpp
UI/pixmap_object.cpp
UI/pixmap_object.h
UI/resource_displayer.cpp)

add_executable(Game
${RESOURCES}
${GAME_OBJECTS}
${UTILITIES}
${UI}
main.cpp
main_window.cpp
Controller/controller.cpp
Controller/ui_controller.cpp
game_view.cpp
constants.cpp
game_scene.cpp
level.cpp)

target_link_libraries(Game Qt::Core Qt::Gui Qt::Widgets)
160 changes: 160 additions & 0 deletions Controller/controller.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
#include "Controller/controller.h"

#include <QPushButton>
#include <QGraphicsProxyWidget>
#include <QApplication>
#include <QTimer>
#include <QTextDocument>
#include <iostream>

#include "GameObjects/Entities/Mobs/Basis/mob.h"
#include "GameObjects/Entities/Mobs/skeleton.h"
#include "GameObjects/Entities/Mobs/hedgehog.h"
#include "GameObjects/Entities/Mobs/cobra.h"
#include "GameObjects/Entities/Mobs/dwarf.h"
#include "GameObjects/explosion.h"
#include "constants.h"
#include "UI/button.h"
#include "UI/linear_menu.h"
#include "UI/padding_box.h"
#include "Utilities/Resources/pixmap_loader.h"

Controller* Controller::instance;

Controller::Controller() :
scene_(new GameScene(Scene::kRect)),
view_(new GameView(scene_)),
tick_timer_(new QTimer(this)),
level_(new Level(1)),
base_hp_(5),
balance_(kStartBalance),
damage_per_current_tick_(0),
resource_displayer_(nullptr) {
SetupScene();
SetupInterface();
LaunchTickTimer();

connect(this, &Controller::GameOver, [this]() {
scene_->addItem(new Dwarf({100, 100}));
// it's needed, but it also blocks close button
// view_->setInteractive(false);
tick_timer_->stop();
QGraphicsTextItem* game_over_item = new QGraphicsTextItem();
game_over_item->setPlainText("Game Over");
QFont font = game_over_item->font();
font.setPixelSize(150);
game_over_item->setFont(font);
game_over_item->setPos(
-game_over_item->boundingRect().width() / 2,
-game_over_item->boundingRect().height() / 2);
game_over_item->setZValue(1000000);
scene_->addItem(game_over_item);
});
}

GameView* Controller::GetView() const {
return view_;
}

GameScene* Controller::GetScene() const {
return scene_;
}

Level* Controller::GetLevel() const {
return level_;
}

void Controller::SetupScene() {
{ // temporary code
TextButton* quit_button = new TextButton({0, 0}, "Quit");
auto quit_button_font = quit_button->GetTextDocument()->defaultFont();
quit_button_font.setPixelSize(20);
quit_button->GetTextDocument()->setDefaultFont(quit_button_font);
quit_button->setPos(
scene_->sceneRect().topRight()
- quit_button->boundingRect().topRight()
- VectorF(5, -5));
connect(quit_button, &TextButton::Clicked, [](){ QApplication::exit(); });
scene_->addItem(quit_button);
} // temporary code end

level_->AddObjectsToScene(scene_);
}

void Controller::LaunchTickTimer() {
tick_timer_->setInterval(1000 / kFPS);
tick_timer_->start();
connect(tick_timer_, &QTimer::timeout, this, &Controller::TickAllTickables);
}

Controller* Controller::Instance() {
if (instance == nullptr) {
instance = new Controller();
}
return instance;
}

void Controller::TickAllTickables() {
// because we don't want to emit GameOver more than one time
assert(base_hp_ > 0);

Time delta = Time(1000 / kFPS);
for (QGraphicsItem* graphics_item : scene_->items()) {
if (Tickable* tickable = dynamic_cast<Tickable*>(graphics_item)) {
// TODO(jansenin): make time dependency(it
// could have been more than 1000/30 ms)
tickable->Tick(delta);
}
}
if (level_->IsTimeForGrow()) {
for (QGraphicsItem* graphics_item : scene_->items()) {
if (Mob* mob = dynamic_cast<Mob*>(graphics_item)) {
mob->TimeToGrow();
}
}
}
level_->Tick(delta);

base_hp_ -= damage_per_current_tick_;
resource_displayer_->SetHp(base_hp_);
damage_per_current_tick_ = 0;
if (base_hp_ <= 0) {
base_hp_ = 0;
emit GameOver();
}
}

void Controller::DealDamageToBase(int damage) {
damage_per_current_tick_ += damage;
}

void Controller::SetupInterface() {
resource_displayer_ = new ResourcesDisplayer();
resource_displayer_->SetMoney(balance_);
resource_displayer_->SetHp(base_hp_);
resource_displayer_->SetOriginPoint(TexturedBox::OriginPoint::kTopLeft);
resource_displayer_->setPos(scene_->sceneRect().topLeft() + VectorF(5, 5));
scene_->addItem(resource_displayer_);
}

void Controller::AddMoney(int money) {
balance_ += money;
resource_displayer_->SetMoney(balance_);
}

void Controller::LoseMoney(int money) {
balance_ -= money;
resource_displayer_->SetMoney(balance_);
}

int Controller::GetBalance() {
return balance_;
}

bool Controller::HaveEnoughMoney(int money) {
if (money > balance_) {
return false;
}
return true;
}

59 changes: 59 additions & 0 deletions Controller/controller.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#pragma once

#include <QObject>
#include <QGraphicsScene>
#include <QGraphicsView>

#include "GameObjects/Interface/entity.h"
#include "GameObjects/coin.h"
#include "game_view.h"
#include "game_scene.h"
#include "level.h"
#include "constants.h"
#include "UI/resource_displayer.h"

class Controller : public QObject {
Q_OBJECT

public:
static Controller* Instance();

[[nodiscard]] GameView* GetView() const;
[[nodiscard]] GameScene* GetScene() const;
[[nodiscard]] Level* GetLevel() const;

void DealDamageToBase(int damage);

void SetupInterface();

void AddMoney(int money);
void LoseMoney(int money);
int GetBalance();
bool HaveEnoughMoney(int money);

signals:
void GameOver();

public slots:
void TickAllTickables();

private:
static Controller* instance;

Controller();

void SetupScene();
void LaunchTickTimer();

void RegulateMoney();

GameScene* scene_;
GameView* view_;
QTimer* tick_timer_;
Level* level_;
int balance_;

int base_hp_;
int damage_per_current_tick_;
ResourcesDisplayer* resource_displayer_;
};
1 change: 1 addition & 0 deletions Controller/ui_controller.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include "ui_controller.h"
3 changes: 3 additions & 0 deletions Controller/ui_controller.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#pragma once

class UIController {};
Loading