From df7e3b878cff7e772db8e498aa2ff5e48b0658f5 Mon Sep 17 00:00:00 2001 From: Nedko Boshkilov Date: Sun, 16 Mar 2014 13:43:02 +0200 Subject: [PATCH] adding main source files --- source/main.cpp | 299 +++++++++++++++++++++++++++++++++++++++ source/mainfunctions.cpp | 36 +++++ source/mainfunctions.h | 12 ++ 3 files changed, 347 insertions(+) create mode 100644 source/main.cpp create mode 100644 source/mainfunctions.cpp create mode 100644 source/mainfunctions.h diff --git a/source/main.cpp b/source/main.cpp new file mode 100644 index 0000000..33b585c --- /dev/null +++ b/source/main.cpp @@ -0,0 +1,299 @@ +#include "SDL/SDL.h" +#include "SDL/SDL_image.h" +#include "SDL/SDL_ttf.h" +#include "SDL/SDL_mixer.h" + +#include "point.h" +#include "entities.h" +#include "projectiles.h" +#include "mainfunctions.h" + +#include +#include +#include + +const int SCREEN_WIDTH = 640; +const int SCREEN_HEIGHT = 480; +const int SCREEN_BPP = 32; +const int FRAMES_PER_SECOND = 60; + +SDL_Surface *screen = NULL; +SDL_Surface *map = NULL; +SDL_Surface *player = NULL; +SDL_Surface *bullet = NULL; +SDL_Event event; +TTF_Font *font = NULL; +Mix_Chunk *bulletSound = NULL; +SDL_Rect playerSlice[8]; + +Player playerObject; +std::vector bulletObjects; + +bool init() +{ + if(SDL_Init(SDL_INIT_EVERYTHING)==-1) + { + return false; + } + + screen = SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE); + + if(screen == NULL) + { + return false; + } + if(TTF_Init()==-1) + { + return false; + } + if(Mix_OpenAudio(22050,MIX_DEFAULT_FORMAT,2,4096)==-1) + { + return false; + } + + SDL_WM_SetCaption("Some Shooter Mooter", NULL); + + return true; +} + +bool load_files() +{ + player=load_image("player.tga",true); + map=load_image("example_map.tga"); + font=TTF_OpenFont("tf2professor.ttf",30); + bullet=load_image("bullet.tga",true); + bulletSound=Mix_LoadWAV("bullet.wav"); + if((player->w)!=(player->h)) + { + return false; + } + if((bullet->w)!=(bullet->h)) + { + return false; + } + if(((bullet->w)%2)!=0) + { + return false; + } + if(((player->w)%6)!=0) + { + return false; + } + if(map==NULL) + { + return false; + } + if(player==NULL) + { + return false; + } + if(font==NULL) + { + return false; + } + if(bullet==NULL) + { + return false; + } + + int playerSize=(player->w)/3; + + playerSlice[0].x=playerSize; + playerSlice[0].y=0; + playerSlice[0].w=playerSize; + playerSlice[0].h=playerSize; + + playerSlice[1].x=2*playerSize; + playerSlice[1].y=0; + playerSlice[1].w=playerSize; + playerSlice[1].h=playerSize; + + playerSlice[2].x=2*playerSize; + playerSlice[2].y=playerSize; + playerSlice[2].w=playerSize; + playerSlice[2].h=playerSize; + + playerSlice[3].x=2*playerSize; + playerSlice[3].y=2*playerSize; + playerSlice[3].w=playerSize; + playerSlice[3].h=playerSize; + + playerSlice[4].x=playerSize; + playerSlice[4].y=2*playerSize; + playerSlice[4].w=playerSize; + playerSlice[4].h=playerSize; + + playerSlice[5].x=0; + playerSlice[5].y=2*playerSize; + playerSlice[5].w=playerSize; + playerSlice[5].h=playerSize; + + playerSlice[6].x=0; + playerSlice[6].y=playerSize; + playerSlice[6].w=playerSize; + playerSlice[6].h=playerSize; + + playerSlice[7].x=0; + playerSlice[7].y=0; + playerSlice[7].w=playerSize; + playerSlice[7].h=playerSize; + + Point temp((playerSize/2),(playerSize/2)); + Point temp2(map->w,map->h); + + playerObject.init(temp,playerSize,0,temp2); + + if(bulletSound==NULL) + { + return false; + } + + return true; +} + +void cleanup() +{ + SDL_FreeSurface(map); + SDL_FreeSurface(player); + + for(std::vector::iterator it=bulletObjects.begin();it!=bulletObjects.end();) + { + delete *it; + bulletObjects.erase(it); + } + Mix_FreeChunk(bulletSound); + TTF_CloseFont(font); + Mix_CloseAudio(); + TTF_Quit(); + SDL_Quit(); +} + +int main(int argc, char* args[]) +{ + bool quit=false; + int moveDirection; + Uint8 *keyStates=SDL_GetKeyState(NULL); + + Uint32 moveTimer = 0; + Uint32 fps = 0; + Uint32 shootTimer = 0; + + if(init()==false) + { + return 1; + } + if(load_files()==false) + { + return 1; + } + + while(quit==false) + { + fps=SDL_GetTicks(); + while(SDL_PollEvent(&event)) + { + if(event.type==SDL_QUIT) + { + quit=true; + } + } + + if((SDL_GetTicks()-moveTimer)>=50) + { + if(keyStates[SDLK_w]&&(!keyStates[SDLK_a])&&(!keyStates[SDLK_s])&&(!keyStates[SDLK_d])) + { + moveTimer=SDL_GetTicks(); + moveDirection=0; + } + else if(keyStates[SDLK_w]&&(!keyStates[SDLK_a])&&(!keyStates[SDLK_s])&&(keyStates[SDLK_d])) + { + moveTimer=SDL_GetTicks(); + moveDirection=1; + } + else if(!keyStates[SDLK_w]&&(!keyStates[SDLK_a])&&(!keyStates[SDLK_s])&&(keyStates[SDLK_d])) + { + moveTimer=SDL_GetTicks(); + moveDirection=2; + } + else if(!keyStates[SDLK_w]&&(!keyStates[SDLK_a])&&(keyStates[SDLK_s])&&(keyStates[SDLK_d])) + { + moveTimer=SDL_GetTicks(); + moveDirection=3; + } + else if(!keyStates[SDLK_w]&&(!keyStates[SDLK_a])&&(keyStates[SDLK_s])&&(!keyStates[SDLK_d])) + { + moveTimer=SDL_GetTicks(); + moveDirection=4; + } + else if(!keyStates[SDLK_w]&&(keyStates[SDLK_a])&&(keyStates[SDLK_s])&&(!keyStates[SDLK_d])) + { + moveTimer=SDL_GetTicks(); + moveDirection=5; + } + else if(!keyStates[SDLK_w]&&(keyStates[SDLK_a])&&(!keyStates[SDLK_s])&&(!keyStates[SDLK_d])) + { + moveTimer=SDL_GetTicks(); + moveDirection=6; + } + else if(keyStates[SDLK_w]&&(keyStates[SDLK_a])&&(!keyStates[SDLK_s])&&(!keyStates[SDLK_d])) + { + moveTimer=SDL_GetTicks(); + moveDirection=7; + } + else + { + moveDirection=-1; + } + } + if(keyStates[SDLK_ESCAPE]) + { + quit=true; + } + if(SDL_GetTicks()-shootTimer>=250) + { + if(keyStates[SDLK_SPACE]) + { + shootTimer=SDL_GetTicks(); + Point temp(map->w,map->h); + bulletObjects.push_back(new Bullet(playerObject,0,temp,bullet->w)); + if(Mix_PlayChannel(-1,bulletSound,0)==-1) + { + return 1; + } + } + } + + SDL_FillRect(screen,&screen->clip_rect,SDL_MapRGB(screen->format,0x00,0x00,0x00)); + if(moveDirection!=-1) + { + playerObject.movePlayer(moveDirection); + } + + apply_surface(((SCREEN_WIDTH/2)-((playerObject.getPosition()).getX())),((SCREEN_HEIGHT/2)-((playerObject.getPosition()).getY())),map,screen); + + for(std::vector::iterator it=bulletObjects.begin();it!=bulletObjects.end();it++) + { + apply_surface((((SCREEN_WIDTH/2)-((playerObject.getPosition().getX())-((*(*it)).getPosition().getX())))-((*(*it)).getSize()/2)),(((SCREEN_HEIGHT/2)-((playerObject.getPosition().getY())-((*(*it)).getPosition().getY())))-((*(*it)).getSize()/2)),bullet,screen); + if((*(*it)).hitScan()==true) + { + delete *it; + bulletObjects.erase(it); + it--; + } + } + + apply_surface((SCREEN_WIDTH/2)-(player->w/6),((SCREEN_HEIGHT/2)-(player->h/6)),player,screen,&playerSlice[playerObject.getDirection()]); + + if(SDL_Flip(screen)==-1) + { + return 1; + } + if((SDL_GetTicks()-fps)<(1000/FRAMES_PER_SECOND)) + { + SDL_Delay((1000/FRAMES_PER_SECOND)-(SDL_GetTicks()-fps)); + } + } + + cleanup(); + return 0; +} diff --git a/source/mainfunctions.cpp b/source/mainfunctions.cpp new file mode 100644 index 0000000..baf743c --- /dev/null +++ b/source/mainfunctions.cpp @@ -0,0 +1,36 @@ +#include "mainfunctions.h" + +SDL_Surface *load_image(std::string filename, bool alpha) +{ + SDL_Surface* loadedImage = NULL; + SDL_Surface* optimizedImage = NULL; + + loadedImage = IMG_Load(filename.c_str()); + if(loadedImage!=NULL) + { + optimizedImage = SDL_DisplayFormat(loadedImage); + if(optimizedImage!=NULL) + { + if(alpha==false) + { + optimizedImage = SDL_DisplayFormat(loadedImage); + } + else + { + optimizedImage = SDL_DisplayFormatAlpha(loadedImage); + } + } + SDL_FreeSurface(loadedImage); + } + return optimizedImage; +} + +void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip) +{ + SDL_Rect offset; + + offset.x = x; + offset.y = y; + + SDL_BlitSurface(source,clip,destination,&offset); +} diff --git a/source/mainfunctions.h b/source/mainfunctions.h new file mode 100644 index 0000000..94241d4 --- /dev/null +++ b/source/mainfunctions.h @@ -0,0 +1,12 @@ +#include + +#include "SDL/SDL.h" +#include "SDL/SDL_image.h" + +#ifndef MAINFUNCTIONS_H_ +#define MAINFUNCTIONS_H_ + +SDL_Surface *load_image(std::string filename, bool alpha=false); +void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL); + +#endif