Advertisement
Guest User

Hoeses

a guest
Dec 12th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.67 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <time.h>
  3. #include <stdbool.h>
  4. #include <SDL.h>
  5. #include <SDL2_gfxPrimitives.h>
  6. #define WINDOW_WIDTH 1200
  7. #define WINDOW_HEIGHT 900
  8.  
  9. typedef struct Vector2{
  10.     double x, y;
  11. }Vector2;
  12.  
  13. typedef struct Snow{
  14.     Vector2 pos;
  15.     double vx;
  16.     int r;
  17.     bool dir;
  18.     struct Snow *next;
  19. }Snow;
  20.  
  21. Snow *append (Snow *head, Vector2 pos, int r, double vx) {
  22.     Snow *new;
  23.     new = (Snow*) malloc(sizeof(Snow));
  24.     new->pos.x = pos.x;
  25.     new->pos.y = pos.y;
  26.     new->r = r;
  27.     new->dir = rand()&1;
  28.     if (new->dir == 1) new->vx = vx;
  29.     else new->vx = -vx;
  30.     new->next = NULL;
  31.  
  32.     if(head == NULL) {
  33.         return new;
  34.     }
  35.  
  36.     Snow *current = head;
  37.     while (current->next != NULL) {
  38.         // iterates to the end of the list
  39.         current = current->next;
  40.     }
  41.     current->next = new;
  42.     return head;
  43. }
  44.  
  45. Snow *freeSnow_outside (Snow *head) {
  46.     while (head != NULL) {
  47.         if (head->pos.y > head->r + WINDOW_HEIGHT) {
  48.             Snow* tmp = head;
  49.             head = head->next;
  50.             free(tmp);
  51.         } else {
  52.             break;
  53.         }
  54.     }
  55.     return head;
  56. }
  57.  
  58. void freeSnow (Snow *snow) {
  59.     Snow *tmp;
  60.     while (snow != NULL) {
  61.         tmp = snow;
  62.         snow = snow->next;
  63.         free(tmp);
  64.     }
  65. }
  66.  
  67. Snow *generateSnow (Snow *head) {
  68.     // random sugár
  69.     int r = rand() % 5 + 2;
  70.     // random x pozíció az ablakon belül 10px margóval
  71.     Vector2 pos = {(rand() % (WINDOW_WIDTH-10) - 10) + 10, pos.x};
  72.     pos.y = 2*r;
  73.     double vx = (double)r/5;
  74.  
  75.     head = append(head, pos, r, vx);
  76.     return head;
  77. }
  78.  
  79. Snow *snowFall (Snow *head){
  80.     Snow *current = head;
  81.     while (current != NULL) {
  82.         // iterates to the end of the list
  83.  
  84.         if (current->dir) // jobbra kezdi
  85.             current->pos.x += cos(current->vx / 20) / 2;
  86.         else // balra kezdi
  87.             current->pos.x -= cos(current->vx / 20) / 2;
  88.  
  89.         int speed = 6;
  90.         current->pos.y += fabs(sin(current->vx)*speed);
  91.         current->vx ++;
  92.         if (current->vx >= 360)
  93.             current->vx = 0;
  94.  
  95.         current = current->next;
  96.     }
  97.     return current;
  98. }
  99.  
  100. void drawSnow (SDL_Renderer *renderer, Snow *head, SDL_Color color) {
  101.     Snow *current = head;
  102.     while (current != NULL) {
  103.         // iterates to the end of the list
  104.         filledCircleRGBA(renderer, current->pos.x, current->pos.y, current->r, color.r, color.g, color.b, color.a);
  105.         current = current->next;
  106.     }
  107. }
  108.  
  109. Uint32 timer(Uint32 ms, void *param) {
  110.     SDL_Event event;
  111.     event.type = SDL_USEREVENT;
  112.     SDL_PushEvent(&event);
  113.     return ms;
  114. }
  115.  
  116. int main(int argc, char *argv[]) {
  117.     SDL_Window *window;
  118.     SDL_Event event;
  119.     SDL_Renderer *renderer;
  120.  
  121.     SDL_Color foreground = {255, 255, 255, 150};
  122.     SDL_Color background = {23, 82, 145, 255};
  123.  
  124.     SDL_Init(SDL_INIT_EVERYTHING);
  125.     SDL_CreateWindowAndRenderer(WINDOW_WIDTH, WINDOW_HEIGHT, 0, &window, &renderer);
  126.     SDL_SetRenderDrawColor(renderer, background.r, background.g, background.b, background.a);
  127.     SDL_RenderClear(renderer);
  128.     SDL_TimerID id = SDL_AddTimer(20, timer, NULL);
  129.  
  130.     srand(time(NULL));
  131.     Snow *snow = NULL;
  132.  
  133.     while (SDL_WaitEvent(&event) && event.type != SDL_QUIT) {
  134.         snow = generateSnow(snow);
  135.         drawSnow(renderer, snow, background);
  136.         snowFall(snow);
  137.         drawSnow(renderer, snow, foreground);
  138.         snow = freeSnow_outside(snow);
  139.         SDL_RenderPresent(renderer);
  140.         SDL_Delay(5);
  141.     }
  142.     freeSnow(snow);
  143.     SDL_RemoveTimer(id);
  144.     SDL_DestroyRenderer(renderer);
  145.     SDL_DestroyWindow(window);
  146.     SDL_Quit();
  147.     return EXIT_SUCCESS;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement