Guest User

Untitled

a guest
Jan 12th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.36 KB | None | 0 0
  1. typedef enum {
  2.     IDLE,
  3.     MWEST,
  4.     MEAST,
  5.     MNORTH,
  6.     MSOUTH,
  7.     FIRING
  8. } action;
  9.  
  10. typedef struct gamestate {
  11.     int x, y;
  12.     action act;
  13.  
  14.     keyseq **seqs;
  15.     unsigned int seqcount;
  16. } gamestate;
  17.  
  18. typedef struct keyseq {
  19.     SDLKey *key;
  20.     unsigned int max;
  21.     unsigned int counter;
  22.     void (*action)(void);
  23. } keyseq;
  24.  
  25. keyseq *initkeyseq(SDLKey *key, unsigned int length, void (*action)(void)) {
  26.     keyseq *seq;
  27.  
  28.     if(key == NULL)
  29.         return(NULL);
  30.  
  31.     seq = malloc(sizeof(keyseq));
  32.     if(seq == NULL)
  33.         return(NULL);
  34.  
  35.     seq->max = length;
  36.     seq->counter = 0;
  37.     seq->action = action;
  38.  
  39.     seq->key = malloc(sizeof(SDLKey) * length);
  40.     if(seq->key == NULL) {
  41.         free(seq);
  42.         return(NULL);
  43.     }
  44.  
  45.     memcpy(seq->key, key, sizeof(SDLKey) * length);
  46.  
  47.     return(seq);
  48. }
  49.  
  50. void freekeyseq(keyseq *seq) {
  51.     free(seq->key);
  52.     free(seq);
  53. }
  54.  
  55. void resetkeyseq(keyseq *seq) {
  56.     seq->counter = 0;
  57. }
  58.  
  59. unsigned int updatekeyseq(keyseq *seq, SDLKey key) {
  60.     unsigned int remain;
  61.  
  62.     if(seq->key[counter] == key)
  63.         seq->counter++;
  64.  
  65.     remain = seq->max - seq->counter;
  66.     if(remain == 0) {
  67.         resetkeyseq(seq);
  68.         if(seq->action != NULL)
  69.             seq->action();
  70.         return(0);
  71.     }
  72.  
  73.     return(remain);
  74. }
  75.  
  76. unsigned int handleinput(gamestate *state) {
  77.     SDL_Event ev;
  78.     unsigned int i;
  79.  
  80.     while(SDL_PollEvent(&ev)) {
  81.         switch(ev.type) {
  82.             case SDL_KEYDOWN:
  83.                 switch(ev.key.keysym.sym) {
  84.                     case SDLK_UP:
  85.                         state->action = MNORTH;
  86.                         break;
  87.                     case SDLK_DOWN:
  88.                         state->action = MSOUTH;
  89.                         break;
  90.                     case SDLK_LEFT:
  91.                         state->action = MWEST;
  92.                         break;
  93.                     case SDLK_RIGHT:
  94.                         state->action = MEAST;
  95.                         break;
  96.                     default:
  97.                         break;
  98.                 }
  99.                 break;
  100.             case SDL_KEYUP:
  101.                 switch(ev.key.keysym.sym) {
  102.                     case SDLK_UP:
  103.                         if(state->action == MNORTH)
  104.                             state->action = IDLE;
  105.                         break;
  106.                     case SDLK_DOWN:
  107.                         if(state->action == MSOUTH)
  108.                             state->action = IDLE;
  109.                         break;
  110.                     case SDLK_LEFT:
  111.                         if(state->action == MWEST)
  112.                             state->action = IDLE;
  113.                         break;
  114.                     case SDLK_RIGHT:
  115.                         if(state->action == MEAST)
  116.                             state->action = IDLE;
  117.                         break;
  118.                     default:
  119.                         break;
  120.                 }
  121.                 for(i = 0; i < state->seqcount; i++) {
  122.                     if(updatekeyseq(state->seq[i], ev.key.keysym.sym) == 0)
  123.                         fprintf(debug, "Key sequence %u caught.\n", i);
  124.                 }
  125.                 break;
  126.             default:
  127.                 break;
  128.         }
  129.     }
  130.  
  131.     return(0);
  132. }
Add Comment
Please, Sign In to add comment