summaryrefslogtreecommitdiffstats
path: root/draw.h
diff options
context:
space:
mode:
authorGentoo <installgentoo@endianness.com>2021-01-06 21:45:09 +1100
committerGentoo <installgentoo@endianness.com>2021-01-06 21:45:09 +1100
commitc7def3172977a8d128ff9882d67e604e480f3499 (patch)
tree43e0202544ac268462bc6b0ac5228512167a71db /draw.h
parentba38b130577b92c33a6ef34fec829b38cd647212 (diff)
downloadnyancat-c7def3172977a8d128ff9882d67e604e480f3499.tar.gz
nyancat-c7def3172977a8d128ff9882d67e604e480f3499.tar.bz2
nyancat-c7def3172977a8d128ff9882d67e604e480f3499.zip
+ported to SDL2 +split cat and rainbow draw calls and functions +/- split cat and rainbow images +/- made rainbows drift off screen +spritesheets are now used instead of individual images +"fixed" indentation +replaced old argument code with getopt +added argument that lets you spawn N cats +/- made scaling work (poor results but no longer crashes) +added option to make cat follow sine wave -removed multi screen code (SDL2 fullscreen only works with one screen)
Diffstat (limited to 'draw.h')
-rw-r--r--draw.h147
1 files changed, 147 insertions, 0 deletions
diff --git a/draw.h b/draw.h
new file mode 100644
index 0000000..ab81617
--- /dev/null
+++ b/draw.h
@@ -0,0 +1,147 @@
+#ifndef DRAW_H
+#define DRAW_H
+
+void add_sparkle(void)
+ {
+ sparkle_instance* new;
+
+ new = ec_malloc(sizeof(sparkle_instance));
+ new->loc.x = SCREEN_WIDTH + 80;
+ new->loc.y = (rand() % (SCREEN_HEIGHT + sparkle_height)) - sparkle_height;
+ new->frame = 0;
+ new->frame_mov = 1;
+ new->speed = 10 + (rand() % 30);
+ new->layer = rand() % 2;
+ list_add(&new->list, &sparkle_list);
+ }
+
+void add_cat(unsigned int x, unsigned int y)
+ {
+ cat_instance* new;
+
+ new = ec_malloc(sizeof(cat_instance));
+ new->loc.x = x;
+ new->loc.y = y;
+ list_add(&new->list, &cat_list);
+ }
+
+void add_rainbow(unsigned int x, unsigned int y)
+ {
+ rainbow_instance* new;
+
+ new = ec_malloc(sizeof(rainbow_instance));
+ new->loc.x = x;
+ new->loc.y = y;
+ new->sprite = rainbow_sprite;
+ list_add(&new->list, &rainbow_list);
+ }
+
+void update_rainbows()
+ {
+ cat_instance *c;
+
+ /* Rainbows need to be placed according to the cat position (which changes constantly) */
+ list_for_each_entry(c, &cat_list, list)
+ {
+ add_rainbow((SCREEN_WIDTH - rainbow_width) / 2 - OFFSET /* Default position in the center */
+ - ((SCREEN_WIDTH - cat_width) / 2 - c->loc.x), /* Plus the amount the cat is off the center */
+ (SCREEN_HEIGHT - rainbow_height) / 2 /* Default position in the center */
+ - ((SCREEN_HEIGHT - cat_height) / 2 - c->loc.y));/* Plus the amount the cat is off the center */
+ }
+
+
+ rainbow_instance *r, *tmpr;
+
+ /* Update the position of each rainbow that exists */
+ list_for_each_entry_safe(r, tmpr, &rainbow_list, list)
+ {
+ r->loc.x -= rainbow_width;
+
+ /* If rainbow if off the screen, delete and free() it */
+ if ((r->loc.x + rainbow_width) < 0)
+ {
+ list_del(&r->list);
+ free(r);
+ }
+ }
+ }
+
+void update_sparkles()
+ {
+
+ sparkle_spawn_counter += rand() % SCREEN_HEIGHT;
+ while (sparkle_spawn_counter >= 1000)
+ {
+ add_sparkle();
+ sparkle_spawn_counter -= 1000;
+ }
+
+ sparkle_instance *s, *tmps;
+ list_for_each_entry_safe(s, tmps, &sparkle_list, list)
+ {
+ s->loc.x -= s->speed;
+ s->frame += s->frame_mov;
+
+ if (s->frame + 1 >= sparkle_count || s->frame < 1){s->frame_mov = 0 - s->frame_mov;}
+
+ if ((s->loc.x + sparkle_width) < 0)
+ {
+ list_del(&s->list);
+ free(s);
+ }
+ }
+ }
+
+void handle_sine()
+ {
+ cat_instance *c;
+
+ list_for_each_entry(c, &cat_list, list)
+ {
+ double pos = (SCREEN_HEIGHT - cat_height)/2 * sin((2*PI*444444)*t);
+ c->loc.y = ((SCREEN_HEIGHT - cat_height)/2 - pos);
+ }
+
+ t += 20;
+ }
+
+void draw_cats()
+ {
+ cat_instance* c;
+
+ list_for_each_entry(c, &cat_list, list)
+ {
+ SDL_Rect srcrect = {cat_sprite * cat_width, 0, cat_width, cat_height};
+ SDL_Rect dstrect = {c->loc.x, c->loc.y, cat_width*cat_size, cat_height*cat_size};
+
+ SDL_RenderCopy(renderer, cat_texture, &srcrect, &dstrect);
+ }
+ }
+
+void draw_rainbows()
+ {
+ rainbow_instance* r;
+
+ list_for_each_entry(r, &rainbow_list, list)
+ {
+ SDL_Rect srcrect = {r->sprite * rainbow_width, 0, rainbow_width, rainbow_height};
+ SDL_Rect dstrect = {r->loc.x, r->loc.y, rainbow_width*cat_size, rainbow_height*cat_size};
+
+ SDL_RenderCopy(renderer, rainbow_texture, &srcrect, &dstrect);
+ }
+ }
+
+void draw_sparkles()
+ {
+ sparkle_instance* s;
+
+ list_for_each_entry(s, &sparkle_list, list)
+ {
+ SDL_Rect srcrect = {sparkle_sprite * sparkle_width, 0, sparkle_width, sparkle_height};
+ SDL_Rect dstrect = {s->loc.x, s->loc.y, sparkle_width*cat_size, sparkle_height*cat_size};
+
+ SDL_RenderCopy(renderer, sparkle_texture, &srcrect, &dstrect);
+ }
+ }
+
+#endif