gbadev.org forum archive

This is a read-only mirror of the content originally found on forum.gbadev.org (now offline), salvaged from Wayback machine copies. A new forum can be found here.

Graphics > issues with displaying sprites

#16169 - Darmstadium - Tue Feb 10, 2004 3:43 am

I am having a problem making a sprite appear properly. I convert my image from a pcx to header file using dovoto's pcx2sprite utility. I load it into OAM and all I get is garbage. I try my code with this example header that came with gbajunkie's tutorial and it works just fine. This is extremely frustrating. Please try to compile my code and see what you end up with. Well, here is my source and the header file that has my sprite and the palette in it:

source.cpp
Code:
#include "gba.h"
#include "dispcnt.h"
#include "spriteMan.h"
#include "keypad.h"
#include "sprite.h"

void InitializeSprites()
{
   u16 loop;
   for(loop = 0; loop < 128; loop++)
   {
      sprites[loop].attribute0 = 160;
      sprites[loop].attribute1 = 240;
   }
}

void CopyOAM()
{
   u16 loop;
   u16* temp = (u16*)sprites;
   for(loop = 0; loop < 512; loop++)
      OAM[loop] = temp[loop];
}

void WaitForVsync()
{
   while((volatile u16)REG_VCOUNT != 160){}
}

int main()
{
   u16 loop;
   SetMode(OBJ_MAP_1D | MODE_1 | OBJ_ENABLE);
   for(loop = 0; loop < 256; loop++)
      OBJPaletteMem[loop] = spriteManPal[loop];
   InitializeSprites();
   sprites[0].attribute0 = COLOR_256 | TALL | 60;
   sprites[0].attribute1 = SIZE_32 | 60;
   sprites[0].attribute2 = 0;
   
   for(loop = 0; loop < 256; loop++)
      OAMData[loop] = spriteManData[loop];
   while(1)
   {
      WaitForVsync();
      CopyOAM();
   }
   return 0;
}


spriteMan.h
Code:


const u16 spriteManData[] = {
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF,
                    0xFF00, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF00, 0xFFFF,
                    0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
                    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
                    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF00, 0xFFFF,
                    0xFFFF, 0xFFFF, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF,
                    0xFF00, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF00, 0xFF00, 0xFFFF, 0xFFFF, 0xFF00, 0xFF00,
                    0xFFFF, 0xFFFF, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
                    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
                    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x00FF, 0xFFFF, 0xFFFF, 0xFFFF,
                    0x00FF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF00, 0xFF00,
                    0xFFFF, 0xFFFF, 0xFF00, 0xFF00, 0xFFFF, 0xFFFF, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF,
                    0xFF00, 0xFF00, 0xFFFF, 0xFFFF, 0xFF00, 0xFF00, 0xFFFF, 0xFFFF, 0xFF00, 0xFFFF,
                    0xFFFF, 0xFFFF, 0xFF00, 0xFF00, 0xFFFF, 0xFFFF, 0xFF00, 0xFF00, 0xFFFF, 0xFFFF,
                    0x00FF, 0xFFFF, 0xFFFF, 0xFFFF, 0x00FF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
                    0xFFFF, 0xFFFF, 0x00FF, 0xFFFF, 0xFFFF, 0xFFFF, 0x00FF, 0xFFFF, 0xFFFF, 0xFFFF,
                    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x00FF, 0xFFFF, 0xFF00, 0x0000, 0x00FF, 0xFFFF,
                    0xFF00, 0x0000, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF00, 0xFF00, 0xFFFF, 0xFFFF,
                    0xFF00, 0xFF00, 0xFFFF, 0xFFFF, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF00, 0xFF00,
                    0xFFFF, 0xFFFF, 0xFF00, 0xFF00, 0xFFFF, 0xFFFF, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF,
                    0xFF00, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x00FF, 0xFFFF,
                    0x0000, 0xFFFF, 0x00FF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
                    0x00FF, 0xFFFF, 0xFF00, 0xFFFF, 0x00FF, 0xFFFF, 0xFF00, 0xFFFF, 0xFFFF, 0xFFFF,
                    0xFFFF, 0xFFFF, 0x00FF, 0xFFFF, 0xFF00, 0xFFFF,};

const u16 spriteManPal[] = {
                    0x0802, 0x0802, 0x0802, 0x0802, 0x0802, 0x0802, 0x0802, 0x0802, 0x0802, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0004, 0x0000, 0x0421, 0x0421, 0x0842, 0x0842, 0x0C63, 0x0C63, 0x1084,
                    0x1084, 0x14A5, 0x14A5, 0x18C6, 0x18C6, 0x1CE7, 0x1CE7, 0x2108, 0x2108, 0x2529,
                    0x2529, 0x294A, 0x294A, 0x2D6B, 0x2D6B, 0x210C, 0x2108, 0x2529, 0x2529, 0x294A,
                    0x294A, 0x2D6B, 0x3DEF, 0x4210, 0x4210, 0x4631, 0x4631, 0x4A52, 0x4A52, 0x4673,
                    0x4671, 0x5294, 0x5294, 0x56B5, 0x56B5, 0x5AD6, 0x5AD6, 0x5EF7, 0x5EF7, 0x6318,
                    0x6318, 0x6739, 0x6739, 0x6B5A, 0x6B5A, 0x6F7B, 0x6F7B, 0x6318, 0x6318, 0x6739,
                    0x6739, 0x6B5A, 0x6B5A, 0x6F7B, 0x6F7B, 0x0004, 0x0000, 0x0421, 0x0421, 0x0842,
                    0x0842, 0x0C63, 0x0C63, 0x1084, 0x1084, 0x14A5, 0x14A5, 0x18C6, 0x18C6, 0x1CE7,
                    0x1CE7, 0x3188, 0x318C, 0x35AD, 0x35AD, 0x39CE, 0x39CE, 0x3DEF, 0x2D6B, 0x318C,
                    0x318C, 0x35AD, 0x35AD, 0x39CE, 0x39CE, 0x3DEF, 0x3DEF, 0x4210, 0x4210, 0x4E31,
                    0x4E33, 0x4A52, 0x4A52, 0x4E73, 0x4E73, 0x5294, 0x5294, 0x56B5, 0x56B5, 0x5AD6,
                    0x5AD6, 0x5EF7, 0x5EF7, 0x739C, 0x739C, 0x77BD, 0x77BD, 0x7BDE, 0x7BDE, 0x7FFF,
                    0x7FFF, 0x739C, 0x739C, 0x77BD, 0x77BD, 0x7BDE, 0x7BDE, 0x7FFF, 0x7FFF, 0x0004,
                    0x0000, 0x0421, 0x0421, 0x0842, 0x0842, 0x0C63, 0x0C63, 0x1084, 0x1084, 0x14A5,
                    0x14A5, 0x18C6, 0x18C6, 0x1CE7, 0x1CE7, 0x2108, 0x2108, 0x2529, 0x2529, 0x294A,
                    0x294A, 0x2D6B, 0x2D6B, 0x318C, 0x318C, 0x35AD, 0x35AD, 0x39CE, 0x39CE, 0x3DEF,
                    0x3DEF, 0x4210, 0x4210, 0x4631, 0x4631, 0x4A52, 0x4A52, 0x4E73, 0x4E73, 0x5294,
                    0x5294, 0x33F1, 0x0015, 0x0020, 0x3809, 0x7A92, 0x3000, 0x382A, 0x0015, 0x0000,
                    0x3001, 0x3000, 0x3809, 0x0008, 0x0000, 0x000A, 0x000A, 0x33F6, 0x7A88, 0x3000,
                    0x7A8B, 0x3000, 0x0008, 0x0000, 0x0020, 0x0020, 0x3839, 0x33F8, 0x7E33, 0x3000,
                    0x0020, 0x0008, 0x33E7, 0x2122, 0x3000, 0x0001, 0x0020, 0x0000, 0x0002, 0x2800,
                    0x20DA, 0x0000, 0x0000, 0x33F3, 0x2072, 0x21C0,};


Any help at all anybody could give would be VERY appreciated.

#18232 - darknet - Mon Mar 22, 2004 9:46 pm

I had a very similar problem for the longest time and, honestly, the only conclusion I came to was to not use PCX2SPRITES (or pcx2gba). I know it works for most people around here, but I can't get it working to save my life.

The conversion utility I use these days is gifs2sprites. Its in the tools section. Just convert your .pcx to a .gif in either photoshop or paint shop pro and then use gifs2sprites like so:

gifs2sprites 256 nameOfHeader.h gifFile.gif

where 256 is 256 colors (or 16 if yours is 16) and nameOfHeader is what you want to name the header and gifFile is the name of the file you're passing.

Whats cool about this program is that you can actually pass it a bunch of gif files and it will make a single palette from it, which is necessary when you have multiple sprites. Other than all of that, your code looks ok.

I assume you want 0x802 to be the transparent color in your image? If so, everything should be kosher from there.

Let me know how it goes.

-Mike