Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <time.h>
- #include <stdbool.h>
- #include <SDL.h>
- #include <SDL2_gfxPrimitives.h>
- #define WINDOW_WIDTH 1200
- #define WINDOW_HEIGHT 900
- typedef struct Vector2{
- double x, y;
- }Vector2;
- typedef struct Snow{
- Vector2 pos;
- double vx;
- int r;
- bool dir;
- struct Snow *next;
- }Snow;
- Snow *append (Snow *head, Vector2 pos, int r, double vx) {
- Snow *new;
- new = (Snow*) malloc(sizeof(Snow));
- new->pos.x = pos.x;
- new->pos.y = pos.y;
- new->r = r;
- new->dir = rand()&1;
- if (new->dir == 1) new->vx = vx;
- else new->vx = -vx;
- new->next = NULL;
- if(head == NULL) {
- return new;
- }
- Snow *current = head;
- while (current->next != NULL) {
- // iterates to the end of the list
- current = current->next;
- }
- current->next = new;
- return head;
- }
- Snow *freeSnow_outside (Snow *head) {
- while (head != NULL) {
- if (head->pos.y > head->r + WINDOW_HEIGHT) {
- Snow* tmp = head;
- head = head->next;
- free(tmp);
- } else {
- break;
- }
- }
- return head;
- }
- void freeSnow (Snow *snow) {
- Snow *tmp;
- while (snow != NULL) {
- tmp = snow;
- snow = snow->next;
- free(tmp);
- }
- }
- Snow *generateSnow (Snow *head) {
- // random sugár
- int r = rand() % 5 + 2;
- // random x pozíció az ablakon belül 10px margóval
- Vector2 pos = {(rand() % (WINDOW_WIDTH-10) - 10) + 10, pos.x};
- pos.y = 2*r;
- double vx = (double)r/5;
- head = append(head, pos, r, vx);
- return head;
- }
- Snow *snowFall (Snow *head){
- Snow *current = head;
- while (current != NULL) {
- // iterates to the end of the list
- if (current->dir) // jobbra kezdi
- current->pos.x += cos(current->vx / 20) / 2;
- else // balra kezdi
- current->pos.x -= cos(current->vx / 20) / 2;
- int speed = 6;
- current->pos.y += fabs(sin(current->vx)*speed);
- current->vx ++;
- if (current->vx >= 360)
- current->vx = 0;
- current = current->next;
- }
- return current;
- }
- void drawSnow (SDL_Renderer *renderer, Snow *head, SDL_Color color) {
- Snow *current = head;
- while (current != NULL) {
- // iterates to the end of the list
- filledCircleRGBA(renderer, current->pos.x, current->pos.y, current->r, color.r, color.g, color.b, color.a);
- current = current->next;
- }
- }
- Uint32 timer(Uint32 ms, void *param) {
- SDL_Event event;
- event.type = SDL_USEREVENT;
- SDL_PushEvent(&event);
- return ms;
- }
- int main(int argc, char *argv[]) {
- SDL_Window *window;
- SDL_Event event;
- SDL_Renderer *renderer;
- SDL_Color foreground = {255, 255, 255, 150};
- SDL_Color background = {23, 82, 145, 255};
- SDL_Init(SDL_INIT_EVERYTHING);
- SDL_CreateWindowAndRenderer(WINDOW_WIDTH, WINDOW_HEIGHT, 0, &window, &renderer);
- SDL_SetRenderDrawColor(renderer, background.r, background.g, background.b, background.a);
- SDL_RenderClear(renderer);
- SDL_TimerID id = SDL_AddTimer(20, timer, NULL);
- srand(time(NULL));
- Snow *snow = NULL;
- while (SDL_WaitEvent(&event) && event.type != SDL_QUIT) {
- snow = generateSnow(snow);
- drawSnow(renderer, snow, background);
- snowFall(snow);
- drawSnow(renderer, snow, foreground);
- snow = freeSnow_outside(snow);
- SDL_RenderPresent(renderer);
- SDL_Delay(5);
- }
- freeSnow(snow);
- SDL_RemoveTimer(id);
- SDL_DestroyRenderer(renderer);
- SDL_DestroyWindow(window);
- SDL_Quit();
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement