diff --git a/src/Audio.cpp b/src/Audio.cpp index 25fb7b6..9749022 100644 --- a/src/Audio.cpp +++ b/src/Audio.cpp @@ -5,7 +5,6 @@ void Audio::update() { auto cmd = pop(); - std::cout << "Playing sound: " + std::to_string(cmd->soundId) << std::endl; // use volume, soundId to play sound delete cmd; diff --git a/src/Event.h b/src/Event.h index 3ecbdff..139fd4c 100644 --- a/src/Event.h +++ b/src/Event.h @@ -58,6 +58,7 @@ struct WallJumpEvent : GameEvent { }; struct WallCrashEvent : GameEvent { + double wallHeight = 0; Player * player = nullptr; }; diff --git a/src/FileManager.cpp b/src/FileManager.cpp index 2ae8e1e..501be0f 100644 --- a/src/FileManager.cpp +++ b/src/FileManager.cpp @@ -1,5 +1,6 @@ #include "FileManager.h" #include +#include void FileManager::update() { auto cmd = pop(); @@ -14,17 +15,24 @@ void FileManager::readFile(const std::string &path, const std::functionpath = path; cmd->content = content; + cmd->append = append; push(cmd); } +FileManager * FileManager::instance = new FileManager; + void FileReadCommand::execute() { } void FileWriteCommand::execute() { - + std::ofstream out; + auto mode = append ? std::ios_base::app : std::ios_base::out; + out.open(path, mode); + out << content; + out.close(); } diff --git a/src/FileManager.h b/src/FileManager.h index c626cf3..32b2df5 100644 --- a/src/FileManager.h +++ b/src/FileManager.h @@ -14,12 +14,14 @@ struct FileReadCommand : FileCommand { struct FileWriteCommand : FileCommand { std::string content; + bool append; void execute() override; }; class FileManager : private Queue{ void update() override; public: + static FileManager * instance; void readFile(const std::string &path, const std::function &readCallback); - void writeFile(const std::string &path, const std::string &content); + void writeFile(const std::string &path, const std::string &content, bool append=false); }; \ No newline at end of file diff --git a/src/Game.cpp b/src/Game.cpp index c61ad92..8d39976 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -2,6 +2,7 @@ #include "Game.h" #include "InputWindow.h" #include "Window.h" +#include "Logger.h" #include void Game::draw(QPixmap &output) { @@ -64,6 +65,7 @@ Game::Game() { for (auto & spec : spectators) Game::eventQueue->registerListener(&spec); InputWindow::inputQueue->registerListener(&player); + Game::eventQueue->registerListener(new Logger); instance = this; } diff --git a/src/Logger.cpp b/src/Logger.cpp new file mode 100644 index 0000000..dbb7a61 --- /dev/null +++ b/src/Logger.cpp @@ -0,0 +1,23 @@ +#include "Logger.h" +#include "FileManager.h" + +#define MAX_STRING 100 +constexpr int eventStringMax = 6; + +void Logger::OnCoinCollected(CoinCollectEvent *event) { + char buffer[MAX_STRING]; + sprintf(buffer, "Game event: %*s | time: %6.2f | value: %d\n", eventStringMax, "Coin", event->time, event->value); + FileManager::instance->writeFile("log.txt", buffer, true); +} + +void Logger::OnWallJumped(WallJumpEvent *event) { + char buffer[MAX_STRING]; + sprintf(buffer, "Game event: %*s | time: %6.2f | wall_height: %6.2f\n", eventStringMax, "Jump", event->time, event->wallHeight); + FileManager::instance->writeFile("log.txt", buffer, true); +} + +void Logger::OnWallCrashed(WallCrashEvent *event) { + char buffer[MAX_STRING]; + sprintf(buffer, "Game event: %*s | time: %6.2f | wall_height: %6.2f\n", eventStringMax, "Crash", event->time, event->wallHeight); + FileManager::instance->writeFile("log.txt", buffer, true); +} diff --git a/src/Logger.h b/src/Logger.h new file mode 100644 index 0000000..d3e9fa2 --- /dev/null +++ b/src/Logger.h @@ -0,0 +1,10 @@ +#pragma once + +#include "Listener.h" + +class Logger : public GameListener{ +protected: + void OnCoinCollected(CoinCollectEvent * event) override; + void OnWallJumped(WallJumpEvent * event) override; + void OnWallCrashed(WallCrashEvent * event) override; +}; diff --git a/src/Player.cpp b/src/Player.cpp index 5994ca3..1d38d97 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -41,6 +41,7 @@ void Player::update(float dTime, std::vector &walls, std::vector& co wall.failed = true; auto e = new WallCrashEvent; e->time = Game::instance->eTime; + e->wallHeight = wall.size.height(); e->player = this; Game::eventQueue->submitEvent(e); }