commit 7d797950020279c4d3d8ff1e55ad4f657f531450 Author: Kishan Takoordyal Date: Sun Nov 15 08:47:32 2020 +0400 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..879cc29 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.vscode/ +main.o +sfml-app \ No newline at end of file diff --git a/assets/Arial.ttf b/assets/Arial.ttf new file mode 100644 index 0000000..ab68fb1 Binary files /dev/null and b/assets/Arial.ttf differ diff --git a/assets/background.png b/assets/background.png new file mode 100644 index 0000000..e2b09ea Binary files /dev/null and b/assets/background.png differ diff --git a/assets/damage.ogg b/assets/damage.ogg new file mode 100644 index 0000000..06d3ebc Binary files /dev/null and b/assets/damage.ogg differ diff --git a/assets/enemy.png b/assets/enemy.png new file mode 100644 index 0000000..1046b66 Binary files /dev/null and b/assets/enemy.png differ diff --git a/enemy.cpp b/enemy.cpp new file mode 100644 index 0000000..00f14bb --- /dev/null +++ b/enemy.cpp @@ -0,0 +1,50 @@ +#include +#include "enemy.h" + +Enemy::Enemy(int e) { + energy = e; +} + +bool Enemy::performSetup() { + if (!enemyTexture.loadFromFile("assets/enemy.png")) { + std::cout << "Couldn't load enemy image" << endl; + return false; + } + + enemySprite.setTexture(enemyTexture); + enemySprite.setPosition(sf::Vector2f(225, 400)); + enemySprite.scale(sf::Vector2f(2, 2)); + + if (!attackSoundBuffer.loadFromFile("assets/damage.ogg")) { + std::cout << "Couldn't load enemy audio" << endl; + return false; + } + + attackSound.setBuffer(attackSoundBuffer); + + return true; +} + +void Enemy::draw(sf::RenderWindow *window) { + window->draw(enemySprite); +} + +bool Enemy::checkIfHit(sf::Vector2i mousePos) { + float enemyMinX = enemySprite.getGlobalBounds().left; + float enemyMaxX = enemySprite.getGlobalBounds().width + enemyMinX; + + float enemyMinY = enemySprite.getGlobalBounds().top; + float enemyMaxY = enemySprite.getGlobalBounds().height + enemyMinY; + + float mouseX = mousePos.x; + float mouseY = mousePos.y; + + return mouseX >= enemyMinX && mouseX <= enemyMaxX && mouseY >= enemyMinY && mouseY <= enemyMaxY; +} + +bool Enemy::takeDamage(int damage) { + energy -= damage; + attackSound.play(); + + return energy <= 0; +} diff --git a/enemy.h b/enemy.h new file mode 100644 index 0000000..788c37e --- /dev/null +++ b/enemy.h @@ -0,0 +1,26 @@ +#include +#include +#include + +using namespace std; + +#ifndef ENEMY_H +#define ENEMY_H + +class Enemy { + sf::Texture enemyTexture; + sf::Sprite enemySprite; + sf::SoundBuffer attackSoundBuffer; + sf::Sound attackSound; + + public: + int energy; + Enemy(int); + + bool performSetup(); + bool checkIfHit(sf::Vector2i); + bool takeDamage(int); + void draw(sf::RenderWindow *); +}; + +#endif diff --git a/gameWorld.cpp b/gameWorld.cpp new file mode 100644 index 0000000..6673f6b --- /dev/null +++ b/gameWorld.cpp @@ -0,0 +1,72 @@ +#include "gameWorld.h" +#include "enemy.cpp" +#include "texts.cpp" + +GameWorld::GameWorld(): enemy(100), texts() { + damage = 10; +} + +bool GameWorld::loadBackground() { + if (!backgroundTexture.loadFromFile("assets/background.png")) { + std::cout << "Couldn't load background image" << endl; + return false; + } + + background.setTexture(backgroundTexture); + background.scale(sf::Vector2f(1.6, 2.25)); + + return true; +} + +bool GameWorld::performSetup() { + isGameOver = false; + + enemy = Enemy(100); + texts = Texts(); + + return loadBackground() && enemy.performSetup() && texts.performSetup(); +} + +bool GameWorld::runGame() { + sf::RenderWindow window(sf::VideoMode(1000, 1000), "Point and click game!"); + sf::Clock clock; + + while (window.isOpen()) { + if (!isGameOver) { + time = clock.getElapsedTime(); + } + + sf::Event event; + while (window.pollEvent(event)) + { + if (event.type == sf::Event::Closed) { + window.close(); + return false; + } else if (event.type == sf::Event::MouseButtonPressed) { + if (!isGameOver) { + if (enemy.checkIfHit(sf::Mouse::getPosition(window))) { + isGameOver = enemy.takeDamage(damage);; + } + } + } else if (event.type == sf::Event::KeyPressed) { + if (isGameOver && sf::Keyboard::isKeyPressed(sf::Keyboard::Space)) { + return true; + } + } + } + + window.clear(); + window.draw(background); + + if (!isGameOver) { + enemy.draw(&window); + texts.drawInGameText(&window, time, enemy.energy); + } else { + texts.drawEndGameText(&window, time); + } + + window.display(); + } + + return false; +} diff --git a/gameWorld.h b/gameWorld.h new file mode 100644 index 0000000..162c3a8 --- /dev/null +++ b/gameWorld.h @@ -0,0 +1,32 @@ +#include +#include +#include + +#include "enemy.h" +#include "texts.h" + +using namespace std; + +#ifndef GAMEWORLD_H +#define GAMEWORLD_H + +class GameWorld { + bool isGameOver; + int damage; + + sf::Texture backgroundTexture; + sf::Sprite background; + sf::Time time; + + Enemy enemy; + Texts texts; + + bool loadBackground(); + + public: + GameWorld(); + bool performSetup(); + bool runGame(); +}; + +#endif diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..7442e8d --- /dev/null +++ b/main.cpp @@ -0,0 +1,20 @@ +#include +#include "gameWorld.cpp" + +using namespace std; + +int main() { + while (true) { + GameWorld world = GameWorld(); + + if (!world.performSetup()) { + return 1; + } + + if (!world.runGame()) { + return 0; + } + } + + return 0; +} \ No newline at end of file diff --git a/runningSFML.sh b/runningSFML.sh new file mode 100755 index 0000000..1dc8666 --- /dev/null +++ b/runningSFML.sh @@ -0,0 +1,7 @@ +#! /bin/bash + +SFML=/usr/local/SFML + +g++ -c main.cpp -I $SFML/include +g++ main.o -o sfml-app -L $SFML/lib -lsfml-graphics -lsfml-audio -lsfml-window -lsfml-system +export LD_LIBRARY_PATH=$SFML/lib && ./sfml-app diff --git a/texts.cpp b/texts.cpp new file mode 100644 index 0000000..6c39346 --- /dev/null +++ b/texts.cpp @@ -0,0 +1,48 @@ +#include +#include "texts.h" + +using namespace std; + +Texts::Texts() { + endGameWonText.setString("You won!"); + endGameSpaceText.setString("Press SPACE to play again."); +} + +void Texts::setupText(sf::Text *text, sf::Vector2f position) { + text->setFont(font); + text->setCharacterSize(50); + text->setFillColor(sf::Color::White); + text->setStyle(sf::Text::Bold); + text->setPosition(position); +} + +bool Texts::performSetup() { + if (!font.loadFromFile("assets/Arial.ttf")) { + cout << "Couldn't load font file" << endl; + return false; + } + + setupText(&energyText, sf::Vector2f(650, 800)); + setupText(&timeText, sf::Vector2f(650, 900)); + setupText(&endGameWonText, sf::Vector2f(400, 600)); + setupText(&endGameTimeText, sf::Vector2f(400, 700)); + setupText(&endGameSpaceText, sf::Vector2f(200, 800)); + + return true; +} + +void Texts::drawInGameText(sf::RenderWindow *window, sf::Time time, int energy) { + energyText.setString("Energy: " + to_string(energy)); + timeText.setString("Time: " + to_string((int) time.asSeconds()) + "s"); + + window->draw(energyText); + window->draw(timeText); +} + +void Texts::drawEndGameText(sf::RenderWindow *window, sf::Time time) { + endGameTimeText.setString("Time: " + to_string((int) time.asSeconds()) + "s"); + + window->draw(endGameWonText); + window->draw(endGameTimeText); + window->draw(endGameSpaceText); +} diff --git a/texts.h b/texts.h new file mode 100644 index 0000000..e2c5ef1 --- /dev/null +++ b/texts.h @@ -0,0 +1,24 @@ +#include + +#ifndef TEXTS_H +#define TEXTS_H + +class Texts{ + sf::Font font; + + void setupText(sf::Text *, sf::Vector2f); + + public: + sf::Text energyText; + sf::Text timeText; + sf::Text endGameWonText; + sf::Text endGameTimeText; + sf::Text endGameSpaceText; + Texts(); + + bool performSetup(); + void drawInGameText(sf::RenderWindow *, sf::Time, int); + void drawEndGameText(sf::RenderWindow *, sf::Time); +}; + +#endif