Untitled

mail@pastecode.io avatarunknown
plain_text
2 months ago
5.7 kB
2
Indexable
Never
#include <array>
#include <chrono>
#include <random>
#include <SFML/Graphics.hpp>

#include "Headers/Animation.hpp"
#include "Headers/DrawText.hpp"
#include "Headers/Global.hpp"
#include "Headers/Enemy.hpp"
#include "Headers/EnemyManager.hpp"
#include "Headers/Ufo.hpp"
#include "Headers/Player.hpp"

int main()
{
	bool game_over = 0;
	bool next_level = 0;

	//The current level.
	unsigned short level = 0;
	unsigned short next_level_timer = NEXT_LEVEL_TRANSITION;

	//We'll use this to make the game frame rate independent.
	std::chrono::microseconds lag(0);

	std::chrono::steady_clock::time_point previous_time;

	//Setting a random seed to make sure the random engine will randomly generate random numbers.
	//Random.
	std::mt19937_64 random_engine(std::chrono::system_clock::now().time_since_epoch().count());

	sf::Event event;

	sf::RenderWindow window(sf::VideoMode(SCREEN_RESIZE * SCREEN_WIDTH, SCREEN_RESIZE * SCREEN_HEIGHT), "Space Invaders", sf::Style::Close);
	//Resizing the screen.
	window.setView(sf::View(sf::FloatRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)));

	sf::Sprite background_sprite;
	sf::Sprite powerup_bar_sprite;

	sf::Texture background_texture;
	background_texture.loadFromFile("Resources/Images/Background.png");

	sf::Texture font_texture;
	font_texture.loadFromFile("Resources/Images/Font.png");

	sf::Texture powerup_bar_texture;
	powerup_bar_texture.loadFromFile("Resources/Images/PowerupBar.png");

	EnemyManager enemy_manager;

	Player player;

	Ufo ufo(random_engine);

	background_sprite.setTexture(background_texture);
	powerup_bar_sprite.setTexture(powerup_bar_texture);

	previous_time = std::chrono::steady_clock::now();

	while (1 == window.isOpen())
	{
		//Making the game frame rate independent.
		std::chrono::microseconds delta_time = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - previous_time);

		lag += delta_time;

		previous_time += delta_time;

		while (FRAME_DURATION <= lag)
		{
			lag -= FRAME_DURATION;

			while (1 == window.pollEvent(event))
			{
				switch (event.type)
				{
					case sf::Event::Closed:
					{
						window.close();
					}
				}
			}

			//We're gonna show the "Game over!" text after the player's death animation.
			if (1 == player.get_dead_animation_over())
			{
				game_over = 1;
			}

			if (1 == enemy_manager.reached_player(player.get_y()))
			{
				player.die();
			}

			if (0 == game_over)
			{
				if (0 == enemy_manager.get_enemies().size())
				{
					if (0 == next_level_timer)
					{
						next_level = 0;

						level++;
						next_level_timer = NEXT_LEVEL_TRANSITION;

						player.reset();

						enemy_manager.reset(level);

						ufo.reset(1, random_engine);
					}
					else //Here we're showing the next level transition.
					{
						next_level = 1;

						next_level_timer--;
					}
				}
				else
				{
					player.update(random_engine, enemy_manager.get_enemy_bullets(), enemy_manager.get_enemies(), ufo);

					enemy_manager.update(random_engine);

					ufo.update(random_engine);
				}
			}
			else if (1 == sf::Keyboard::isKeyPressed(sf::Keyboard::Enter))
			{
				game_over = 0;

				level = 0;

				player.reset();

				enemy_manager.reset(level);

				ufo.reset(1, random_engine);
			}

			if (FRAME_DURATION > lag)
			{
				window.clear();

				window.draw(background_sprite);

				//When the player dies, we won't show anything but the player.
				if (0 == player.get_dead())
				{
					enemy_manager.draw(window);

					ufo.draw(window);

					//So much code just to show the duration of the powerup (or power-DOWN!).
					if (0 < player.get_current_power())
					{
						powerup_bar_sprite.setColor(sf::Color(255, 255, 255));
						powerup_bar_sprite.setPosition(SCREEN_WIDTH - powerup_bar_texture.getSize().x - 0.25f * BASE_SIZE, 0.25f * BASE_SIZE);
						powerup_bar_sprite.setTextureRect(sf::IntRect(0, 0, powerup_bar_texture.getSize().x, BASE_SIZE));

						window.draw(powerup_bar_sprite);

						powerup_bar_sprite.setPosition(SCREEN_WIDTH - powerup_bar_texture.getSize().x - 0.125f * BASE_SIZE, 0.25f * BASE_SIZE);
						//Calculating the length of the bar.
						powerup_bar_sprite.setTextureRect(sf::IntRect(0.125f * BASE_SIZE, BASE_SIZE, ceil(player.get_power_timer() * static_cast<float>(powerup_bar_texture.getSize().x - 0.25f * BASE_SIZE) / POWERUP_DURATION), BASE_SIZE));

						switch (player.get_current_power())
						{
							case 1:
							{
								powerup_bar_sprite.setColor(sf::Color(0, 146, 255));

								break;
							}
							case 2:
							{
								powerup_bar_sprite.setColor(sf::Color(255, 0, 0));

								break;
							}
							case 3:
							{
								powerup_bar_sprite.setColor(sf::Color(255, 219, 0));

								break;
							}
							case 4:
							{
								powerup_bar_sprite.setColor(sf::Color(219, 0, 255));
							}
						}

						window.draw(powerup_bar_sprite);
					}
				}

				player.draw(window);

				draw_text(0.25f * BASE_SIZE, 0.25f * BASE_SIZE, "Level: " + std::to_string(level), window, font_texture);

				if (1 == game_over)
				{
					//I was too lazy to add center alignment, so I just wrote numbers instead.
					draw_text(0.5f * (SCREEN_WIDTH - 5 * BASE_SIZE), 0.5f * (SCREEN_HEIGHT - BASE_SIZE), "Game over!", window, font_texture);
				}
				else if (1 == next_level)
				{
					draw_text(0.5f * (SCREEN_WIDTH - 5.5f * BASE_SIZE), 0.5f * (SCREEN_HEIGHT - BASE_SIZE), "Next level!", window, font_texture);
				}

				window.display();
			}
		}
	}
}