Messages récents

#21
PVSnesLib English section / Re : Trying to convert "Animat...
Dernier message par zenac - 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.
#22
PVSnesLib English section / Re : Trying to convert "Animat...
Dernier message par alekmaul - 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  :'( :-\
#23
PVSnesLib English section / Re : Trying to convert "Animat...
Dernier message par zenac - 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;
}

#24
PVSnesLib English section / Re : How to duplicate sprites ...
Dernier message par zenac - 21 Mai 2014 à 00:09:20
Thank you, Alekmaul!
#25
PVSnesLib English section / Re : How to duplicate sprites ...
Dernier message par alekmaul - 20 Mai 2014 à 21:19:39
-po16 is better because you can only have 16 colors for sprites, same for -pc. But you need to convert each sprite graphics/palette even if you dn't use them (for graphcis if I understand well your need ).
Also, you need to specify- pe to add to correct palette entry with something like -pe1 and put 1 in the last parameter of oamSet to have correct palette.
At least, you need to load second palette, even if you don't load graphics (because they are the same as your palette #0 graphics).
dmaCopyCGRam is the function you need to do such thing.
#26
PVSnesLib English section / Re : How to duplicate sprites ...
Dernier message par zenac - 19 Mai 2014 à 16:29:48
I am trying it, but my program doesn't work.

I am changing "AnimatedSprite" project to "TwoAnimatedSprites". In the image "sprites.bmp", I have set new colors in the palette: color #16 is magenta (equal to color #0) and I have added new colors from #17 to #31.

Lines 63 to 65 in Makefile changed (I have changed "pc16 -po16" to "pc256 -po256" in line 65):


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


And my complete "TwoAnimatedSprites.c" below:


/*---------------------------------------------------------------------------------


Animated Sprite demo
-- alekmaul

Sprite from Stephen "Redshrike" Challener), http://opengameart.org

---------------------------------------------------------------------------------*/
#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,2,4, 6,8,10, 12,14,32};  // Remeber that sprites are interleave with 128 pix width,

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

    // Initialize SNES
consoleInit();

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

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

oamSet(16,  monster2.x, monster2.y, 0, 0, 0, 0, 16);  // NEW LINE
oamSetEx(16, OBJ_SMALL, OBJ_SHOW);  // NEW LINE

// 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(monster2.y >= SCREEN_TOP) monster2.y--;  // NEW LINE
monster2.state = W_UP;  // NEW LINE
monster2.flipx = 0;  // NEW LINE
}
if(pad0 & KEY_LEFT) {
if(monster.x >= SCREEN_LEFT) monster.x--;
monster.state = W_LEFT;
monster.flipx = 1;
if(monster2.x >= SCREEN_LEFT) monster2.x--;  // NEW LINE
monster2.state = W_LEFT;  // NEW LINE
monster2.flipx = 1;  // NEW LINE
}
if(pad0 & KEY_RIGHT) {
if(monster.x <= SCREEN_RIGHT) monster.x++;
monster.state = W_LEFT;
monster.flipx = 0;
if(monster2.x <= SCREEN_RIGHT) monster2.x++;  // NEW LINE
monster2.state = W_LEFT;  // NEW LINE
monster2.flipx = 0;  // NEW LINE
}
if(pad0 & KEY_DOWN) {
if(monster.y <= SCREEN_BOTTOM) monster.y++;
monster.state = W_DOWN;
monster.flipx = 0;
if(monster2.y <= SCREEN_BOTTOM) monster2.y++;  // NEW LINE
monster2.state = W_DOWN;  // NEW LINE
monster2.flipx = 0;  // NEW LINE
}
monster.anim_frame++;
if(monster.anim_frame >= FRAMES_PER_ANIMATION) monster.anim_frame = 0;
monster2.anim_frame++;  // NEW LINE
if(monster2.anim_frame >= FRAMES_PER_ANIMATION) monster2.anim_frame = 0;  // NEW LINE
}

// 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);

monster2.gfx_frame = sprTiles[monster2.anim_frame + monster2.state*FRAMES_PER_ANIMATION ];  // NEW LINE
oamSet(16,  monster2.x, monster2.y, 3, monster2.flipx, 0, monster2.gfx_frame, 16);  // NEW LINE

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



I have NOT changed "date.asm" and "hdr.asm".
#27
PVSnesLib English section / Re : How to duplicate sprites ...
Dernier message par alekmaul - 18 Mai 2014 à 08:40:04
Well, as you said, you need to create two palettes, on for 1st tile and another for second and you need to modify last parameter of oamSet to use the correct palette.
Be careful to have same color id for the sprite in the two palette.
transparent palette muset be #0 and  #16 for two sprite, 1 color #1 and #17, and so on ...
#28
PVSnesLib English section / How to duplicate sprites using...
Dernier message par zenac - 14 Mai 2014 à 17:05:51
How can I draw the same sprite two times in the same screen but using different colors? For example, in a fight "Ryu (white clothes) vs. Ryu (dark clothes)" in "Street Fighter II" or in a sport game (Lakers with yellow uniform and Celtics with green uniform). Considering that two objects have the same sprite, can I associate the first object to a palette and the second object to another different palette?
#29
PVSnesLib English section / Re : Trying to convert "Animat...
Dernier message par zenac - 13 Mai 2014 à 17:04:47
Alekmaul, thank you very much!
#30
PVSnesLib English section / Re : Trying to convert "Animat...
Dernier message par alekmaul - 12 Mai 2014 à 20:42:06
So the problem is effectively the palette. I replied with correct bmp files through email.