Advertisement
Guest User

Untitled

a guest
Jul 20th, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <SDL.h>
  2. #include <SDL_image.h>
  3.  
  4. typedef enum Type {
  5.     PLAYER1, PLAYER2, BULLET
  6. } Type;
  7.  
  8. typedef struct Entity {
  9.     SDL_Texture *texture;
  10.     Type type;
  11.     float x, y, w, h;
  12. } Entity;
  13.  
  14. typedef struct Bullet {
  15.     Entity e;
  16.     int lifeTime;
  17. } Bullet;
  18.  
  19. typedef struct Node {
  20.     Entity e;
  21.     struct Node *next;
  22. } Node;
  23.  
  24. Entity* addEntity(Node **head, float x, float y, float w, float h, SDL_Texture *texture, Type type) {
  25.     Node *new;
  26.     new = malloc(sizeof(Node));
  27.     new->e.x = x;
  28.     new->e.y = y;
  29.     new->e.w = w;
  30.     new->e.h = h;
  31.     new->e.type = type;
  32.     new->e.texture = texture;
  33.     new->next = *head;
  34.     if (type == BULLET) {
  35.         ((Bullet*)new)->lifeTime = 500;
  36.     }
  37.     *head = new;
  38.     return &(*head)->e;
  39. }
  40.  
  41. void removeEntity(Node **head, Entity *e) {
  42.     if (*head == NULL) {
  43.         return;
  44.     }
  45.     if (&(*head)->e == e) {
  46.         Node *tempnext = (*head)->next;
  47.         SDL_DestroyTexture((*head)->e.texture);
  48.         free(*head);
  49.         *head = tempnext;
  50.         return;
  51.     }
  52.     Node *temp = *head;
  53.     Node *previous = *head;
  54.     while (temp != NULL) {
  55.         if (&temp->e == e) {
  56.             previous->next = temp->next;
  57.             SDL_DestroyTexture(temp->e.texture);
  58.             free(&(*temp));
  59.             return;
  60.         }
  61.         previous = temp;
  62.         temp = temp->next;
  63.     }
  64. }
  65.  
  66. int main(int argc, char **argv) {
  67.     int running = 1;
  68.     SDL_Event event;
  69.  
  70.     SDL_Init(SDL_INIT_EVERYTHING);
  71.     IMG_Init(IMG_INIT_PNG);
  72.  
  73.     SDL_Window *window = SDL_CreateWindow("Hello, SDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_OPENGL);
  74.  
  75.     SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  76.  
  77.     SDL_Surface *crab = IMG_Load("crab.png");
  78.     SDL_Surface *cmder = IMG_Load("cmder.png");
  79.  
  80.     SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
  81.    
  82.     Node *head = NULL;
  83.  
  84.     addEntity(&head, 32, 32, 160, 128, SDL_CreateTextureFromSurface(renderer, crab), PLAYER1);
  85.     addEntity(&head, 256, 256, 160, 128, SDL_CreateTextureFromSurface(renderer, cmder), PLAYER2);
  86.  
  87.     while (running) {
  88.         while (SDL_PollEvent(&event)) {
  89.             if (event.type == SDL_QUIT) {
  90.                 running = 0;
  91.             }
  92.         }
  93.  
  94.         SDL_RenderClear(renderer);
  95.         const Uint8 *state = SDL_GetKeyboardState(NULL);
  96.  
  97.         if (state[SDL_SCANCODE_ESCAPE]) {
  98.             running = 0;
  99.         }
  100.  
  101.         Node *tmp = head;
  102.         while (tmp != NULL) {
  103.             if (state[SDL_SCANCODE_SPACE]) {
  104.                 if (tmp->e.type == PLAYER1) {
  105.                     addEntity(&head, tmp->e.x, tmp->e.y, 16, 16, SDL_CreateTextureFromSurface(renderer, cmder), BULLET);
  106.                 }
  107.             }
  108.             if (tmp->e.type == BULLET) {
  109.                 tmp->e.x += 4;
  110.                 SDL_Log("%d", ((Bullet*) (&tmp->e))->lifeTime);
  111.             }
  112.             SDL_Rect dst = {tmp->e.x, tmp->e.y, tmp->e.w, tmp->e.h};
  113.             SDL_RenderCopy(renderer, tmp->e.texture, NULL, &dst);
  114.             tmp = tmp->next;
  115.         }
  116.  
  117.         SDL_RenderPresent(renderer);
  118.     }
  119.  
  120.     SDL_FreeSurface(crab);
  121.     SDL_FreeSurface(cmder);
  122.     SDL_DestroyRenderer(renderer);
  123.     SDL_DestroyWindow(window);
  124.     IMG_Quit();
  125.     SDL_Quit();
  126.  
  127.     return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement