diff --git a/Enemy.cpp b/Enemy.cpp new file mode 100644 index 0000000..e4aff37 --- /dev/null +++ b/Enemy.cpp @@ -0,0 +1,4 @@ +#include"Enemy.hpp" + +Enemy::Enemy(const char* texturesheet, SDL_Renderer* renderer, int x, int y, int vel) :GameObject::GameObject(texturesheet, renderer, x, y, vel) +{} diff --git a/Enemy.hpp b/Enemy.hpp new file mode 100644 index 0000000..78d8086 --- /dev/null +++ b/Enemy.hpp @@ -0,0 +1,13 @@ +#pragma once +#include"GameObject.hpp" + +class Enemy : public GameObject +{ +protected: + int animationFlag; +public: + Enemy(const char* texturesheet, SDL_Renderer* renderer, int x, int y, int vel); + virtual void animation() = 0; + virtual void movement() = 0; +}; + diff --git a/Enemy1.cpp b/Enemy1.cpp new file mode 100644 index 0000000..aa62502 --- /dev/null +++ b/Enemy1.cpp @@ -0,0 +1,26 @@ +#include"Enemy1.hpp" +#include + +Enemy1::Enemy1(const char*texturesheet,SDL_Renderer* ren,int x,int y,int vel):Enemy::Enemy(texturesheet,ren,x,y,vel){} + +void Enemy1::movement() +{ + this->MoveObj(-enemyspeed, 0); +} + +void Enemy1::animation() +{ + if (SDL_GetTicks() % 500 <= 28 && SDL_GetTicks() % 500 >= 15) + { + if (animationFlag == 0) + { + this->animate("enemy_standing2.png", renderer); + animationFlag = 1; + } + else + { + this->animate("enemy_standing.png", renderer); + animationFlag = 0; + } + } +} diff --git a/Enemy1.hpp b/Enemy1.hpp new file mode 100644 index 0000000..4af5f88 --- /dev/null +++ b/Enemy1.hpp @@ -0,0 +1,11 @@ +#pragma once +#include"Enemy.hpp" +class Enemy1 : public Enemy +{ +private: + int enemyspeed = 2; +public: + Enemy1(const char* texturesheet, SDL_Renderer* ren, int x, int y, int vel); + void animation(); + void movement(); +}; \ No newline at end of file diff --git a/Enemy2.cpp b/Enemy2.cpp new file mode 100644 index 0000000..ca0bdb7 --- /dev/null +++ b/Enemy2.cpp @@ -0,0 +1,42 @@ +#include"Enemy2.hpp" + +Enemy2::Enemy2(const char* texturesheet, SDL_Renderer* ren, int x, int y, int vel) :Enemy::Enemy(texturesheet, ren, x, y, vel) {}; + + +void Enemy2::movement() +{ + if (movingUp==0 && this->get_ypos()<=450) + { + this->MoveObj(-enemyspeed, enemyUpSpeed); + } + else if (movingUp == 0 && this->get_ypos() > 450) + { + movingUp = 1; + } + else if(movingUp==1 && this->get_ypos()>=50) + { + this->MoveObj(-enemyspeed, -enemyUpSpeed); + } + + else if (movingUp == 1 && this->get_ypos() < 50) + { + movingUp = 0; + } +} + +void Enemy2::animation() +{ + if (SDL_GetTicks() % 500 <= 28 && SDL_GetTicks() % 500 >= 15) + { + if (animationFlag == 0) + { + this->animate("enemy2.png", renderer); + animationFlag = 1; + } + else + { + this->animate("enemy2_2.png", renderer); + animationFlag = 0; + } + } +} \ No newline at end of file diff --git a/Enemy2.hpp b/Enemy2.hpp new file mode 100644 index 0000000..797b124 --- /dev/null +++ b/Enemy2.hpp @@ -0,0 +1,15 @@ +#pragma once +#include"Enemy.hpp" +class Enemy2 : public Enemy +{ +private: + int enemyspeed = 2; + int enemyUpSpeed = 2; + int movingUp = 0; //0->moving down, 1->moving up +public: + Enemy2(const char* texturesheet, SDL_Renderer* ren, int x, int y, int vel); + + void animation(); + void movement(); + +}; diff --git a/Enemy3.cpp b/Enemy3.cpp new file mode 100644 index 0000000..caa251a --- /dev/null +++ b/Enemy3.cpp @@ -0,0 +1,46 @@ +#include"Enemy3.hpp" + +Enemy3::Enemy3(const char* texturesheet, SDL_Renderer* ren, int x, int y, int vel) :Enemy::Enemy(texturesheet, ren, x, y, vel) {}; + + +void Enemy3::movement() +{ + if (SDL_GetTicks() % 1000 <= 28 && SDL_GetTicks() % 500 >= 15) + { + this->set_ypos(100 + rand() % 400); + } + if (movingUp == 0 && this->get_ypos() <= 450) + { + this->MoveObj(-enemyspeed, enemyUpSpeed); + } + else if (movingUp == 0 && this->get_ypos() > 450) + { + movingUp = 1; + } + else if (movingUp == 1 && this->get_ypos() >= 50) + { + this->MoveObj(-enemyspeed, -enemyUpSpeed); + } + + else if (movingUp == 1 && this->get_ypos() < 50) + { + movingUp = 0; + } +} + +void Enemy3::animation() +{ + if (SDL_GetTicks() % 500 <= 28 && SDL_GetTicks() % 500 >= 15) + { + if (animationFlag == 0) + { + this->animate("enemy3.png", renderer); + animationFlag = 1; + } + else + { + this->animate("enemy3_2.png", renderer); + animationFlag = 0; + } + } +} \ No newline at end of file diff --git a/Enemy3.hpp b/Enemy3.hpp new file mode 100644 index 0000000..2844f55 --- /dev/null +++ b/Enemy3.hpp @@ -0,0 +1,15 @@ +#pragma once +#include"Enemy.hpp" +class Enemy3 : public Enemy +{ +private: + int enemyspeed = 2; + int enemyUpSpeed = 2; + int movingUp = 0; //0->moving down, 1->moving up +public: + Enemy3(const char* texturesheet, SDL_Renderer* ren, int x, int y, int vel); + + void animation(); + void movement(); + +}; diff --git a/Game.cpp b/Game.cpp new file mode 100644 index 0000000..08962f5 --- /dev/null +++ b/Game.cpp @@ -0,0 +1,301 @@ +#include"Game.hpp" +#include"TextureManager.hpp" +#include"Player.hpp" +#include"Enemy.hpp" +#include"Enemy1.hpp" +#include"Enemy2.hpp" +#include"Enemy3.hpp" +#include"bullet.hpp" +#include + +SDL_Event Game::event; +int score=0; +Player* player; +Enemy1* enemy1; +Enemy2* enemy2; +Enemy3* enemy3; +bullet* bullets; + +//list of enemies +vector enemy; + + +//constructor-destructor +Game::Game(int w,int l):screenWidth(w),screenLength(l){} +Game::~Game(){}; + +//main functions +bool Game::running(){return isRunning;} + +void Game::init(const char* title,int x_coord,int y_coord,int width,int height,bool fullscreen) +{ + int flag = 0; + if (fullscreen) { flag = SDL_WINDOW_FULLSCREEN; } + + if (SDL_Init(SDL_INIT_EVERYTHING) == 0) + { + cout << "Initialized" << endl; + window = SDL_CreateWindow("Dragon", x_coord, y_coord, width, height, flag); + if (window) + {cout << "Window Created" << endl;} + + renderer = SDL_CreateRenderer(window, -1, 0); + if (renderer) + { + SDL_SetRenderDrawColor(renderer, 255, 255 , 255, 255); + cout << "Renderer Created" << endl; + } + + isRunning = true; + } + else + { + isRunning = false; + } + + //background image + backgroundTex = TextureManager::LoadTexture("background.png", renderer); + cout<<"background texture loaded"<< endl; + + //Creating player + player=new Player(renderer,5); + cout<<"player created"<get_xpos()MoveObj(player->get_velocity(),0); + player->animate("goku_movingright.png",renderer); + break; + } + else + { + player->animate("goku_standing.png",renderer); + break; + } + case SDLK_LEFT: + if(player->get_xpos()>0) + { + player->MoveObj(-(player->get_velocity()),0); + player->animate("goku_movingleft.png",renderer); + break; + } + else + { + player->animate("goku_standing.png",renderer); + break; + } + case SDLK_UP: + if(player->get_ypos()>0) + { + player->MoveObj(0,-(player->get_velocity())); + player->animate("goku_movingup.png",renderer); + break; + } + else + { + player->animate("goku_standing.png",renderer); + break; + } + case SDLK_DOWN: + if(player->get_ypos()MoveObj(0,player->get_velocity()); + player->animate("goku_movingdown.png",renderer); + break; + } + else + { + player->animate("goku_standing.png",renderer); + break; + } + + //shooting bullets + case SDLK_SPACE: + if(bulletFlag==0) + { + //bullets=new bullet("bullet.png",renderer,screenWidth+500,screenWidth+500,bulletSpeed); + player->animate("goku_shooting.png",renderer); + bullets->set_xpos(player->get_xpos()+50); + bullets->set_ypos(player->get_ypos()+25); + bulletFlag=1; + } + break; + + //PowerUp + case SDLK_p: + if (powerFlag == 0) + { + player->animate("goku_power.png", renderer); + player->set_velocity(playerSpeed * 3); + powerFlag = 1; + break; + } + else if (powerFlag == 1) + { + player->animate("goku_standing.png", renderer); + player->set_velocity(playerSpeed); + powerFlag = 0; + } + + //Restart Screen + case SDLK_r: + if (enemyFlag == 2) + { + enemyFlag = 0; + actEnemy = 0; + score = 0; + player->set_xpos(50); + player->set_ypos(screenWidth/2); + backgroundTex = TextureManager::LoadTexture("background.png", renderer); + } + } + break; + case SDL_KEYUP: + if(powerFlag==1) + { + player->animate("goku_power.png",renderer); + break; + } + player->animate("goku_standing.png",renderer); + break; + } + + //moving the bullets + if(bulletFlag==1&&bullets) + { + bullets->MoveObj(bulletSpeed,0); + if(bullets->get_xpos()>=screenLength)//if bullet reaches end of screen + { + bulletFlag=0; + bullets->set_xpos(screenLength+500); + } + } + + //spawning enemies + if(enemyFlag==0) + { + enemy[actEnemy]->set_xpos(700); + enemy[actEnemy]->set_ypos(100+rand()%400); + enemyFlag=1; + } + + //enemy movement + if(enemyFlag==1) + { + enemy[actEnemy]->movement(); + enemy[actEnemy]->animation(); + } + + //collision between enemy and bullet + if ((abs(bullets->get_xpos() - enemy[actEnemy]->get_xpos()) <= 10 && abs(bullets->get_ypos() - enemy[actEnemy]->get_ypos()-40) <= 40)) + { + score+=10; + + //Selecting enemy type + if (score >= 10 && score<20) + { + actEnemy = 1; + enemy[0]->set_xpos(screenLength + 500); + enemy[0]->set_ypos(screenWidth + 500); + } + + else if (score >= 20 && score <=50) + { + actEnemy = 2; + enemy[1]->set_xpos(screenLength + 500); + enemy[1]->set_ypos(screenWidth + 500); + } + + else + { + actEnemy = 0; + enemy[2]->set_xpos(screenLength + 500); + enemy[2]->set_ypos(screenWidth + 500); + } + cout<<"Score="<set_ypos(screenWidth + 500); + enemy[actEnemy]->set_xpos(screenLength + 500); + bulletFlag = 0; + bullets->set_xpos(screenLength + 500); + enemyFlag = 0; + } + + //enemy player collision && enemy reaching end of screen + if(enemy[actEnemy]->get_xpos()<=10 || (abs(player->get_xpos()-enemy[actEnemy]->get_xpos())<=40 && abs(player->get_ypos()-enemy[actEnemy]->get_ypos())<=40)) + { + cout<<"you lost"<set_xpos(screenLength+500); + enemy[actEnemy]->set_ypos(screenWidth+500); + player->set_xpos(screenLength+500); + player->set_ypos(screenLength+500); + bulletFlag=0; //remove bullet from screen + enemyFlag=2; + backgroundTex=TextureManager::LoadTexture("game_over.jpg",renderer); + } +} + +void Game::update() +{ + player->Update(110,76); + enemy1->Update(106,66); + enemy2->Update(120,98); + enemy3->Update(125, 118); + if(bullets) + bullets->Update(30,32); +} + +void Game::render() +{ + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, backgroundTex, NULL, NULL); + player->Render(); + enemy1->Render(); + enemy2->Render(); + enemy3->Render(); + if(bullets) bullets->Render(); + SDL_RenderPresent(renderer); + +} + +void Game::clean() +{ + SDL_DestroyWindow(window); + SDL_DestroyRenderer(renderer); + SDL_Quit(); + cout<<"Cleaned"< +#include +#include +#include + +using namespace std; + +class Game +{ +private: + bool isRunning; + int screenWidth, screenLength; + int playerSpeed = 5; + int bulletSpeed = 20; + int enemySpeed = 2; + int actEnemy = 0; + int bulletFlag, powerFlag, enemyFlag,animationFlag; + Uint32 frameStart; + SDL_Window* window; + SDL_Renderer* renderer; + SDL_Texture* backgroundTex; + +public: + Game(int w, int l); + ~Game(); + + void init(const char* title, int x_coord, int y_coord, int width, int height, bool fullscreen); + void events(); + void update(); + void render(); + void clean(); + bool running(); + + static SDL_Event event; +}; diff --git a/GameObject.cpp b/GameObject.cpp index 8180d56..deaece0 100644 --- a/GameObject.cpp +++ b/GameObject.cpp @@ -37,4 +37,8 @@ void GameObject::Update(int srch,int srcw) void GameObject::Render() { SDL_RenderCopy(renderer,objTexture,&src_rect,&dst_rect); +} +GameObject::~GameObject() +{ + cout<<"gameobject destroyed"<