#1407 - DennisBor - Sat Jan 18, 2003 1:40 pm
Hey there, I've just started programming for the GBA (i'm pretty familiar with C++) and I'm using the tutorial from the Pern Project site (www.thepernproject.com).
My code does compile without a single error, VBA shows the OAM settings (my sprite is really 64x64 pixels etc) but I think something goes wrong while writing the color palette to the memory because the 64x64 sprite is totally empty (black).
My code is below (sorry for the dutch comment)
can someone please tell me what's wrong about it. I'm stuck for about 36 hours at this problem now and I really would like to go on, so I really hope you guys can help me with this.
Thanks,
Dennis
_________________
I rather have a compiler than a girl... A compiler isn't complaining all the time!
Last edited by DennisBor on Sat Jan 18, 2003 2:55 pm; edited 1 time in total
My code does compile without a single error, VBA shows the OAM settings (my sprite is really 64x64 pixels etc) but I think something goes wrong while writing the color palette to the memory because the 64x64 sprite is totally empty (black).
My code is below (sorry for the dutch comment)
Code: |
/****************************************************************************************** Bestandsnaam main.cpp Project Codename : Total Control (C) 2003 Dennis Bor, alle rechten voorbehouden Datum 16 januari 2003 Programmeur Dennis Bor ******************************************************************************************/ // vertel de compiler welke bestanden gebruikt moeten worden #include "gba.h" #include "screenmodes.h" #include "character.h" #include "sprite.h" #include "keypad.h" // initialiseer variabelen om de X en Y co?rdinaten van de sprite in op te slaan signed short myX = 10; signed short myY = 10; // initialiseer een variabele om in op te slaan met welke sprite we momenteel werken unsigned short myKarakternummer = 0; /** * Kopieert de array met sprites naar het OAM */ void KopieerOAM() { // maak een pointer naar unsigned short unsigned short * myTemp; // maak een pointer van de sprite array naar myTemp myTemp = (unsigned short *)Sprites; // doe een loop om alle sprites inclusief attributen weg te schrijven naar het OAM for ( unsigned short myLoop = 0; myLoop < 128 * 4; myLoop++ ) { // kopieer de sprite data naar de OAM OAM[myLoop] = myTemp[myLoop]; } } /** * Doe niets tot we in de VBlank periode zijn beland */ void WachtOpVBlank() { // maak een pointer naar de scanline counter // LET OP: vergeet niet volatile erbij te vermelden. Volatile vertelt // het programma dat de variabele ook vanaf buiten veranderd kan // worden (operating system of hardware) #define ScanlineCounter * (volatile unsigned short *) 0x4000006 // doe een loop zolang de counter kleiner is dan 160 while (ScanlineCounter < 160) { // doe niets totdat de we om de VBlank periode zijn } } /** * Functie om de sprite te verplaatsen * * @param mySprite pointer naar de sprite-attributen * myX X locatie van de sprite * myY Y locatie van de sprite */ void VerplaatsSprite(Sprite* mySprite, int myX, int myY) { // verwijder de oude X waarde van de sprite mySprite->attribute1 = mySprite->attribute1 & 0xFE00; mySprite->attribute1 = mySprite->attribute1 | myX; // verwijder de oude Y waarde van de sprite mySprite->attribute0 = mySprite->attribute0 & 0xFF00; mySprite->attribute0 = mySprite->attribute0 | myY; } /** * Functie om de X en Y co?rdinaten aan te passen wanneer er een toets is ingedrukt */ void Invoer() { // voer de onderstaande code uit wanneer de gebruiker op het pijltje naar boven heeft // gedrukt if(KEYPRESSED(KEYUP)) { // trek 1 van de Y co?rdinaat af myY--; } // voer de onderstaande code uit wanneer de gebruiker op het pijltje naar beneden heeft // gedrukt else if(KEYPRESSED(KEYDOWN)) { // tel 1 bij de Y co?rdinaat op myY++; } // voer de onderstaande code uit wanneer de gebruiker op het pijltje naar links heeft // gedrukt else if(KEYPRESSED(KEYLEFT)) { // trek 1 van de X co?rdinaat af myX--; } // voer de onderstaande code uit wanneer de gebruiker op het pijltje naar rechts heeft // gedrukt else if(KEYPRESSED(KEYRIGHT)) { // tel 1 bij de X co?rdinaat op myX++; } } /** * Zet alle sprites op offscreen */ void SpritesInitialiseren() { // doe een loop en voer deze 128 keer uit (Sprites is een array van // 128 objecten) for ( int myLoop = 0; myLoop < 128 ;myLoop ++ ) { // stel de Y co?rdinaat in op 160 ( > 159 ) Sprites[myLoop].attribute0 = 160; // stel de X co?rdinaat in op 240 ( > 240 ) Sprites[myLoop].attribute1 = 240; } } /** * Hier begint het spel */ int main() { // stel de screenmode in op 3; gebruik 2D sprites en enable deze SetMode( MODE_2 | OBJ_MAP_1D | OBJ_ENABLE ); // doe een loop om alle 256 kleuren naar het geheugen te schrijven for (unsigned short myLoop = 0; myLoop < 256; myLoop ++) { // kopieer de het kleurenpalet van de sprite naar het geheugen OBJPaletteMem[myLoop] = characterPalette[myLoop]; } // roep de functie aan die alle niet gebruikte sprites offscreen neerzet SpritesInitialiseren(); // stel de 0-attributen van de huidige sprite in op 256 kleuren, vierkant en de Y // co?rdinaat Sprites[0].attribute0 = COLOR_256 | SQUARE | myY; // stel de 1-attributen van de huidige sprite in op 64x64 pixels en de X co?rdinaat Sprites[0].attribute1 = SIZE_64 | myX; // stel de 2-attributen van de huidige sprite in op het huidige karakternummer Sprites[0].attribute2 = myKarakternummer; // doe een loop en voer deze acht keer uit omdat er 8 rijen met tiles zijn (64x64 = 8 // 8x8 tiles) for ( int myIndex = 0; myIndex < (256 * 8); myIndex ++ ) { // schrijf de data van de sprite weg naar het juiste geheugenadres. OAMdata[myIndex] = characterData[myIndex]; } while (1) { Invoer(); VerplaatsSprite(&Sprites[0],myX,myY); WachtOpVBlank(); KopieerOAM(); } // geef 0 als returnwaarde terug return 0; } |
can someone please tell me what's wrong about it. I'm stuck for about 36 hours at this problem now and I really would like to go on, so I really hope you guys can help me with this.
Thanks,
Dennis
_________________
I rather have a compiler than a girl... A compiler isn't complaining all the time!
Last edited by DennisBor on Sat Jan 18, 2003 2:55 pm; edited 1 time in total