Communauté PortableDev

Développement SNES => PVSnesLib English section => Discussion démarrée par: zenac le 06 Mai 2014 à 23:22:35

Titre: Trying to convert "AnimatedSprite" project for 8x8 and 32x32 pixels
Posté par: zenac le 06 Mai 2014 à 23:22:35
I'm trying to convert "AnimatedSprite" project. The original project uses sprites with 16x16 pixels. I would like to make a new version using sprites with 8x8 (project "AnimatedSprite8x8") and another new version using sprites with 32x32 (project "AnimatedSprite32x32").

The original file "AnimatedSprite.c" can be seen at:
http://www.portabledev.com/media/SNES/PVSnesLib/doc/a00010.html

I have copied all the files of the original project to the other two new projects.

But there are some differences:

- The file "AnimatedSprite.c" was renamed: "AnimatedSprite8x8.c" and "AnimatedSprite32x32.c"

- The dimensions of the original file image ("sprites.bmp") are: 16x144 pixels. The new versions of this files have the following dimensions: 8x72 pixels (for AnimatedSprite8x8) and 32x288 (for AnimatedSprite32x32).

Then, I have changed some lines of the code:

AnimatedSprite.c (line 39)
char sprTiles[9]={0,2,4, 6,8,10, 12,14,32};  // Remeber that sprites are interleave with 128 pix width,

AnimatedSprite8x8.c (line 39)
char sprTiles[9]={0,1,2, 3,4,5, 6,7,8};

AnimatedSprite32x32.c (line 39)
char sprTiles[9]={0,4,8, 12,64,68, 72,76,128};


AnimatedSprite.c (line 50)
oamInitGfxSet(&gfxpsrite, (&gfxpsrite_end-&gfxpsrite), &palsprite, 0, 0x4000, OBJ_SIZE16);

AnimatedSprite8x8.c (line 50)
oamInitGfxSet(&gfxpsrite, (&gfxpsrite_end-&gfxpsrite), &palsprite, 0, 0x4000, OBJ_SIZE8);

AnimatedSprite32x32.c (line 50)
oamInitGfxSet(&gfxpsrite, (&gfxpsrite_end-&gfxpsrite), &palsprite, 0, 0x4000, OBJ_SIZE32);


More changes in Makefile...

Makefile - AnimatedSprite (lines 63 to 65)

sprites.pic: sprites.bmp
@echo convert bitmap ... $(notdir $@)
$(GFXCONV) -gs16 -pc16 -po16 -n $<



Makefile - AnimatedSprite8x8 (lines 63 to 65)

sprites.pic: sprites.bmp
@echo convert bitmap ... $(notdir $@)
$(GFXCONV) -gs8 -pc16 -po16 -n $<



Makefile - AnimatedSprite32x32 (lines 63 to 65)

sprites.pic: sprites.bmp
@echo convert bitmap ... $(notdir $@)
$(GFXCONV) -gs32 -pc16 -po16 -n $<


When I run "AnimatedSprite8x8" and "AnimatedSprite32x32" the joystick moves the character, but the transparency effect does NOT work. The character is inside a visible square area.

Please, what have I forgotten?
Titre: Re : Trying to convert "AnimatedSprite" project for 8x8 and 32x32 pixels
Posté par: alekmaul le 09 Mai 2014 à 10:21:11
Are you sure that transparent color is first color of your palette ?
Titre: Re : Trying to convert "AnimatedSprite" project for 8x8 and 32x32 pixels
Posté par: zenac le 09 Mai 2014 à 15:10:17
In fact, all the colors of my pictures are wrong.

I think I don't know how to change the line 65 of Makefile to make the right conversion of images of 8x8 pixels and 32x32 pixels...

Original "Makefile" (line 65)

$(GFXCONV) -gs16 -pc16 -po16 -n $<


As I have written before, I have only changed the first argument (-gs16 changed to -gs8 and -gs32) of $(GFXCONV) in Makefile.

Please, what should I do? Should I make other changes besides Makefile?
Titre: Re : Trying to convert "AnimatedSprite" project for 8x8 and 32x32 pixels
Posté par: alekmaul le 11 Mai 2014 à 13:57:02
well, send me your bmp file, i will check if colors are OK, because you must have a 16 colors palette but your bmp file must be a 256 colors file (so yes, colors #17 ..255 are useless).
Titre: Re : Trying to convert "AnimatedSprite" project for 8x8 and 32x32 pixels
Posté par: zenac le 12 Mai 2014 à 13:31:41
My both picture files have the name "sprites.bmp". Here I changed the name to "sprites8x8" and "sprites32x32". The forum doesn't accept "bmp" files, so I have converted them to "png".
Titre: Re : Trying to convert "AnimatedSprite" project for 8x8 and 32x32 pixels
Posté par: alekmaul le 12 Mai 2014 à 20:42:06
So the problem is effectively the palette. I replied with correct bmp files through email.
Titre: Re : Trying to convert "AnimatedSprite" project for 8x8 and 32x32 pixels
Posté par: zenac le 13 Mai 2014 à 17:04:47
Alekmaul, thank you very much!
Titre: Re : Trying to convert "AnimatedSprite" project for 8x8 and 32x32 pixels
Posté par: zenac le 23 Mai 2014 à 15:59:20
My project using sprites with 8x8 pixels is fine. But my project using sprites with 32x32 still has a small problem.

The last picture of the character moving to the left or to the right (sprTiles[8]) is now showed.

Maybe the last value of "sprTiles" array is wrong...


char sprTiles[9]={0,4,8, 12,64,68, 72,76,128};


What's the correct last value of this array? I say it again: each sprite has 32 x 32 pixels.

Complete code of "AnimatedSprite32x32.c" above:


#include <snes.h>

extern char gfxpsrite, gfxpsrite_end;
extern char palsprite;

#define FRAMES_PER_ANIMATION 3 // 3 sprites per direction

//---------------------------------------------------------------------
// The Monster sprite
//---------------------------------------------------------------------
typedef struct
{
short x, y;
int gfx_frame;
int state;
int anim_frame;
int flipx;
} Monster;

//---------------------------------------------------------------------
// The state of the sprite (which way it is walking)
//---------------------------------------------------------------------
enum SpriteState {W_DOWN = 0, W_UP = 1, W_RIGHT = 2,  W_LEFT = 2};

//---------------------------------------------------------------------
// Screen dimentions
//---------------------------------------------------------------------
enum {SCREEN_TOP = 0, SCREEN_BOTTOM = 224, SCREEN_LEFT = 0, SCREEN_RIGHT = 256};

char sprTiles[9]={0,4,8, 12,64,68, 72,76,128};

//---------------------------------------------------------------------------------
int main(void) {
unsigned short pad0,i;
Monster monster = {100,100};

    // Initialize SNES
consoleInit();

// Init Sprites gfx and palette with default size of 16x16
oamInitGfxSet(&gfxpsrite, (&gfxpsrite_end-&gfxpsrite), &palsprite, 0, 0x4000, OBJ_SIZE32);

// Define sprites parameters
oamSet(0,  monster.x, monster.y, 0, 0, 0, 0, 0);
oamSetEx(0, OBJ_SMALL, OBJ_SHOW);

// Now Put in 16 color mode and disable all backgrounds
setMode(BG_MODE1,0); bgSetDisable(0); bgSetDisable(1); bgSetDisable(2);

// Wait VBL 'and update sprites too ;-) )
WaitForVBlank();

// Wait for nothing :P
while(1) {
// Refresh pad values
scanPads();

// Get current #0 pad
pad0 = padsCurrent(0);

if (pad0) {
// Update sprite with current pad
if(pad0 & KEY_UP) {
if(monster.y >= SCREEN_TOP) monster.y--;
monster.state = W_UP;
monster.flipx = 0;
}
if(pad0 & KEY_LEFT) {
if(monster.x >= SCREEN_LEFT) monster.x--;
monster.state = W_LEFT;
monster.flipx = 1;
}
if(pad0 & KEY_RIGHT) {
if(monster.x <= SCREEN_RIGHT) monster.x++;
monster.state = W_LEFT;
monster.flipx = 0;
}
if(pad0 & KEY_DOWN) {
if(monster.y <= SCREEN_BOTTOM) monster.y++;
monster.state = W_DOWN;
monster.flipx = 0;
}
monster.anim_frame++;
if(monster.anim_frame >= FRAMES_PER_ANIMATION) monster.anim_frame = 0;
}

// Now, get current sprite in current animation
monster.gfx_frame = sprTiles[monster.anim_frame + monster.state*FRAMES_PER_ANIMATION ];

oamSet(0,  monster.x, monster.y, 3, monster.flipx, 0, monster.gfx_frame, 0);

// Wait VBL 'and update sprites too ;-) )
WaitForVBlank();
}
return 0;
}

Titre: Re : Trying to convert "AnimatedSprite" project for 8x8 and 32x32 pixels
Posté par: alekmaul le 03 Juin 2014 à 13:43:03
you last value is correct, it is 0x80 ...
Also, with last pvsneslib version, you do not need to do scanpad, it is in the vbl function, so, just remove it.
If i take a look at code, i think the problem is here :
Citationif(monster.anim_frame >= FRAMES_PER_ANIMATION) monster.anim_frame = 0;
why
Citation>=
, i think it must be
Citation>
, because you need to do 0,1,2,3 and the constant variable is 3 too ...  :-\
Big bug in my examples sorry about that  :'( :-\
Titre: Re : Trying to convert "AnimatedSprite" project for 8x8 and 32x32 pixels
Posté par: zenac le 03 Juin 2014 à 16:09:39
I think ">=" is correct!

The original image has 9 sprites: 3 for down, 3 for up and 3 for right or left. So, the indexes of "sprTiles" array are:

> 0, 1, 2 for down
> 3, 4, 5 for up
> 6, 7, 8 for right/left

if(monster.anim_frame >= FRAMES_PER_ANIMATION) monster.anim_frame = 0;

When "monster.anim_frame" has the value 3, it must be set to zero because we do not use "monster.anim_frame" equals to 3.
Titre: Re : Trying to convert "AnimatedSprite" project for 8x8 and 32x32 pixels
Posté par: alekmaul le 09 Juin 2014 à 14:05:56
hum, strange, will check again when i will have time ...
Really don't know where is the problem at this moment ...