From dbb0db2130508d9a2f66d283b8d2848596674a05 Mon Sep 17 00:00:00 2001 From: Nigel Date: Wed, 19 Oct 2022 20:16:07 +0200 Subject: [PATCH] Levels --- .gitattributes | 1 + levels/four.lvl | 6 +++ levels/one.lvl | 8 ++++ levels/three.lvl | 9 +++++ levels/two.lvl | 8 ++++ src/game.cpp | 54 ++++++++++++++++++++++++- src/game.h | 11 +++++ src/gamelevel.cpp | 86 ++++++++++++++++++++++++++++++++++++++++ src/gamelevel.h | 21 ++++++++++ src/gameobject.cpp | 12 ++++++ src/gameobject.h | 23 +++++++++++ textures/background.jpg | 3 ++ textures/block.png | 3 ++ textures/block_solid.png | 3 ++ textures/paddle.png | 3 ++ 15 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 levels/four.lvl create mode 100644 levels/one.lvl create mode 100644 levels/three.lvl create mode 100644 levels/two.lvl create mode 100644 src/gamelevel.cpp create mode 100644 src/gamelevel.h create mode 100644 src/gameobject.cpp create mode 100644 src/gameobject.h create mode 100644 textures/background.jpg create mode 100644 textures/block.png create mode 100644 textures/block_solid.png create mode 100644 textures/paddle.png diff --git a/.gitattributes b/.gitattributes index 24a8e87..1691f22 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ *.png filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text diff --git a/levels/four.lvl b/levels/four.lvl new file mode 100644 index 0000000..1ac8e2d --- /dev/null +++ b/levels/four.lvl @@ -0,0 +1,6 @@ +1 2 1 2 1 2 1 2 1 2 1 2 1 +2 2 2 2 2 2 2 2 2 2 2 2 2 +2 1 3 1 4 1 5 1 4 1 3 1 2 +2 3 3 4 4 5 5 5 4 4 3 3 2 +2 1 3 1 4 1 5 1 4 1 3 1 2 +2 2 3 3 4 4 5 4 4 3 3 2 2 \ No newline at end of file diff --git a/levels/one.lvl b/levels/one.lvl new file mode 100644 index 0000000..8eaa5e7 --- /dev/null +++ b/levels/one.lvl @@ -0,0 +1,8 @@ +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +4 4 4 4 4 0 0 0 0 0 4 4 4 4 4 +4 1 4 1 4 0 0 1 0 0 4 1 4 1 4 +3 3 3 3 3 0 0 0 0 0 3 3 3 3 3 +3 3 1 3 3 3 3 3 3 3 3 3 1 3 3 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ No newline at end of file diff --git a/levels/three.lvl b/levels/three.lvl new file mode 100644 index 0000000..086cf4b --- /dev/null +++ b/levels/three.lvl @@ -0,0 +1,9 @@ +0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 2 0 0 0 0 0 0 0 2 0 0 +0 0 0 2 0 0 0 0 0 2 0 0 0 +0 0 0 5 5 5 5 5 5 5 0 0 0 +0 0 5 5 0 5 5 5 0 5 5 0 0 +0 5 5 5 5 5 5 5 5 5 5 5 0 +0 3 0 1 1 1 1 1 1 1 0 3 0 +0 3 0 3 0 0 0 0 0 3 0 3 0 +0 0 0 0 4 4 0 4 4 0 0 0 0 \ No newline at end of file diff --git a/levels/two.lvl b/levels/two.lvl new file mode 100644 index 0000000..cad795f --- /dev/null +++ b/levels/two.lvl @@ -0,0 +1,8 @@ +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 0 5 5 0 5 5 0 5 5 0 5 5 0 1 +1 5 5 5 5 5 5 5 5 5 5 5 5 5 1 +1 0 3 3 0 3 3 0 3 3 0 3 3 0 1 +1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 +1 0 2 2 0 2 2 0 2 2 0 2 2 0 1 +1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 +1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 \ No newline at end of file diff --git a/src/game.cpp b/src/game.cpp index 7bef586..2b58d82 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -15,6 +15,14 @@ Game::Game(unsigned int width, unsigned int height) } +// Initial size of the player paddle +const glm::vec2 PLAYER_SIZE (100.0f, 20.0f); +// Initial velocity of the player paddle +const float PLAYER_VELOCITY(500.0f); +GameObject* player; + + + void Game::Init() { // Load shaders @@ -27,12 +35,44 @@ void Game::Init() Renderer = new SpriteRenderer(ResourceManager::GetShader("sprite")); // load textures ResourceManager::LoadTexture("textures/awesomeface.png", true, "face"); + ResourceManager::LoadTexture("textures/background.jpg", false, "background"); + ResourceManager::LoadTexture("textures/block.png", false, "block"); + ResourceManager::LoadTexture("textures/block_solid.png", false, "block_solid"); + ResourceManager::LoadTexture("textures/paddle.png", true, "paddle"); + // Load levels + GameLevel one; one.Load("levels/one.lvl", this->Width, this->Height / 2); + GameLevel two; two.Load("levels/two.lvl", this->Width, this->Height / 2); + GameLevel three; three.Load("levels/three.lvl", this->Width, this->Height / 2); + GameLevel four; four.Load("levels/four.lvl", this->Width, this->Height / 2); + this->Levels.push_back(one); + this->Levels.push_back(two); + this->Levels.push_back(three); + this->Levels.push_back(four); + this->Level = 0; + + glm::vec2 playerPos = glm::vec2(this->Width /2 - PLAYER_SIZE.x /2.0f, + this->Height - PLAYER_SIZE.y); + player = new GameObject(playerPos, PLAYER_SIZE, ResourceManager::GetTexture("paddle")); + } void Game::ProcessInput(float dt) { - + if(this->State == GAME_ACTIVE) + { + float velocity = PLAYER_VELOCITY * dt; + if( this->Keys[GLFW_KEY_A]) + { + if(player->Position.x >= 0.0f) + player->Position.x -= velocity; + } + if( this->Keys[GLFW_KEY_D]) + { + if(player->Position.x <= this->Width - player->Size.x) + player->Position.x += velocity; + } + } } @@ -43,5 +83,15 @@ void Game::Update(float dt) void Game::Render() { - Renderer->DrawSprite(ResourceManager::GetTexture("face"), glm::vec2(200.0f, 200.0f), glm::vec2(300.0f, 400.0f), 45.0f, glm::vec3(0.0f, 1.0f,0.0f)); + if(this->State == GAME_ACTIVE) + { + // draw background + Renderer->DrawSprite(ResourceManager::GetTexture("background"), + glm::vec2(0.0f, 0.0f), glm::vec2(this->Width, this->Height), 0.0f); + + // draw level + this->Levels[this->Level].Draw(*Renderer); + + player->Draw(*Renderer); + } } \ No newline at end of file diff --git a/src/game.h b/src/game.h index 63acc7c..b7996e3 100644 --- a/src/game.h +++ b/src/game.h @@ -1,6 +1,11 @@ #pragma once +#include +#include +#include +#include #include "spriterenderer.h" #include "resourcemanager.h" +#include "gamelevel.h" // Represent the curreent state of the game enum GameState { @@ -14,6 +19,12 @@ class Game { GameState State; bool Keys[1024]; unsigned int Width, Height; + + std::vector Levels; + unsigned int Level; + + + // constructor / destructor Game(unsigned int width, unsigned int height); ~Game(); diff --git a/src/gamelevel.cpp b/src/gamelevel.cpp new file mode 100644 index 0000000..4104baf --- /dev/null +++ b/src/gamelevel.cpp @@ -0,0 +1,86 @@ +#include "gamelevel.h" +#include +#include + +void GameLevel::Load(const char* file, unsigned int levelWidth, unsigned int levelHeight) +{ + // clear old data + this->Bricks.clear(); + //load from file + unsigned int tileCode; + GameLevel level; + std::string line; + std::ifstream fstream(file); + std::vector> tileData; + + if(fstream) + { + while(std::getline(fstream, line)) + { + std::istringstream sstream(line); + std::vector row; + while (sstream >> tileCode) + row.push_back(tileCode); + tileData.push_back(row); + } + if (tileData.size() > 0) + this->init(tileData, levelWidth, levelHeight); + } +} + +void GameLevel::init(std::vector> tileData, unsigned int lvlWidth, unsigned int lvlHeight) +{ + // calculate dimensions + unsigned int height = tileData.size(); + unsigned int width = tileData[0].size(); + float unit_width = lvlWidth / static_cast(width); + float unit_height = lvlHeight / height; + // initialize level tiles based on tiledata + for (unsigned int y = 0; y < height; ++y) + { + for(unsigned int x = 0; x < width; ++x) + { + // Check block type from level data + if(tileData[y][x] == 1) // solid + { + glm::vec2 pos(unit_width * x, unit_height * y); + glm::vec2 size(unit_width, unit_height); + GameObject obj(pos, size, ResourceManager::GetTexture("block_solid"), glm::vec3(0.8f, 0.8f, 0.7f)); + + obj.IsSolid = true; + this->Bricks.push_back(obj); + } + else if(tileData[y][x] > 1) + { + glm::vec3 color = glm::vec3(1.0f); + if (tileData[y][x] == 2) + color = glm::vec3(0.2f, 0.6f, 1.0f); + else if (tileData[y][x] == 3) + color = glm::vec3(0.0f, 0.7f, 0.0f); + else if (tileData[y][x] == 4) + color = glm::vec3(0.8f, 0.8f, 0.4f); + else if (tileData[y][x] == 5) + color = glm::vec3(1.0f, 0.5f, 0.0f); + + glm::vec2 pos(unit_width * x, unit_height * y); + glm::vec2 size(unit_width , unit_height ); + this->Bricks.push_back(GameObject(pos, size, ResourceManager::GetTexture("block"), color)); + } + } + } +} + +void GameLevel::Draw(SpriteRenderer& renderer) +{ + for(GameObject& tile : this->Bricks) + if(!tile.Destroyed) + tile.Draw(renderer); +} + +bool GameLevel::IsCompleted() +{ + for (GameObject& tile : this->Bricks) + if(!tile.IsSolid && !tile.Destroyed) + return false; + return true; +} \ No newline at end of file diff --git a/src/gamelevel.h b/src/gamelevel.h new file mode 100644 index 0000000..04b4b6d --- /dev/null +++ b/src/gamelevel.h @@ -0,0 +1,21 @@ +#pragma once +#include +#include "gameobject.h" +#include "resourcemanager.h" + +class GameLevel +{ + public: + std::vector Bricks; + // constructor + GameLevel(){} + // loads level from file + void Load (const char* file, unsigned int levelWidth, unsigned int levelHeight); + // render level + void Draw(SpriteRenderer& renderer); + // Check if the level is completed (all non-solid tiles are destroyed) + bool IsCompleted(); + private: + // initialize level from tile data + void init(std::vector> tileData, unsigned int levelWidth, unsigned int levelHeight); +}; \ No newline at end of file diff --git a/src/gameobject.cpp b/src/gameobject.cpp new file mode 100644 index 0000000..615b2ae --- /dev/null +++ b/src/gameobject.cpp @@ -0,0 +1,12 @@ +#include "gameobject.h" + +GameObject::GameObject() + : Position(0.0f, 0.0f), Size(1.0f, 1.0f), Velocity(0.0f), Color(1.0f), Rotation(0.0f), Sprite(), IsSolid(false), Destroyed(false) { } + +GameObject::GameObject(glm::vec2 pos, glm::vec2 size, Texture2D sprite, glm::vec3 color, glm::vec2 velocity) + : Position(pos), Size(size), Velocity(velocity), Color(color), Rotation(0.0f), Sprite(sprite), IsSolid(false), Destroyed(false) { } + +void GameObject::Draw(SpriteRenderer &renderer) +{ + renderer.DrawSprite(this->Sprite, this->Position, this->Size, this->Rotation, this->Color); +} \ No newline at end of file diff --git a/src/gameobject.h b/src/gameobject.h new file mode 100644 index 0000000..9e3d981 --- /dev/null +++ b/src/gameobject.h @@ -0,0 +1,23 @@ +#pragma once +#include +#include + +#include "texture2d.h" +#include "spriterenderer.h" + +class GameObject +{ + public: + glm::vec2 Position, Size, Velocity; + glm::vec3 Color; + float Rotation; + bool IsSolid; + bool Destroyed; + // Render state + Texture2D Sprite; + // Constructor + GameObject(); + GameObject(glm::vec2 pos, glm::vec2 size, Texture2D sprite, glm::vec3 color = glm::vec3(1.0f), glm::vec2 Velocity = glm::vec2(0.0f, 0.0f)); + // draw sprite + virtual void Draw(SpriteRenderer& renderer); +}; diff --git a/textures/background.jpg b/textures/background.jpg new file mode 100644 index 0000000..35a0e78 --- /dev/null +++ b/textures/background.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8bb5cd64e935f4aa39919ae2b1742ebe3190486c84ef6e3c09e14666470c5ca +size 305312 diff --git a/textures/block.png b/textures/block.png new file mode 100644 index 0000000..7ac01f2 --- /dev/null +++ b/textures/block.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6be998394d8c237879c35ff35329c373b12a72027d9dbcd16e9b8d4246714a4e +size 23287 diff --git a/textures/block_solid.png b/textures/block_solid.png new file mode 100644 index 0000000..8ab4a39 --- /dev/null +++ b/textures/block_solid.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f44f1d4ff7c3230fb3283f19e63e7f692b8b6eb63f393e90282d258e2d160f3 +size 48658 diff --git a/textures/paddle.png b/textures/paddle.png new file mode 100644 index 0000000..c120646 --- /dev/null +++ b/textures/paddle.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20242526e3e7d354104fbcf543873ca008f0addc593fb7a887dec84c2b51edc4 +size 33561