# HG changeset patch # User Paul Boddie # Date 1541886006 -3600 # Node ID 2cf83f9160baa9fba13abbb1111ae0f6420aa67c # Parent f1ce70172578685b93718dc1d3c5c4584fd369a8 Introduced a simplified sprite variant for convenience. diff -r f1ce70172578 -r 2cf83f9160ba examples/vga/main.c --- a/examples/vga/main.c Sat Nov 10 22:11:32 2018 +0100 +++ b/examples/vga/main.c Sat Nov 10 22:40:06 2018 +0100 @@ -281,6 +281,7 @@ static void setup(void) { + SpriteOverwriting(scr, &screendata, &display_config, SOURCE_YSTEP); int frame; for (frame = 0; frame < display_config.frames; frame++) @@ -291,12 +292,10 @@ /* Plot the image centred on the screen. */ - display_copy(&display_config, screendata.image, - screendata.width, screendata.height, - SOURCE_YSTEP, - (display_config.line_length - screendata.width) / 2, - (display_config.line_count - (screendata.height / SOURCE_YSTEP)) / 2, - -1, 1); + image_plot_sprite(&scr, + (display_config.line_length - scr.image->width) / 2, + (display_config.line_count - (scr.image->height / scr.yscale)) / 2, + -1); /* Write a sequence of characters. */ diff -r f1ce70172578 -r 2cf83f9160ba include/image.h --- a/include/image.h Sat Nov 10 22:11:32 2018 +0100 +++ b/include/image.h Sat Nov 10 22:40:06 2018 +0100 @@ -116,6 +116,19 @@ +/* Initialise a sprite object using an existing image without the capability of + storing regions of the screen. + + SpriteOverwriting(, image_t *image, display_config_t *cfg, int yscale) +*/ + +#define SpriteOverwriting(NAME, IMAGE, CFG, YSCALE) \ + sprite_t NAME = { \ + .image=IMAGE, \ + .regions=0, \ + .yscale=YSCALE, \ + .cfg=CFG}; + /* Initialise a sprite object using an existing image, creating stored regions for the animation of the sprite. diff -r f1ce70172578 -r 2cf83f9160ba lib/image.c --- a/lib/image.c Sat Nov 10 22:11:32 2018 +0100 +++ b/lib/image.c Sat Nov 10 22:40:06 2018 +0100 @@ -42,14 +42,20 @@ void image_plot_sprite(sprite_t *s, int x, int y, int key) { - int frame = s->cfg->frame; - position_t *p = image_get_stored_position(s->regions, frame); + int frame = 0; + position_t *p = 0; - /* Copy to the stored region. */ + if (s->regions) + { + frame = s->cfg->frame; + p = image_get_stored_position(s->regions, frame); - display_copy(s->cfg, image_get_stored_region(s->regions, frame), - s->image->width, s->image->height / s->yscale, 1, - x, y, -1, 0); + /* Copy to the stored region. */ + + display_copy(s->cfg, image_get_stored_region(s->regions, frame), + s->image->width, s->image->height / s->yscale, 1, + x, y, -1, 0); + } /* Plot to the screen. */ @@ -57,13 +63,16 @@ s->image->width, s->image->height, s->yscale, x, y, key, 1); - /* Record the stored background details. */ + if (s->regions) + { + /* Record the stored background details. */ - p->x = x; - p->y = y; + p->x = x; + p->y = y; - if (frame >= s->regions->stored) - s->regions->stored = frame + 1; + if (frame >= s->regions->stored) + s->regions->stored = frame + 1; + } } /* Copy a region from the store to the screen, restoring the original @@ -71,8 +80,14 @@ void image_unplot_sprite(sprite_t *s) { - int frame = s->cfg->frame; - position_t *p = image_get_stored_position(s->regions, frame); + int frame; + position_t *p; + + if (!s->regions) + return; + + frame = s->cfg->frame; + p = image_get_stored_position(s->regions, frame); /* Only unplot the sprite if a region was stored for the frame. */