+ More robust sprite loader.
+ Added ee_set_sprite_frame() and ee_get_sprite_frame().
+ Free all structures in ee_free_sprite().
* src/aliens.c src/bonus.c:
+ Use ee_draw_sprite() instead of our manual sprite rendering.
* src/box.c:
+ Use ee_draw_line() instead of the manual equivalent.
* data/:
+ Added foo_fighter, baz_fighter, item_gem and item_heart sprites.
tags/v0.99.beta14
| @@ -1 +1 @@ | |||||
| EXTRA_DIST = bar_fighter bar_boss | |||||
| EXTRA_DIST = foo_fighter bar_fighter bar_boss baz_fighter item_gem item_heart | |||||
| @@ -0,0 +1,28 @@ | |||||
| 6 3 2 1 | |||||
| __ | |||||
| /oo\ | |||||
| //'`\\ | |||||
| cc | |||||
| ceec | |||||
| cccccc | |||||
| 6 3 2 1 | |||||
| __ | |||||
| /oo\ | |||||
| /(~~)\ | |||||
| cc | |||||
| ceec | |||||
| cccccc | |||||
| 6 3 2 1 | |||||
| __ | |||||
| /oo\ | |||||
| ((^^)) | |||||
| cc | |||||
| ceec | |||||
| cccccc | |||||
| 4 3 1 1 | |||||
| __ | |||||
| /oo\ | |||||
| \\// | |||||
| cc | |||||
| ceec | |||||
| cccc | |||||
| @@ -0,0 +1,29 @@ | |||||
| 7 3 3 1 | |||||
| . , | |||||
| \oXo/ | |||||
| `V' | |||||
| d d | |||||
| deded | |||||
| ddd | |||||
| 9 3 4 1 | |||||
| . , | |||||
| `-oXo-' | |||||
| `V' | |||||
| d d | |||||
| ddededd | |||||
| ddd | |||||
| 9 2 4 0 | |||||
| `--oXo--' | |||||
| `V' | |||||
| dddededdd | |||||
| ddd | |||||
| 9 2 4 0 | |||||
| ,-oXo-. | |||||
| ' V ` | |||||
| ddededd | |||||
| d d d | |||||
| 7 2 3 0 | |||||
| ,oXo. | |||||
| / V \ | |||||
| deded | |||||
| d d d | |||||
| @@ -0,0 +1,14 @@ | |||||
| 3 2 1 1 | |||||
| _ | |||||
| /g\ | |||||
| \_/ | |||||
| c | |||||
| cec | |||||
| ccc | |||||
| 3 2 1 1 | |||||
| _ | |||||
| /g\ | |||||
| \_/ | |||||
| e | |||||
| eee | |||||
| eee | |||||
| @@ -0,0 +1,14 @@ | |||||
| 5 3 2 1 | |||||
| _ _ | |||||
| ( '^) | |||||
| `v' | |||||
| h h | |||||
| hhheh | |||||
| hhh | |||||
| 5 3 2 1 | |||||
| _ _ | |||||
| ( '^) | |||||
| `v' | |||||
| e e | |||||
| eeeee | |||||
| eee | |||||
| @@ -87,6 +87,8 @@ int ee_rand(int, int); | |||||
| int ee_sqrt(int); | int ee_sqrt(int); | ||||
| struct ee_sprite * ee_load_sprite(const char *); | struct ee_sprite * ee_load_sprite(const char *); | ||||
| void ee_set_sprite_frame(struct ee_sprite *, int); | |||||
| int ee_get_sprite_frame(struct ee_sprite *); | |||||
| void ee_draw_sprite(int, int, struct ee_sprite *); | void ee_draw_sprite(int, int, struct ee_sprite *); | ||||
| void ee_free_sprite(struct ee_sprite *); | void ee_free_sprite(struct ee_sprite *); | ||||
| @@ -24,6 +24,7 @@ | |||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <string.h> | |||||
| #include "ee.h" | #include "ee.h" | ||||
| @@ -87,6 +88,8 @@ struct ee_sprite *ee_load_sprite(const char *file) | |||||
| for(y = 0; y < h; y++) | for(y = 0; y < h; y++) | ||||
| { | { | ||||
| memset(buf, ' ', w); | |||||
| buf[w] = '\0'; | |||||
| if(!fgets(buf, BUFSIZ, fd)) | if(!fgets(buf, BUFSIZ, fd)) | ||||
| goto failed; | goto failed; | ||||
| @@ -96,6 +99,8 @@ struct ee_sprite *ee_load_sprite(const char *file) | |||||
| for(y = 0; y < h; y++) | for(y = 0; y < h; y++) | ||||
| { | { | ||||
| memset(buf, ' ', w); | |||||
| buf[w] = '\0'; | |||||
| if(!fgets(buf, BUFSIZ, fd)) | if(!fgets(buf, BUFSIZ, fd)) | ||||
| goto failed; | goto failed; | ||||
| @@ -123,6 +128,19 @@ struct ee_sprite *ee_load_sprite(const char *file) | |||||
| return sprite; | return sprite; | ||||
| } | } | ||||
| void ee_set_sprite_frame(struct ee_sprite *sprite, int f) | |||||
| { | |||||
| if(f < 0 || f >= sprite->nf) | |||||
| return; | |||||
| sprite->f = f; | |||||
| } | |||||
| int ee_get_sprite_frame(struct ee_sprite *sprite) | |||||
| { | |||||
| return sprite->f; | |||||
| } | |||||
| void ee_draw_sprite(int x, int y, struct ee_sprite *sprite) | void ee_draw_sprite(int x, int y, struct ee_sprite *sprite) | ||||
| { | { | ||||
| int i, j; | int i, j; | ||||
| @@ -145,6 +163,16 @@ void ee_draw_sprite(int x, int y, struct ee_sprite *sprite) | |||||
| void ee_free_sprite(struct ee_sprite *sprite) | void ee_free_sprite(struct ee_sprite *sprite) | ||||
| { | { | ||||
| int i; | |||||
| for(i = sprite->nf; i--;) | |||||
| { | |||||
| struct ee_frame *frame = &sprite->frames[i]; | |||||
| free(frame->chars); | |||||
| free(frame->color); | |||||
| } | |||||
| free(sprite->frames); | |||||
| free(sprite); | free(sprite); | ||||
| } | } | ||||
| @@ -30,6 +30,10 @@ static void draw_alien_foo(game *, int, int, int); | |||||
| static void draw_alien_bar(game *, int, int, int); | static void draw_alien_bar(game *, int, int, int); | ||||
| static void draw_alien_baz(game *, int, int, int); | static void draw_alien_baz(game *, int, int, int); | ||||
| struct ee_sprite *foo_sprite; | |||||
| struct ee_sprite *bar_sprite; | |||||
| struct ee_sprite *baz_sprite; | |||||
| void init_aliens(game *g, aliens *al) | void init_aliens(game *g, aliens *al) | ||||
| { | { | ||||
| int i; | int i; | ||||
| @@ -38,6 +42,10 @@ void init_aliens(game *g, aliens *al) | |||||
| { | { | ||||
| al->type[i] = ALIEN_NONE; | al->type[i] = ALIEN_NONE; | ||||
| } | } | ||||
| foo_sprite = ee_load_sprite("data/foo_fighter"); | |||||
| bar_sprite = ee_load_sprite("data/bar_fighter"); | |||||
| baz_sprite = ee_load_sprite("data/baz_fighter"); | |||||
| } | } | ||||
| void draw_aliens(game *g, aliens *al) | void draw_aliens(game *g, aliens *al) | ||||
| @@ -132,130 +140,20 @@ void add_alien(game *g, aliens *al, int x, int y, int type) | |||||
| static void draw_alien_bar(game *g, int x, int y, int frame) | static void draw_alien_bar(game *g, int x, int y, int frame) | ||||
| { | { | ||||
| switch(frame) | |||||
| { | |||||
| case 0: | |||||
| ee_color(EE_MAGENTA); | |||||
| ee_goto(x, y); | |||||
| ee_putstr(",---."); | |||||
| ee_goto(x, y+1); | |||||
| ee_putchar('\\'); | |||||
| ee_color(EE_WHITE); | |||||
| ee_putstr("o O"); | |||||
| ee_color(EE_MAGENTA); | |||||
| ee_putchar('/'); | |||||
| ee_goto(x, y+2); | |||||
| ee_putstr("^^^^^"); | |||||
| break; | |||||
| case 1: | |||||
| ee_color(EE_MAGENTA); | |||||
| ee_goto(x, y); | |||||
| ee_putstr(",---."); | |||||
| ee_goto(x, y+1); | |||||
| ee_putchar('\\'); | |||||
| ee_color(EE_WHITE); | |||||
| ee_putstr("O o"); | |||||
| ee_color(EE_MAGENTA); | |||||
| ee_putchar('/'); | |||||
| ee_goto(x, y+2); | |||||
| ee_putstr("^^^^^"); | |||||
| break; | |||||
| } | |||||
| ee_set_sprite_frame(bar_sprite, frame); | |||||
| ee_draw_sprite(x, y, bar_sprite); | |||||
| } | } | ||||
| static void draw_alien_baz(game *g, int x, int y, int frame) | static void draw_alien_baz(game *g, int x, int y, int frame) | ||||
| { | { | ||||
| ee_color(EE_GREEN); | |||||
| ee_goto(x, y-1); | |||||
| ee_putstr("__"); | |||||
| ee_goto(x-1, y); | |||||
| ee_putchar('/'); | |||||
| ee_goto(x+2, y); | |||||
| ee_putchar('\\'); | |||||
| switch(frame) | |||||
| { | |||||
| case 3: | |||||
| ee_goto(x-2, y+1); | |||||
| ee_putstr("//'`\\\\"); | |||||
| break; | |||||
| case 4: | |||||
| case 2: | |||||
| ee_goto(x-2, y+1); | |||||
| ee_putstr("/(~~)\\"); | |||||
| break; | |||||
| case 5: | |||||
| case 1: | |||||
| ee_goto(x-2, y+1); | |||||
| ee_putstr("((^^))"); | |||||
| break; | |||||
| case 0: | |||||
| ee_goto(x-1, y+1); | |||||
| ee_putstr("\\\\//"); | |||||
| break; | |||||
| } | |||||
| ee_color(EE_WHITE); | |||||
| ee_goto(x, y); | |||||
| ee_putstr("oo"); | |||||
| ee_set_sprite_frame(baz_sprite, frame); | |||||
| ee_draw_sprite(x, y, baz_sprite); | |||||
| } | } | ||||
| static void draw_alien_foo(game *g, int x, int y, int frame) | static void draw_alien_foo(game *g, int x, int y, int frame) | ||||
| { | { | ||||
| ee_color(EE_YELLOW); | |||||
| switch(frame) | |||||
| { | |||||
| case 0: | |||||
| ee_goto(x, y); | |||||
| ee_putchar('.'); | |||||
| ee_goto(x+6, y); | |||||
| ee_putchar(','); | |||||
| ee_goto(x+1, y+1); | |||||
| ee_putstr("\\ X /"); | |||||
| break; | |||||
| case 7: | |||||
| case 1: | |||||
| ee_goto(x-1, y); | |||||
| ee_putchar('.'); | |||||
| ee_goto(x+7, y); | |||||
| ee_putchar(','); | |||||
| ee_goto(x, y+1); | |||||
| ee_putstr("`- X -'"); | |||||
| break; | |||||
| case 6: | |||||
| case 2: | |||||
| ee_goto(x-1, y+1); | |||||
| ee_putstr("`-- X --'"); | |||||
| break; | |||||
| case 5: | |||||
| case 3: | |||||
| ee_goto(x, y+1); | |||||
| ee_putstr(",- X -."); | |||||
| ee_goto(x-1, y+2); | |||||
| ee_putchar('\''); | |||||
| ee_goto(x+7, y+2); | |||||
| ee_putchar('`'); | |||||
| break; | |||||
| case 4: | |||||
| ee_goto(x+1, y+1); | |||||
| ee_putstr(", X ."); | |||||
| ee_goto(x, y+2); | |||||
| ee_putchar('/'); | |||||
| ee_goto(x+6, y+2); | |||||
| ee_putchar('\\'); | |||||
| break; | |||||
| } | |||||
| ee_goto(x+2, y+2); | |||||
| ee_putstr("`V'"); | |||||
| ee_color(EE_WHITE); | |||||
| ee_goto(x+2, y+1); | |||||
| ee_putchar('o'); | |||||
| ee_goto(x+4, y+1); | |||||
| ee_putchar('o'); | |||||
| ee_set_sprite_frame(foo_sprite, frame); | |||||
| ee_draw_sprite(x, y, foo_sprite); | |||||
| } | } | ||||
| @@ -26,6 +26,9 @@ | |||||
| #include "common.h" | #include "common.h" | ||||
| struct ee_sprite *heart_sprite; | |||||
| struct ee_sprite *gem_sprite; | |||||
| void init_bonus(game *g, bonus *bo) | void init_bonus(game *g, bonus *bo) | ||||
| { | { | ||||
| int i; | int i; | ||||
| @@ -34,6 +37,9 @@ void init_bonus(game *g, bonus *bo) | |||||
| { | { | ||||
| bo->type[i] = BONUS_NONE; | bo->type[i] = BONUS_NONE; | ||||
| } | } | ||||
| heart_sprite = ee_load_sprite("data/heart"); | |||||
| gem_sprite = ee_load_sprite("data/gem"); | |||||
| } | } | ||||
| void draw_bonus(game *g, bonus *bo) | void draw_bonus(game *g, bonus *bo) | ||||
| @@ -45,30 +51,12 @@ void draw_bonus(game *g, bonus *bo) | |||||
| switch(bo->type[i]) | switch(bo->type[i]) | ||||
| { | { | ||||
| case BONUS_GREEN: | case BONUS_GREEN: | ||||
| ee_color((bo->n[i]/2 % 3) ? EE_GREEN : EE_WHITE); | |||||
| ee_goto(bo->x[i]+1, bo->y[i]-1); | |||||
| ee_putchar('_'); | |||||
| ee_goto(bo->x[i], bo->y[i]); | |||||
| ee_putstr("/ \\"); | |||||
| ee_goto(bo->x[i], bo->y[i]+1); | |||||
| ee_putstr("\\_/"); | |||||
| ee_color(EE_WHITE); | |||||
| ee_goto(bo->x[i]+1, bo->y[i]); | |||||
| ee_putchar('g'); | |||||
| ee_set_sprite_frame(gem_sprite, (bo->n[i]/2 % 3) ? 0 : 1); | |||||
| ee_draw_sprite(bo->x[i], bo->y[i], gem_sprite); | |||||
| break; | break; | ||||
| case BONUS_LIFE: | case BONUS_LIFE: | ||||
| ee_color((bo->n[i] % 3) ? EE_RED : EE_WHITE); | |||||
| ee_goto(bo->x[i]+1, bo->y[i]-1); | |||||
| ee_putchar('_'); | |||||
| ee_goto(bo->x[i]+3, bo->y[i]-1); | |||||
| ee_putchar('_'); | |||||
| ee_goto(bo->x[i], bo->y[i]); | |||||
| ee_putstr("( ' )"); | |||||
| ee_goto(bo->x[i]+1, bo->y[i]+1); | |||||
| ee_putstr("`v'"); | |||||
| ee_color(EE_WHITE); | |||||
| ee_goto(bo->x[i]+3, bo->y[i]); | |||||
| ee_putchar('^'); | |||||
| ee_set_sprite_frame(heart_sprite, (bo->n[i] % 3) ? 0 : 1); | |||||
| ee_draw_sprite(bo->x[i], bo->y[i], heart_sprite); | |||||
| break; | break; | ||||
| case BONUS_NONE: | case BONUS_NONE: | ||||
| break; | break; | ||||
| @@ -41,60 +41,39 @@ box * create_box(game *g, int x, int y, int w, int h) | |||||
| void draw_box(game *g, box *b) | void draw_box(game *g, box *b) | ||||
| { | { | ||||
| int i, j, frame; | |||||
| int j, frame; | |||||
| ee_color(EE_YELLOW); | ee_color(EE_YELLOW); | ||||
| /* Draw the thin horizontal line */ | /* Draw the thin horizontal line */ | ||||
| if(b->frame < 8) | if(b->frame < 8) | ||||
| { | { | ||||
| for(i = b->x - b->w * b->frame / 16 ; | |||||
| i < b->x + b->w * b->frame / 16 ; | |||||
| i++) | |||||
| { | |||||
| ee_goto(i, b->y); | |||||
| ee_putchar('X'); | |||||
| } | |||||
| ee_draw_line(b->x - b->w * b->frame / 16, b->y, | |||||
| b->x + b->w * b->frame / 16 - 1, b->y, 'X'); | |||||
| return; | return; | ||||
| } | } | ||||
| /* Draw the frame */ | /* Draw the frame */ | ||||
| frame = b->frame < 12 ? b->frame : 12; | frame = b->frame < 12 ? b->frame : 12; | ||||
| for(i = b->x - b->w / 2 ; | |||||
| i < b->x + b->w / 2 ; | |||||
| i++) | |||||
| { | |||||
| ee_goto(i, b->y - b->h * (frame - 8) / 8); | |||||
| ee_putchar('X'); | |||||
| ee_goto(i, b->y + b->h * (frame - 8) / 8); | |||||
| ee_putchar('X'); | |||||
| } | |||||
| ee_draw_line(b->x - b->w / 2, b->y - b->h * (frame - 8) / 8, | |||||
| b->x + b->w / 2 - 1, b->y - b->h * (frame - 8) / 8, 'X'); | |||||
| ee_draw_line(b->x - b->w / 2, b->y + b->h * (frame - 8) / 8, | |||||
| b->x + b->w / 2 - 1, b->y + b->h * (frame - 8) / 8, 'X'); | |||||
| for(j = b->y - b->h * (frame - 8) / 8 ; | |||||
| j < b->y + b->h * (frame - 8) / 8 ; | |||||
| j++) | |||||
| { | |||||
| ee_goto(b->x - b->w / 2, j); | |||||
| ee_putchar('X'); | |||||
| ee_goto(b->x + b->w / 2 - 1, j); | |||||
| ee_putchar('X'); | |||||
| } | |||||
| ee_draw_line(b->x - b->w / 2, b->y - b->h * (frame - 8) / 8, | |||||
| b->x - b->w / 2, b->y + b->h * (frame - 8) / 8 - 1, 'X'); | |||||
| ee_draw_line(b->x + b->w / 2 - 1, b->y - b->h * (frame - 8) / 8, | |||||
| b->x + b->w / 2 - 1, b->y + b->h * (frame - 8) / 8 - 1, 'X'); | |||||
| ee_color(EE_BLACK); | ee_color(EE_BLACK); | ||||
| for(j = b->y - b->h * (frame - 8) / 8 + 1 ; | |||||
| j < b->y + b->h * (frame - 8) / 8 ; | |||||
| for(j = b->y - b->h * (frame - 8) / 8 + 1; | |||||
| j < b->y + b->h * (frame - 8) / 8; | |||||
| j++) | j++) | ||||
| { | { | ||||
| for(i = b->x - b->w / 2 + 1 ; | |||||
| i < b->x + b->w / 2 - 1 ; | |||||
| i++) | |||||
| { | |||||
| ee_goto(i, j); | |||||
| ee_putchar('X'); | |||||
| } | |||||
| ee_draw_line(b->x - b->w / 2 + 1, j, | |||||
| b->x + b->w / 2 - 2, j, 'X'); | |||||
| } | } | ||||
| if(b->frame < 12) | if(b->frame < 12) | ||||