int main() { setupInterrupts(); setupSounds(); playSoundA(titleSong, TITLESONGLEN, TITLESONGFREQ, 1); // Start game with splash screen splash(); // Main Game Loop while (1) { oldButtons = buttons; buttons = BUTTONS; // Update player row and column player.bigRow = player.row + vOff; player.bigCol = player.col + hOff; switch(state) { case SPLASH: // Displays splash screen splash(); break; case INSTRUCTIONS: instructions(); break; case GAME: // Game Function holds all game logic game(); break; case SEASONCHANGE: // Warp-like animation as player changes between seasons warpAnimation(); // Change game to correct season, based on prevSeason and return to gameplay if (vBlankCount < 1) { seasonChange(); state = GAME; } break; case PAUSE: pause(); break; case LOSE: lose(); break; case WINLEVEL: winLevel(); break; case GAMEEND: gameEnd(); break; } // Shadow OAM Handling // Player Sprite shadowOAM[0].attr0 = (ROWMASK & player.row) | ATTR0_SQUARE; shadowOAM[0].attr1 = (COLMASK & player.col) | ATTR1_SIZE16 | (ATTR1_HFLIP & (player.facing << 12)); shadowOAM[0].attr2 = (SPRITEOFFSET16(season * 2, player.currentFrame * 2)) | ATTR2_PRIORITY2; // Season Icon Sprite shadowOAM[1].attr0 = (ROWMASK & icon.row) | ATTR0_SQUARE; shadowOAM[1].attr1 = (COLMASK & icon.col) | ATTR1_SIZE16; shadowOAM[1].attr2 = (SPRITEOFFSET16(season * 2, 6)) | (1 << 10); // Priority 1 REG_BG2HOFS = hOff; REG_BG2VOFS = vOff; // Set BG1 offsets - used for snow and falling leaves REG_BG1HOFS = bg1HOff; REG_BG1VOFS = bg1VOff; //Copy the shadowOAM into the OAM DMANow(3, &shadowOAM, OAM, 512); waitForVblank(); } return 0; }
int main(void) { //Initializing Program variables int i; int visible = 1; int press = 1; int oldSprite = 0; int currentSprite = 0; ObjAttr shadowOAM[128]; REG_DISPCTL = MODE0 | BG0_ENABLE | OBJ_ENABLE; // Load background palette for(i=0; i<256; i++) { PALETTE[i] = backgroundPal[i]; } // Load background tile images for(i=0; i<backgroundTilesLen/2; i++) { CHARBLOCKBASE[0].tileimg[i] = backgroundTiles[i]; } //Make Map for(i=0; i<1024; i++) { SCREENBLOCKBASE[28].tilemap[i] = 1; } REG_BG0CNT = SBB(28) | CBB(0) | COLOR256 | BG_SIZE0; //Define Sprites Sprite sprites[NUMSPRITES] = {{16,16,SPRITEOFFSET16(0,0),ATTR0_SQUARE,ATTR1_SIZE32,32,32,1,1}, {0,0,SPRITEOFFSET16(0,8),ATTR0_SQUARE,ATTR1_SIZE32,32,32,1,1}, {0,0,SPRITEOFFSET16(0,16),ATTR0_SQUARE,ATTR1_SIZE32,32,32,1,1}, {5,100,SPRITEOFFSET16(0,24),ATTR0_SQUARE,ATTR1_SIZE32,32,32,1,1}, {0,0,SPRITEOFFSET16(4,0),ATTR0_SQUARE,ATTR1_SIZE32,32,32,1,1}, {0,0,SPRITEOFFSET16(4,8),ATTR0_SQUARE,ATTR1_SIZE32,32,32,1,1}, {0,0,SPRITEOFFSET16(4,16),ATTR0_SQUARE,ATTR1_SIZE32,32,32,1,1}, {0,0,SPRITEOFFSET16(4,16),ATTR0_SQUARE,ATTR1_SIZE32,32,32,1,1}}; // Load sprite palette for(i=0; i<256; i++) { SPRITEPAL[i] = spritePalette[i]; } // Load sprite images for(i=0; i<8192/2; i++) { CHARBLOCKBASE[4].tileimg[i] = spriteTiles[i]; } // Set attributes for all active sprites for(i=0; i<NUMSPRITES; i++) { shadowOAM[i].attr0 = sprites[i].row | ATTR0_8BPP | sprites[i].shape; shadowOAM[i].attr1 = sprites[i].col | sprites[i].size; shadowOAM[i].attr2 = sprites[i].start | ATTR2_PALETTE_BANK(0); } //Hide Sprites for(i=0; i<128; i++) { shadowOAM[i].attr0 = ATTR0_HIDE; } waitForVblank(); //Move Sprites to Mem for(i=0; i<128; i++) { SPRITEMEM[i] = shadowOAM[i]; } while(FOREVER) { //Check for Movement and change direction if(KEY_DOWN_NOW(BUTTON_UP)) { shadowOAM[currentSprite].attr0 = ATTR0_HIDE; sprites[currentSprite].row -= sprites[currentSprite].rdel; oldSprite = currentSprite; currentSprite = 2; sprites[currentSprite].col = sprites[oldSprite].col; sprites[currentSprite].row = sprites[oldSprite].row; } if(KEY_DOWN_NOW(BUTTON_DOWN)) { shadowOAM[currentSprite].attr0 = ATTR0_HIDE; sprites[currentSprite].row += sprites[currentSprite].rdel; oldSprite = currentSprite; currentSprite = 0; sprites[currentSprite].col = sprites[oldSprite].col; sprites[currentSprite].row = sprites[oldSprite].row; } if(KEY_DOWN_NOW(BUTTON_LEFT)) { shadowOAM[currentSprite].attr0 = ATTR0_HIDE; sprites[currentSprite].col -= sprites[currentSprite].cdel; oldSprite = currentSprite; currentSprite = 6; sprites[currentSprite].col = sprites[oldSprite].col; sprites[currentSprite].row = sprites[oldSprite].row; } if(KEY_DOWN_NOW(BUTTON_RIGHT)) { shadowOAM[currentSprite].attr0 = ATTR0_HIDE; sprites[currentSprite].col += sprites[currentSprite].cdel; oldSprite = currentSprite; currentSprite = 5; sprites[currentSprite].col = sprites[oldSprite].col; sprites[currentSprite].row = sprites[oldSprite].row; } //Check for second sprites visibility if(KEY_DOWN_NOW(BUTTON_START) && press) { if(visible) visible = 0; else visible = 1; waitForVblank(); press = 0; } if(!KEY_DOWN_NOW(BUTTON_START)) { press = 1; } //Collision Detection if(sprites[currentSprite].row < HEIGHTMIN) { sprites[currentSprite].row = HEIGHTMIN; } if(sprites[currentSprite].col < WIDTHMIN) { sprites[currentSprite].col = WIDTHMIN; } if(sprites[currentSprite].row + sprites[currentSprite].height > HEIGHTMAX) { sprites[currentSprite].row = HEIGHTMAX - sprites[currentSprite].height; } if(sprites[currentSprite].col + sprites[currentSprite].width > WIDTHMAX) { sprites[currentSprite].col = WIDTHMAX - sprites[currentSprite].width; } //Move Sprites to Memory shadowOAM[currentSprite].attr0 = sprites[currentSprite].row | ATTR0_8BPP | sprites[currentSprite].shape; shadowOAM[currentSprite].attr1 = (MASK&sprites[currentSprite].col) | sprites[currentSprite].size; shadowOAM[currentSprite].attr2 = sprites[currentSprite].start | ATTR2_PALETTE_BANK(0); if(visible) { shadowOAM[3].attr0 = sprites[3].row | ATTR0_8BPP | sprites[3].shape; shadowOAM[3].attr1 = (MASK&sprites[3].col) | sprites[3].size; shadowOAM[3].attr2 = sprites[3].start | ATTR2_PALETTE_BANK(0); } else { shadowOAM[3].attr0 = ATTR0_HIDE; } waitForVblank(); for(i=0; i<NUMSPRITES; i++) { SPRITEMEM[i] = shadowOAM[i]; } } return 0; }
//=====================Main int main(void) { //Set Video Control REG_DISPCNT = BG2_ENABLE | BG1_ENABLE | BG0_ENABLE | MODE_0 | OBJ_ENABLE; //tells the Background 0 control register //where the screen map is, the tiles, the color, and size0=256x256 //background 1 is the collision map REG_BG0CNT= CBB(0) | SBB(8) | COLOR16 | BG_SIZE0; REG_BG1CNT= CBB(2) | SBB(10) | COLOR16 | BG_SIZE2; REG_BG2CNT= CBB(3) | SBB(12) | COLOR16 | BG_SIZE2; //sets the BG's vertical and horz offsets to 0 REG_BG0HOFS=0; REG_BG0VOFS=20; REG_BG1HOFS=0; REG_BG1VOFS=0; REG_BG2HOFS=0; REG_BG2VOFS=0; int i; int speed=3; int hoff=0; int voff=0; //loads the picture pallet //This is the same for all backgrounds for(i=0;i<background0PalLen/2;i++) PALETTE_MEM[i]=background0Pal[i]; //===========================================Sprites ObjAttr shadowOAM[128]; //defining sprites with room for more Sprite spriteArray[NUMSPRITES]={ {WALKINGROW, 16, SPRITEOFFSET16(0,0), ATTR0_TALL, ATTR1_SIZE64, 32, 64, TRUE} } typedef struct { int printRow; int printCol; int arrayLocation; int shape; int size; int height; int width; int active; } Sprite; //Loads sprite tiles for(i=0; i<characterSpritesTilesLen/2; i++) charbase[4].tileimg[i] = characterSpritesTiles[i]; //set attributes of the sprite in the duplicate mem for(i=0; i<NUMSPRITES; i++) { shadowOAM[i].attr0 = spriteArray[i].row | ATTR0_4BPP | spriteArray[i].shape; shadowOAM[i].attr1 = spriteArray[i].col | spriteArray[i].size; shadowOAM[i].attr2 = spriteArray[i].start | ATTR2_PALETTE_BANK(0); } //hides all sprites except for main guy for(i=0; i<128; i++) { if(!spriteArray[i].active) shadowOAM[i].attr0 = ATTR0_HIDE; } waitForVblank(); // Copy shadow into real for(i=0; i<128; i++) { SPRITEMEM[i] = shadowOAM[i]; } while(1) { //LOADS BACKGROUND 0 //loads all the tiles and collision map for(i=0;i<background0TilesLen/2;i++) charbase[3].tileimg[i]=background0Tiles[i]; //loads the map for(i=0;i<background0MapLen/2;i++) screenbase[12].tilemap[i]=background0Map[i]; //LOADS BACKGROUND 1 //loads all the tiles and collision map for(i=0;i<background1TilesLen/2;i++) charbase[2].tileimg[i]=background1Tiles[i]; //loads the map for(i=0;i<background1MapLen/2;i++) screenbase[10].tilemap[i]=background1Map[i]; //LOADS BACKGROUND 2 //loads all the tiles and collision map for(i=0;i<background2TilesLen/2;i++) charbase[0].tileimg[i]=background2Tiles[i]; //loads the map for(i=0;i<background2MapLen/2;i++) screenbase[8].tilemap[i]=background2Map[i]; // these keys move the background around the screen if(KEY_DOWN_NOW(BUTTON_RIGHT))hoff+=speed; if(KEY_DOWN_NOW(BUTTON_LEFT))hoff-=speed; if(KEY_DOWN_NOW(BUTTON_UP))voff-=speed; if(KEY_DOWN_NOW(BUTTON_DOWN))voff+=speed; REG_BG0HOFS=hoff; //REG_BG0VOFS=voff; REG_BG1HOFS=hoff/20; //REG_BG1VOFS=voff/20; waitForVBlank(); } return 0; }
#include "textEntry.h" //Program Variables const u16 *spriteTiles = cursorTiles; const u16 *spritePalette = cursorPal; //Sprite Variables ObjAttr shadowOAM[128]; Sprite sprites[NUMSPRITES] = {{8,0,SPRITEOFFSET16(0,0),ATTR0_SQUARE,ATTR1_SIZE8,8,8,1,8}}; int left = 1; int right = 1; int press = 1; int endInput = 0; int letterIndex = 0; int letterColumn = 0; //Timer Variables int theTime = 0; unsigned int vblankcount = 0; unsigned int start; // At which vlankcount was beep started unsigned int startBG; // At which vlankcount was background (bg) started int play = FALSE; // When set to TRUE tells us to start beep int playBG = FALSE; // This tell us if the BG is supposed to be playing int BGplaying = FALSE; // This tells us if it is playing // Duration in vlanks...there are 59.727 vlanks per second int duration = BEEPLENGTH*59.727/11025; int durationBG = FLUTELEN*59.727/FLUTEFREQ-1; //Draws Keyboard void drawKeyboard() {
int main(void) { while(1) { previousSpriteState = spriteState; pollKeys(); enableSounds(); setupInterrupts(); switch(state) { case SPLASH: { REG_DISPCNTL = BG2_ENABLE | MODE3; fillPicture((u16 *)splashBitmap); if (BUTTON_PRESSED(START_BUTTON)) { state = GAME; } if (BUTTON_PRESSED(SELECT_BUTTON)) { state = INSTRUCTIONS; } break; } case INSTRUCTIONS: { fillPicture((u16 *)instructionsBitmap); if (BUTTON_PRESSED(SELECT_BUTTON)) { state = SPLASH; } break; } case GAME: { //load tiles DMA_MEMORY[3].source = backgroundTiles; DMA_MEMORY[3].destination = &CHARBLOCK[0]; DMA_MEMORY[3].control = 12000 | DMA_ON; //load map DMA_MEMORY[3].source = backgroundMap; DMA_MEMORY[3].destination = &SCREENBLOCK[27]; DMA_MEMORY[3].control = 4096 | DMA_ON; //load pallette DMA_MEMORY[3].source = backgroundPal; DMA_MEMORY[3].destination = PAL_MEM; DMA_MEMORY[3].control = 256 | DMA_ON; //load the sprites into memory DMA_MEMORY[3].source = playerTiles; DMA_MEMORY[3].destination = &CHARBLOCK[4]; DMA_MEMORY[3].control = 16384 | DMA_ON; DMA_MEMORY[3].source = playerPal; DMA_MEMORY[3].destination = SPRITE_PALETTE; DMA_MEMORY[3].control = 256 | DMA_ON; //Hide all sprites int i; for(i=0; i<128; i++) { OAM[i].attr0 |= ATTR0_HIDE; } //Set Mode 0 BG 0 and Enable sprites. then set up the sprites REG_DISPCNTL = MODE0 | BG0_ENABLE | SPRITE_ENABLE; REG_BG0CNT = BG_8BPP | BG_REG_64x64 | CBB(0) | SBB(27); REG_TM0CNT = 0; DMA[1].cnt = 0; REG_TM0D = timerintervalA; REG_TM0CNT = TIMER_ON; DMA[1].src = bgsound; DMA[1].dst = REG_FIFO_A; DMA[1].cnt = DMA_ON | START_ON_FIFO_EMPTY | DMA_32 | DMA_REPEAT | DMA_DESTINATION_FIXED; startA = vblankcountA; while(1){ shadowOAM[0].attr0 = (playerRow & MASKROW) | ATTR0_TALL | ATTR0_REGULAR | ATTR0_8BPP; shadowOAM[0].attr1 = (playerCol & MASKCOL)| ATTR1_SIZE32; shadowOAM[0].attr2 = (SPRITEOFFSET16(0,0)); shadowOAM[1].attr0 = badguyRow | ATTR0_TALL | ATTR0_REGULAR | ATTR0_8BPP; shadowOAM[1].attr1 = badguyCol | ATTR1_SIZE32; shadowOAM[1].attr2 = (SPRITEOFFSET16(0,8)); pollKeys(); bigRow = playerRow + vOff; bigCol = playerCol + hOff; switch(spriteState) { case STILL: { shadowOAM[0].attr2 = (SPRITEOFFSET16(0,0)); break; } case MOVING: { if((walkCounter%2)==1) shadowOAM[0].attr2 = (SPRITEOFFSET16(0,4)); else if((walkCounter%2==0)) { shadowOAM[0].attr2 = (SPRITEOFFSET16(0,0)); } break; } } if(BUTTON_HELD(A_BUTTON) && BUTTON_HELD(B_BUTTON)) { //load tiles DMA_MEMORY[3].source = cheatbackgroundTiles; DMA_MEMORY[3].destination = &CHARBLOCK[0]; DMA_MEMORY[3].control = 11456 | DMA_ON; //load map DMA_MEMORY[3].source = cheatbackgroundMap; DMA_MEMORY[3].destination = &SCREENBLOCK[27]; DMA_MEMORY[3].control = 4096 | DMA_ON; //load pallette DMA_MEMORY[3].source = cheatbackgroundPal; DMA_MEMORY[3].destination = PAL_MEM; DMA_MEMORY[3].control = 256 | DMA_ON; } if (BUTTON_HELD(RIGHT_BUTTON)) { spriteState=MOVING; walkCounter++; if(collisionmapBitmap[((bigRow+playerHeight)*collMapSize)+(bigCol+playerCVel+playerWidth)]==WHITE) { if(playerCol<(SCREEN_WIDTH-(playerWidth+5))){ playerCol+=playerCVel; } else if(hOff<(collMapSize-SCREEN_WIDTH)) { hOff+=playerCVel; } } } if (BUTTON_HELD(LEFT_BUTTON)) { spriteState=MOVING; walkCounter++; if(collisionmapBitmap[((bigRow+playerHeight)*collMapSize)+(bigCol+playerCVel)]==WHITE) { if(playerCol>(0)) { playerCol-=playerCVel; } else if(hOff>(SCREEN_WIDTH-collMapSize)) { hOff-=playerCVel; } } } if (BUTTON_HELD(UP_BUTTON)) { spriteState=MOVING; walkCounter++; //Check collision and move if((collisionmapBitmap[(((bigRow-playerRVel)*collMapSize)+(bigCol+playerWidth))]==WHITE)&& (collisionmapBitmap[(((bigRow-playerRVel)*collMapSize)+(bigCol))]==WHITE)) { if(playerRow>30) { playerRow-=playerRVel; } else if(vOff>0) { vOff-=playerRVel; } } } if (BUTTON_HELD(DOWN_BUTTON)) { spriteState=MOVING; walkCounter++; //Check collision and move if((collisionmapBitmap[(((bigRow+playerHeight+playerRVel)*collMapSize)+(bigCol+playerWidth))]==WHITE)&& (collisionmapBitmap[(((bigRow+playerHeight+playerRVel)*collMapSize)+(bigCol))]==WHITE)) { if(playerRow<(SCREEN_HEIGHT-(playerHeight))) { playerRow+=playerRVel; } else if(vOff<(collMapSize-SCREEN_HEIGHT)) { vOff+=playerRVel; } if((playerRow > 440) && (playerCol > 464)) { state = WIN; } } } if (BUTTON_PRESSED(START_BUTTON)) { REG_TM1CNT = 0; DMA[2].cnt = 0; REG_TM1D = timerintervalB; REG_TM1CNT = TIMER_ON; DMA[2].src = bark; DMA[2].dst = REG_FIFO_B; DMA[2].cnt = DMA_ON | START_ON_FIFO_EMPTY | DMA_32 | DMA_REPEAT | DMA_DESTINATION_FIXED; startB = vblankcountB; } if (BUTTON_PRESSED(SELECT_BUTTON)) { //waitForNoKey(); state = PAUSE; } waitForVBlank(); OAM[0] = shadowOAM[0]; OAM[1] = shadowOAM[1]; REG_BG0HOFS = hOff; REG_BG0VOFS = vOff; } } case WIN: { while(1); } case PAUSE: { if(BUTTON_PRESSED(SELECT_BUTTON)) { state=GAME; } } } } return 0; }