#19434 - CyberSlag5k - Tue Apr 20, 2004 2:18 am
Ok, I have my sprites all up and working now. I can move my little soldier guy around the screen. The thing is, when any part of him goes higher than the top of the screen if he goes back down the entire sprite turns completely tan and if you do it again, he disappears (or turns black, not sure). If he goes up above the screen and keeps going up unitl he comes up through the bottom, everything is fine. Craziness. Here's code.
I can't really find anything wrong...maybe you guys can.
Also, if I'm going to enable mode 4, do I have to begin loading my sprite data starting at OAMData[512]? I'm still a little unclear on that. I've read and reread 3 different tutorials and am fairly sure that's what it means. Please correct me, though, if I'm wrong.
Thank you.
Code: |
//gba test //Mike Pateras //main.cpp #include"gba.h" #include"keypad.h" #include"palette.h" #include"FF.h" #include"soldier.h" #include "dispcnt.h" #include"sprite.h" using namespace std; typedef struct { int posX, posY; u16 spriteFrame[4]; int activeFrame; u16 OAMSpriteNum; }Sprite; Sprite soldier; u16* videoBuffeer = ((u16*)0x6000000); u16* paletteMem = ((u16*)0x5000000); u16* OAM = ((u16*)0x7000000); OAMEntry sprites[128]; pRotData rotData = (pRotData)sprites; void copyOAM() { u16* temp; temp = (u16*)sprites; for(u16 i = 0; i < 512; i++) OAM[i] = temp[i]; } void initializeSprites() { for(u16 i = 0; i < 128; i++) { sprites[i].attribute0 = 160; sprites[i].attribute1 = 240; } } void VSync() { while((volatile u16)REG_VCOUNT != 160) { } } void getInput() { if(!(*KEYS & KEY_LEFT)) { soldier.posX -= 1; if(soldier.posX < 0) soldier.posX += 512; } if(!(*KEYS & KEY_DOWN)) { soldier.posY += 1; } if(!(*KEYS & KEY_RIGHT)) { soldier.posX += 1; } if(!(*KEYS & KEY_UP)) { soldier.posY -= 1; if(soldier.posY < 0) soldier.posY += 256; } } void updateSprites(OAMEntry *spritePointer) { spritePointer->attribute0 = COLOR_256 | SQUARE | soldier.posY; spritePointer->attribute1 = SIZE_64 | soldier.posX; } int main() { soldier.posX = 20; soldier.posY = 40; setMode(MODE_1 | OBJ_ENABLE | OBJ_MAP_1D); for(int i = 0; i < 256; i++) { OBJPaletteMem[i] = palette[i]; } initializeSprites(); sprites[0].attribute0 = COLOR_256 | SQUARE | soldier.posY; sprites[0].attribute1 = SIZE_64 | soldier.posX; sprites[0].attribute2 = 0; for(int i = 0; i < 2048; i++) { OAMData[i] = obj0[i]; } for(int i = 0; i < 2048; i++) { OAMData[i + 2048] = obj1[i]; } for(int i = 0; i < 2048; i++) { OAMData[i + 4096] = obj2[i]; } for(int i = 0; i < 2048; i++) { OAMData[i + 6144] = obj3[i]; } soldier.OAMSpriteNum = 0; soldier.activeFrame = 0; soldier.spriteFrame[0] = 0; soldier.spriteFrame[1] = 128; soldier.spriteFrame[2] = 256; soldier.spriteFrame[3] = 384; while(1) { getInput(); updateSprites(&sprites[0]); VSync(); copyOAM(); } return 0; } |
I can't really find anything wrong...maybe you guys can.
Also, if I'm going to enable mode 4, do I have to begin loading my sprite data starting at OAMData[512]? I'm still a little unclear on that. I've read and reread 3 different tutorials and am fairly sure that's what it means. Please correct me, though, if I'm wrong.
Thank you.