Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.33 KB | None | 0 0
  1. #include <SDL.h>
  2. #include <SDL_Image.h>
  3. #include <string>
  4. #include <vector>
  5.  
  6. SDL_Surface* Load_Image(std::string filename, bool Color_Key = false, int R=0, int G=0, int B=0);
  7. void Apply_Surface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL);
  8.  
  9.  
  10. #define SCREEN_WIDTH 400
  11. #define SCREEN_HEIGHT 400
  12. #define SCREEN_BPP 32
  13.  
  14. #define CHAR_VELOCITY 5
  15.  
  16. #define FRAMES_PER_SECOND 60
  17.  
  18. SDL_Surface* Screen = NULL;
  19. SDL_Surface* BackGround = NULL;
  20.  
  21.  
  22. enum STATE
  23. {
  24.     E_STATE_STAND,
  25.     E_STATE_WALK_R,
  26.     E_STATE_DEATH,
  27.     E_COUNT
  28. };
  29.  
  30. class Timer
  31. {
  32.     public:
  33.         Timer();
  34.  
  35.         int
  36.             StartTicks,
  37.             PauseTicks;
  38.            
  39.         bool
  40.             Started,
  41.             Paused;
  42.  
  43.         void Start();
  44.         void Stop();
  45.         void Pause();
  46.         void UnPause();
  47.  
  48.         int GetTicks();
  49. };
  50.  
  51. class Character
  52. {
  53.     public:
  54.         Character();
  55.         ~Character();
  56.  
  57.         int
  58.             X,
  59.             Y,
  60.             VX,
  61.             VY,
  62.             Frame;
  63.        
  64.         SDL_Surface* Image;
  65.  
  66.         STATE
  67.             state;
  68.  
  69.         std::vector< std::vector<SDL_Rect> > sprite;
  70.         std::vector<Timer> fps;
  71.  
  72.         void UpdateState(STATE);
  73.  
  74.         int AddFrame(STATE,int,int,int,int);
  75.         int AddFrameEx(STATE,int=0,int=0,int=0,int=0);
  76.  
  77.         void ApplyAnim(SDL_Surface*, int);
  78.  
  79.         SDL_Surface* LoadImage(std::string, bool=false,int=0,int=0,int=0);
  80. };
  81.  
  82. void Character::ApplyAnim(SDL_Surface* Screen, int frames)
  83. {
  84.     if(!fps[state].Started) fps[state].Start();
  85.     if(Frame >= sprite[state].size()) Frame = 0;
  86.  
  87.     bool
  88.         inc = false;
  89.  
  90.     if(fps[state].GetTicks() > 1000/frames)
  91.     {
  92.         fps[state].Start();
  93.         inc = true;
  94.     }
  95.  
  96.     Apply_Surface(X,Y,Image,Screen,&sprite[state][Frame]);
  97.     Frame += (inc) ? (1) : (0);
  98. }
  99.  
  100. SDL_Surface* Character::LoadImage(std::string filename, bool Color_Key, int R, int G, int B)
  101. {
  102.     Image = Load_Image(filename,Color_Key,R,G,B);
  103.     return Image;
  104. }
  105.  
  106. void Character::UpdateState(STATE newstate)
  107. {
  108.     fps[state].Stop();
  109.  
  110.     Frame = 0;
  111.     state = newstate;
  112.    
  113.     fps[state].Start();
  114. }
  115.  
  116. int Character::AddFrameEx(STATE state, int x, int y, int w, int h)
  117. {
  118.     sprite[state].push_back(SDL_Rect());
  119.  
  120.     int
  121.         index = sprite[state].size()-1,
  122.         previous = index-1;
  123.  
  124.     if(!index)
  125.     {
  126.         sprite[state][index].x = x;
  127.         sprite[state][index].y = y;
  128.         sprite[state][index].w = w;
  129.         sprite[state][index].h = h;
  130.        
  131.         return index;
  132.     }
  133.     sprite[state][index].x = sprite[state][previous].x + x;
  134.     sprite[state][index].y = sprite[state][previous].y + y;
  135.     sprite[state][index].w = sprite[state][previous].w + w;
  136.     sprite[state][index].h = sprite[state][previous].h + h;
  137.  
  138.     return index;
  139. }
  140.  
  141. int Character::AddFrame(STATE state, int x, int y, int w, int h)
  142. {
  143.     sprite[state].push_back(SDL_Rect());
  144.  
  145.     int
  146.         index = sprite[state].size()-1;
  147.  
  148.     sprite[state][index].x = x;
  149.     sprite[state][index].y = y;
  150.     sprite[state][index].w = w;
  151.     sprite[state][index].h = h;
  152.  
  153.     return index;
  154. }
  155.  
  156. Character::Character()
  157. {
  158.     Frame = NULL,
  159.     X = NULL,
  160.     Y = NULL,
  161.     VX = NULL,
  162.     VY = NULL,
  163.     Image = NULL,
  164.     state = E_STATE_STAND;
  165.  
  166.     for(int i = 0; i < E_COUNT; i++)
  167.     {
  168.         fps.push_back(Timer());
  169.         sprite.push_back(std::vector<SDL_Rect>());
  170.     }
  171. }
  172.  
  173. Character::~Character()
  174. {
  175.     SDL_FreeSurface(Image);
  176. }
  177.  
  178.  
  179. void Timer::UnPause()
  180. {
  181.     if(Paused)
  182.     {
  183.         Paused = false;
  184.  
  185.         StartTicks = SDL_GetTicks() - PauseTicks;
  186.         PauseTicks = 0;
  187.     }
  188. }
  189.  
  190. void Timer::Pause()
  191. {
  192.     if(Started)
  193.     {
  194.         if(!Paused)
  195.         {
  196.             Paused = true;
  197.             PauseTicks = SDL_GetTicks() - StartTicks;
  198.         }
  199.     }
  200. }
  201.  
  202.  
  203. int Timer::GetTicks()
  204. {
  205.     if(Started)
  206.     {
  207.         if(Paused) return PauseTicks;
  208.  
  209.         return SDL_GetTicks() - StartTicks;
  210.     }
  211.     return 0;
  212. }
  213.  
  214. void Timer::Stop()
  215. {
  216.     Started = false;
  217.     Paused = false;
  218. }
  219.  
  220. void Timer::Start()
  221. {
  222.     Started = true;
  223.     Paused = false;
  224.  
  225.     StartTicks = SDL_GetTicks();
  226. }
  227.  
  228. Timer::Timer()
  229. {
  230.     StartTicks = 0;
  231.     PauseTicks = 0;
  232.     Started = false;
  233.     Paused = false;
  234. }
  235.  
  236. Timer fps;
  237. Character Mario;
  238.  
  239. int main(int argc, char * args[])
  240. {
  241.     if(SDL_Init(SDL_INIT_EVERYTHING) != -1)
  242.     {
  243.         Screen = SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE);
  244.  
  245.         if(Screen)
  246.         {
  247.             SDL_WM_SetCaption("Kyoshiro's SDL tests",NULL);
  248.  
  249.             BackGround = Load_Image("background.jpg");
  250.             Mario.LoadImage("mario.png"); //163 77 77
  251.  
  252.  
  253.             Mario.AddFrame(E_STATE_DEATH, 0,35,40,40);
  254.  
  255.             int pf;
  256.  
  257.             pf = Mario.AddFrame(E_STATE_STAND, 195,265,40,45);
  258.             pf = Mario.AddFrameEx(E_STATE_STAND, Mario.sprite[E_STATE_STAND][pf].w);
  259.             pf = Mario.AddFrameEx(E_STATE_STAND, Mario.sprite[E_STATE_STAND][pf].w);
  260.             pf = Mario.AddFrameEx(E_STATE_STAND, Mario.sprite[E_STATE_STAND][pf].w);
  261.  
  262.             pf = Mario.AddFrame(E_STATE_WALK_R, 318,70,40,45);
  263.             Mario.AddFrame(E_STATE_WALK_R, 200,70,40,45);
  264.             Mario.AddFrame(E_STATE_WALK_R, 358,70,40,45);
  265.  
  266.  
  267.             while(true)
  268.             {
  269.                 SDL_Event Event;
  270.  
  271.                 fps.Start();
  272.  
  273.                 int
  274.                     TX = Mario.X + Mario.VX,
  275.                     TY = Mario.Y + Mario.VY;
  276.  
  277.                 if(!(SCREEN_WIDTH-Mario.sprite[Mario.state][Mario.Frame].w >= TX && TX >= 0))
  278.                 {
  279.                     Mario.X = (TX > 0)?(SCREEN_WIDTH-Mario.sprite[Mario.state][Mario.Frame].w):(0);
  280.                 }
  281.                 else
  282.                 {
  283.                     Mario.X = TX;
  284.                 }
  285.  
  286.                 if(!(SCREEN_HEIGHT-Mario.sprite[Mario.state][Mario.Frame].h >= TY && TY >= 0))
  287.                 {
  288.                     Mario.Y = (TY > 0)?(SCREEN_HEIGHT-Mario.sprite[Mario.state][Mario.Frame].h):(0);
  289.                 }
  290.                 else
  291.                 {
  292.                     Mario.Y = TY;
  293.                 }
  294.  
  295.                 Apply_Surface(0,0,BackGround,Screen);
  296.                 Mario.ApplyAnim(Screen,15);
  297.  
  298.                 SDL_Flip(Screen);
  299.  
  300.                 while(SDL_PollEvent(&Event))
  301.                 {
  302.                     if(Event.type == SDL_KEYUP)
  303.                     {
  304.                         switch(Event.key.keysym.sym)
  305.                         {
  306.                             case SDLK_DOWN: Mario.VY -= CHAR_VELOCITY; break;
  307.                             case SDLK_UP: Mario.VY += CHAR_VELOCITY; break;
  308.                             case SDLK_LEFT: Mario.VX += CHAR_VELOCITY; break;
  309.                             case SDLK_RIGHT: Mario.VX -= CHAR_VELOCITY; break;
  310.                         }
  311.                     }
  312.                     if(Event.type == SDL_KEYDOWN)
  313.                     {
  314.                         switch(Event.key.keysym.sym)
  315.                         {
  316.                             //for testing
  317.                             case SDLK_F1: Mario.UpdateState(E_STATE_WALK_R); break;
  318.                             case SDLK_F2: Mario.UpdateState(E_STATE_STAND); break;
  319.                             case SDLK_F3: Mario.UpdateState(E_STATE_DEATH); break;
  320.  
  321.                             case SDLK_DOWN: Mario.VY += CHAR_VELOCITY; break;
  322.                             case SDLK_UP: Mario.VY -= CHAR_VELOCITY; break;
  323.                             case SDLK_LEFT: Mario.VX -= CHAR_VELOCITY; break;
  324.                             case SDLK_RIGHT: Mario.VX += CHAR_VELOCITY; break;
  325.                         }
  326.                     }
  327.                     if(Event.type == SDL_QUIT)
  328.                     {
  329.                         SDL_FreeSurface(BackGround);
  330.  
  331.                         SDL_Quit();
  332.                         return 1;
  333.                     }
  334.                 }
  335.  
  336.                 if(Mario.Frame >= Mario.sprite[Mario.state].size()) Mario.Frame = 0;
  337.  
  338.                 if(fps.GetTicks() < 1000 / FRAMES_PER_SECOND)
  339.                 {
  340.                     SDL_Delay((1000 / FRAMES_PER_SECOND) - fps.GetTicks());
  341.                 }
  342.  
  343.             }
  344.            
  345.         }
  346.     }
  347.     return 1;
  348. }
  349.  
  350.  
  351. SDL_Surface* Load_Image(std::string filename, bool Color_Key, int R, int G, int B)
  352. {
  353.     SDL_Surface* loadedImage = NULL;
  354.     SDL_Surface* optimizedImage = NULL;
  355.    
  356.     loadedImage = IMG_Load(filename.c_str());
  357.    
  358.     if(loadedImage)
  359.     {
  360.         optimizedImage = SDL_DisplayFormat(loadedImage);
  361.         SDL_FreeSurface(loadedImage);
  362.    
  363.         if(optimizedImage)
  364.         {
  365.             if(Color_Key)
  366.             {
  367.                 Uint32 ColorKey = SDL_MapRGB(optimizedImage->format,R,G,B);
  368.                 SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, ColorKey);
  369.             }
  370.         }
  371.     }
  372.     return optimizedImage;
  373. }
  374.  
  375. void Apply_Surface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip)
  376. {
  377.     SDL_Rect offset;
  378.    
  379.     offset.x = x;
  380.     offset.y = y;
  381.    
  382.     SDL_BlitSurface(source, clip, destination, &offset );
  383. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement