#150998 - Cave Johnson - Sat Feb 16, 2008 6:00 pm
So far in my simple game, ive created 2 sprites, but when i run the game, depending on their priorities, one sprite takes the place of the other and the colors become all gray. After working on this problem for a week, i think i have narrowed the problem down to a snippet of my main.cpp.
dopefish is the sprite
fish is the class
ak47 is the sprite
gun is the class
Heres the code:
void initSprites(tOAM * oam, SpriteInfo *spriteInfo)
{
static const int BYTES_PER_16_COLOR_TILE = 32;
static const int COLORS_PER_PALETTE = 16;
static const int BOUNDARY_VALUE = 32;
static const int OFFSET_MULTIPLIER = BOUNDARY_VALUE /
sizeof(SPRITE_GFX[0]);
int nextAvailableTileIdx = 0;
static const int DOPEFISH_OAM_ID = 1;
assert(DOPEFISH_OAM_ID < SPRITE_COUNT);
SpriteInfo * dopefishInfo = &spriteInfo[DOPEFISH_OAM_ID];
SpriteEntry * dopefish = &oam->spriteBuffer[DOPEFISH_OAM_ID];
dopefishInfo->oamId = DOPEFISH_OAM_ID;
dopefishInfo->width = 32;
dopefishInfo->height = 32;
dopefishInfo->angle = 462;
dopefishInfo->entry = dopefish;
dopefish->posY = 112.5;
assert(!dopefish->isRotoscale || (dopefishInfo->oamId < MATRIX_COUNT));
dopefish->rsDouble = false;
dopefish->objMode = OBJMODE_NORMAL;
dopefish->isMosaic = false;
dopefish->colMode = OBJCOLOR_16;
dopefish->objShape = OBJSHAPE_SQUARE;
dopefish->posX = 112.5;
dopefish->rsMatrixIdx = ATTR1_ROTDATA(spriteInfo->oamId);
dopefish->objSize = OBJSIZE_32;
dopefish->tileIdx = nextAvailableTileIdx;
nextAvailableTileIdx += dopefishTilesLen / BYTES_PER_16_COLOR_TILE;
dopefish->objPriority = OBJPRIORITY_1;
dopefish->objPal = dopefishInfo->oamId;
rotateSprite(&oam->matrixBuffer[spriteInfo->oamId],
dopefishInfo->angle);
static const int AK47_OAM_ID = 0;
assert(AK47_OAM_ID < SPRITE_COUNT);
SpriteInfo * ak47Info = &spriteInfo[AK47_OAM_ID];
SpriteEntry * ak47 = &oam->spriteBuffer[AK47_OAM_ID];
ak47Info->oamId = AK47_OAM_ID;
ak47Info->width = 32;
ak47Info->height = 32;
ak47Info->angle = 462;
ak47Info->entry = ak47;
//i placed the ak47 in the middle of nowhere just to see if i could get
//both sprites working
ak47->posY = 50;
ak47->isRotoscale = false;
assert(!ak47->isRotoscale || (ak47Info->oamId < MATRIX_COUNT));
ak47->isHidden = false;
ak47->objMode = OBJMODE_NORMAL;
ak47->isMosaic = false;
ak47->colMode = OBJCOLOR_16;
ak47->objShape = OBJSHAPE_SQUARE;
ak47->posX = 50;
ak47->objSize = OBJSIZE_32;
ak47->tileIdx = nextAvailableTileIdx;
nextAvailableTileIdx += ak47TilesLen / BYTES_PER_16_COLOR_TILE;
ak47->objPriority = OBJPRIORITY_0;
ak47->objPal = ak47Info->oamId;
rotateSprite(&oam->matrixBuffer[spriteInfo->oamId],
ak47Info->angle);
dmaCopyHalfWords(SPRITE_DMA_CHANNEL,
dopefishPal,
&SPRITE_PALETTE[spriteInfo->oamId * COLORS_PER_PALETTE],
dopefishPalLen);
dmaCopyHalfWords(SPRITE_DMA_CHANNEL,
dopefishTiles,
&SPRITE_GFX[dopefish->tileIdx * OFFSET_MULTIPLIER],
dopefishTilesLen);
dmaCopyHalfWords(SPRITE_DMA_CHANNEL,
ak47Pal,
&SPRITE_PALETTE[spriteInfo->oamId * COLORS_PER_PALETTE],
ak47PalLen);
dmaCopyHalfWords(SPRITE_DMA_CHANNEL,
ak47Tiles,
&SPRITE_GFX[ak47->tileIdx * OFFSET_MULTIPLIER],
ak47TilesLen);
}
What am i doing wrong? Thanks.
Last edited by Cave Johnson on Tue Feb 19, 2008 3:36 pm; edited 2 times in total
dopefish is the sprite
fish is the class
ak47 is the sprite
gun is the class
Heres the code:
void initSprites(tOAM * oam, SpriteInfo *spriteInfo)
{
static const int BYTES_PER_16_COLOR_TILE = 32;
static const int COLORS_PER_PALETTE = 16;
static const int BOUNDARY_VALUE = 32;
static const int OFFSET_MULTIPLIER = BOUNDARY_VALUE /
sizeof(SPRITE_GFX[0]);
int nextAvailableTileIdx = 0;
static const int DOPEFISH_OAM_ID = 1;
assert(DOPEFISH_OAM_ID < SPRITE_COUNT);
SpriteInfo * dopefishInfo = &spriteInfo[DOPEFISH_OAM_ID];
SpriteEntry * dopefish = &oam->spriteBuffer[DOPEFISH_OAM_ID];
dopefishInfo->oamId = DOPEFISH_OAM_ID;
dopefishInfo->width = 32;
dopefishInfo->height = 32;
dopefishInfo->angle = 462;
dopefishInfo->entry = dopefish;
dopefish->posY = 112.5;
assert(!dopefish->isRotoscale || (dopefishInfo->oamId < MATRIX_COUNT));
dopefish->rsDouble = false;
dopefish->objMode = OBJMODE_NORMAL;
dopefish->isMosaic = false;
dopefish->colMode = OBJCOLOR_16;
dopefish->objShape = OBJSHAPE_SQUARE;
dopefish->posX = 112.5;
dopefish->rsMatrixIdx = ATTR1_ROTDATA(spriteInfo->oamId);
dopefish->objSize = OBJSIZE_32;
dopefish->tileIdx = nextAvailableTileIdx;
nextAvailableTileIdx += dopefishTilesLen / BYTES_PER_16_COLOR_TILE;
dopefish->objPriority = OBJPRIORITY_1;
dopefish->objPal = dopefishInfo->oamId;
rotateSprite(&oam->matrixBuffer[spriteInfo->oamId],
dopefishInfo->angle);
static const int AK47_OAM_ID = 0;
assert(AK47_OAM_ID < SPRITE_COUNT);
SpriteInfo * ak47Info = &spriteInfo[AK47_OAM_ID];
SpriteEntry * ak47 = &oam->spriteBuffer[AK47_OAM_ID];
ak47Info->oamId = AK47_OAM_ID;
ak47Info->width = 32;
ak47Info->height = 32;
ak47Info->angle = 462;
ak47Info->entry = ak47;
//i placed the ak47 in the middle of nowhere just to see if i could get
//both sprites working
ak47->posY = 50;
ak47->isRotoscale = false;
assert(!ak47->isRotoscale || (ak47Info->oamId < MATRIX_COUNT));
ak47->isHidden = false;
ak47->objMode = OBJMODE_NORMAL;
ak47->isMosaic = false;
ak47->colMode = OBJCOLOR_16;
ak47->objShape = OBJSHAPE_SQUARE;
ak47->posX = 50;
ak47->objSize = OBJSIZE_32;
ak47->tileIdx = nextAvailableTileIdx;
nextAvailableTileIdx += ak47TilesLen / BYTES_PER_16_COLOR_TILE;
ak47->objPriority = OBJPRIORITY_0;
ak47->objPal = ak47Info->oamId;
rotateSprite(&oam->matrixBuffer[spriteInfo->oamId],
ak47Info->angle);
dmaCopyHalfWords(SPRITE_DMA_CHANNEL,
dopefishPal,
&SPRITE_PALETTE[spriteInfo->oamId * COLORS_PER_PALETTE],
dopefishPalLen);
dmaCopyHalfWords(SPRITE_DMA_CHANNEL,
dopefishTiles,
&SPRITE_GFX[dopefish->tileIdx * OFFSET_MULTIPLIER],
dopefishTilesLen);
dmaCopyHalfWords(SPRITE_DMA_CHANNEL,
ak47Pal,
&SPRITE_PALETTE[spriteInfo->oamId * COLORS_PER_PALETTE],
ak47PalLen);
dmaCopyHalfWords(SPRITE_DMA_CHANNEL,
ak47Tiles,
&SPRITE_GFX[ak47->tileIdx * OFFSET_MULTIPLIER],
ak47TilesLen);
}
What am i doing wrong? Thanks.
Last edited by Cave Johnson on Tue Feb 19, 2008 3:36 pm; edited 2 times in total