spriteit.sh -->
Code: Select all
#!/bin/sh
IMAGE=${1:?"Missing parameter IMAGE"}
WIDTH=${2:?"Missing parameter WIDTH"}
HEIGHT=${3:?"Missing parameter HEIGHT"}
NUMSPRITE=${4:?"Missing parameter NUMSPRITES"}
TEMPDIR=$(mktemp -d)
IMAGENAME=${IMAGE%.*}
convert ${IMAGE} -crop 8x8 BMP3:${TEMPDIR}/${IMAGENAME}_%d.bmp
CONCATLIST=""
CURINDEX=0
IMAGELEN=$(echo "${WIDTH} * ${NUMSPRITE} " | bc)
for i in $(seq ${IMAGELEN}); do
CURINDEX=$(echo "${i} - 1" | bc)
for j in $(seq ${HEIGHT}); do
CONCATLIST="${CONCATLIST} ${TEMPDIR}/${IMAGENAME}_${CURINDEX}.bmp"
CURINDEX=$(echo "${CURINDEX} + ${WIDTH}*${NUMSPRITE}" | bc)
done
done
montage -mode concatenate -tile ${IMAGELEN}x${HEIGHT} ${CONCATLIST} BMP3:${IMAGENAME}_sprite.bmp
convert ${IMAGENAME}_sprite.bmp -colors 16 BMP3:${IMAGENAME}_sprite.bmp
rm -rf ${TEMPDIR}
$ ./spriteit.sh animage.bmp 4 4 3
This will spit out 'animage_sprite.bmp'
In this case animage.bmp has three 32x32 pixel frames side by side. The input image type doesn't really matter, either, can be jpg, png, etc, it will spit out a bmp regardless.
------
In sgdk:
You can load the bmp just like any other in sgdk:
Code: Select all
#include "animage_sprite.h"
....
VDP_setPalette(PAL0, (u16 *) &animage_sprite[2]);
VDP_loadBMPTileData((u32*) &animage_sprite[19], 1121, 12, 4, 12);
Code: Select all
struct spritedef {
s16 posx;
s16 posy;
u16 tile_attr;
u8 size;
u8 link;
u32 startaddr;
u8 steps;
};
...
int step=0;
int sprite_step=3;
struct spritedef runsprite;
runsprite.posx = 0;
runsprite.posy = 180;
runsprite.size = SPRITE_SIZE(4,4);
runsprite.steps = 3;
runsprite.startaddr = 1121;
runsprite.tile_attr = TILE_ATTR_FULL(PAL0, 1, 0, 0, runsprite.startaddr+(16*(step%runsprite.steps)));
runsprite.link = 0;
for(i=0;i<350;i+=5)
{
runsprite.posx = i;
runsprite.tile_attr = TILE_ATTR_FULL(PAL0, 1, 0, 0, runsprite.startaddr+(16*(step%runsprite.steps)));
VDP_setSpriteP(0, &runsprite);
VDP_updateSprites();
VDP_waitVSync();
VDP_waitVSync();
step++;
}