+ 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); | |||
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_free_sprite(struct ee_sprite *); | |||
@@ -24,6 +24,7 @@ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include "ee.h" | |||
@@ -87,6 +88,8 @@ struct ee_sprite *ee_load_sprite(const char *file) | |||
for(y = 0; y < h; y++) | |||
{ | |||
memset(buf, ' ', w); | |||
buf[w] = '\0'; | |||
if(!fgets(buf, BUFSIZ, fd)) | |||
goto failed; | |||
@@ -96,6 +99,8 @@ struct ee_sprite *ee_load_sprite(const char *file) | |||
for(y = 0; y < h; y++) | |||
{ | |||
memset(buf, ' ', w); | |||
buf[w] = '\0'; | |||
if(!fgets(buf, BUFSIZ, fd)) | |||
goto failed; | |||
@@ -123,6 +128,19 @@ struct ee_sprite *ee_load_sprite(const char *file) | |||
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) | |||
{ | |||
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) | |||
{ | |||
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); | |||
} | |||
@@ -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_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) | |||
{ | |||
int i; | |||
@@ -38,6 +42,10 @@ void init_aliens(game *g, aliens *al) | |||
{ | |||
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) | |||
@@ -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) | |||
{ | |||
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) | |||
{ | |||
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) | |||
{ | |||
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" | |||
struct ee_sprite *heart_sprite; | |||
struct ee_sprite *gem_sprite; | |||
void init_bonus(game *g, bonus *bo) | |||
{ | |||
int i; | |||
@@ -34,6 +37,9 @@ void init_bonus(game *g, bonus *bo) | |||
{ | |||
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) | |||
@@ -45,30 +51,12 @@ void draw_bonus(game *g, bonus *bo) | |||
switch(bo->type[i]) | |||
{ | |||
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; | |||
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; | |||
case BONUS_NONE: | |||
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) | |||
{ | |||
int i, j, frame; | |||
int j, frame; | |||
ee_color(EE_YELLOW); | |||
/* Draw the thin horizontal line */ | |||
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; | |||
} | |||
/* Draw the frame */ | |||
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); | |||
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++) | |||
{ | |||
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) | |||