// Keep the dart stationary relative to the dartboard (move with the dartboard), also allows dart to // scroll off the screen, hides any darts that are entirely off the screen void Dart::UpdateDart(int BGPos[]) { int actualloc[2]; bool wrapping[2] = {false, false}; actualloc[0] = loc[0] - BGPos[0]-2*8; actualloc[1] = loc[1] - BGPos[1]-2*8; if (actualloc[0] < 0) { actualloc[0] += 512; wrapping[0] = true; } if (actualloc[1] < 0) { actualloc[1] += 256; wrapping[1] = true; } Animate(); if ((wrapping[0] == true && actualloc[0]+8*8 < 512) || (wrapping[1] == true && actualloc[1]+8*8 < 256) || (wrapping[0] == false && actualloc[0] > SCREEN_WIDTH) || (wrapping[1] == false && actualloc[1] > SCREEN_HEIGHT)) { SetObject(dartnumber, ATTR0_SHAPE(0) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(0) | ATTR0_HIDE, ATTR1_SIZE(2) | ATTR1_X(0), ATTR2_ID8(64) | ATTR2_PRIO(2)); } else { SetObject(dartnumber, ATTR0_SHAPE(0) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(actualloc[1]) | ATTR0_AFF | ATTR0_AFF_DBL, ATTR1_SIZE(2) | ATTR1_X(actualloc[0]) | ATTR1_AFF(dartnumber-1), ATTR2_ID8(64) | ATTR2_PRIO(2)); } }
void spawnMonster(){ bool type = true; bool dir = true; if(rand()%3 == 0)type = false; if(rand()%2 == 0)dir = false; int startFrame = 32; if(type)startFrame = 16; int i = 0; if(enemies.size() < MAX_ENEMIES){ enemies.push_back(Monster(116,0,type)); i = enemies.size()-1; }else{ for(int k = 0; k < MAX_ENEMIES; k++){ if(enemies.at(k).isDead()){ enemies[k] = Monster(116,0,type); i = k; break; } } } SetObject(i+3, ATTR0_SHAPE(0) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(enemies.at(i).getY()), ATTR1_SIZE(!type) | ATTR1_X(enemies.at(i).getX()), ATTR2_ID8(startFrame)); enemies.at(i).setDir(dir); }
void drawText(int x, int y, std::string string){ int startPos = activeLetters; for(int i = 0; i < string.length(); i++){ activeLetters++; SetObject(startPos+i+45, ATTR0_SHAPE(0) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(y), ATTR1_SIZE(0) | ATTR1_X(x+(i*8)), ATTR2_ID8(string.at(i) + 64)); } }
void gameInit(){ (&player)->~Player(); new (&player) Player(116,76); for(int i = 0; i < enemies.size(); i++){ enemies.at(i).setDead(true); } for(int i = 0; i < bullets.size(); i++){ bullets.at(i).setDead(true); } (&crate)->~Crate(); new (&crate) Crate(0,0,0); weapon = 1; score = 0; //Set-up Objects ClearObjects(); //Weapon int shape = 0; if(weapon == 8)shape = 1; SetObject(0, ATTR0_SHAPE(shape) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(player.getY()+1), ATTR1_SIZE(0) | ATTR1_X(player.getX()+4), ATTR2_ID8(22+weapon)); //Crate SetObject(1, ATTR0_SHAPE(0) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(crate.getY()), ATTR1_SIZE(0) | ATTR1_X(crate.getX()), ATTR2_ID8(14)); //Player SetObject(2, ATTR0_SHAPE(0) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(player.getY()), ATTR1_SIZE(0) | ATTR1_X(player.getX()), ATTR2_ID8(1)); }
Cursor(int objId) { _id = objId; SetObject(_id, ATTR0_SHAPE(0) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(0), ATTR1_SIZE(1) | ATTR1_X(0), ATTR2_ID8(0)); _x = 0; _y = 0; SetObjectX(_id, (_x + BOARD_OFFSET_X / 2) * 16); SetObjectY(_id, (_y + BOARD_OFFSET_Y / 2) * 16); }
int spawnBullet(int type){ int i = 0; int count = 0; if(bullets.size() < MAX_BULLETS){ bullets.push_back(Bullet(player.getX(), player.getY(), type, weapon)); i = bullets.size()-1; }else{ for(int k = 0; k < MAX_BULLETS; k++){ if(bullets.at(k).getType() == 7)count++; if(bullets.at(k).isDead()){ if(type == 7){ if(player.getDir())bullets[k] = Bullet(player.getX()+(count*8),player.getY(),type, weapon); else bullets[k] = Bullet(player.getX()-(count*8),player.getY(),type, weapon); i = k; }else{ bullets[k] = Bullet(player.getX(),player.getY(),type, weapon); i = k; } break; } } } SetObject(i+24, ATTR0_SHAPE(0) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(bullets.at(i).getY()), ATTR1_SIZE(0) | ATTR1_X(bullets.at(i).getX()), ATTR2_ID8(bullets.at(i).getFrame())); bullets.at(i).setDir(player.getDir()); if(!bullets.at(i).getDir()){ ObjBuffer[i+24].attr1 |= ATTR1_HFLIP; } return i; }
/** Updates all gba objects in Level */ void Level::UpdateLevelObjects(int framecounter) { DetermineBackgroundOffsets(); ApplyEntityOffsets(); REG_BG2HOFS = backgroundoffsetx; REG_BG2VOFS = backgroundoffsety; uint16_t facing = 0; if (player.direction == player.LEFT) { facing = ATTR1_HFLIP; } int playertileoffset = 0; if (player.IsMoving()) { if ((framecounter % 15 == 0) && ((!paused) || (!indimensionsmenu))) { player.animationframe = !player.animationframe; } if (player.animationframe == true) { playertileoffset = 2; } else { playertileoffset = 4; } } if (player.isholding) { //Allows for height change when carrying cubes on the head SetObject(player.GetObjNum(), ATTR0_SHAPE(2) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(player.drawy + cube[player.cubeheld].GetHeight()), ATTR1_SIZE(2) | ATTR1_X(player.drawx) | facing, ATTR2_ID8(playertileoffset) | ATTR2_PRIO(2)); } else { SetObject(player.GetObjNum(), ATTR0_SHAPE(2) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(player.drawy), ATTR1_SIZE(2) | ATTR1_X(player.drawx) | facing, ATTR2_ID8(playertileoffset) | ATTR2_PRIO(2)); } int cubetile = 6 + DimensionTileOffset(curdimension); //Draw cubes for (int i = 0; i < numofcubes; i++) { SetObject(cube[i].GetObjNum(), ATTR0_SHAPE(0) | ATTR0_8BPP | ATTR0_REG | ATTR0_Y(cube[i].drawy), ATTR1_SIZE(1) | ATTR1_X(cube[i].drawx), ATTR2_ID8(cubetile) | ATTR2_PRIO(2)); } UpdateObjects(); }
int main() { // Set display options. // DCNT_MODE0 sets mode 0, which provides four tiled backgrounds. // DCNT_OBJ enables objects. // DCNT_OBJ_1D make object tiles mapped in 1D (which makes life easier). REG_DISPCNT = DCNT_MODE0 | DCNT_BG0 | DCNT_BG1 | DCNT_BG2 | DCNT_OBJ; REG_BG0CNT = BG_CBB(0) | BG_SBB(30) | BG_8BPP | BG_REG_32x32 | BG_PRIO(0); REG_BG1CNT = BG_CBB(0) | BG_SBB(29) | BG_8BPP | BG_REG_32x32 | BG_PRIO(1); REG_BG2CNT = BG_CBB(0) | BG_SBB(25) | BG_8BPP | BG_REG_64x64 | BG_PRIO(2); REG_BG2HOFS = 0; REG_BG2VOFS = 0; ClearObjects(); SetPaletteBG(1, RGB(31, 31, 31)); // white //Load each tile in font_bold into it's corresponding position in charblock 0 for (int i = 0; i < 128; i++) { LoadTile8(0, i, font_bold[i]); } DrawText(5, (SCREEN_HEIGHT / 16) - 2, "DECEPTIVE DIMENSIONS"); DrawText(5, (SCREEN_HEIGHT / 16), "Press start to begin"); Buttons buttons; int framecounter = 0; //Title screen (under construction) while (true) { buttons.Update(); if (buttons.StartJustPressed()) { break; } WaitVSync(); } while (true) { //Load Custom spritesheet LoadPaletteObjData(0, spritesheet4Pal, sizeof spritesheet4Pal); LoadPaletteBGData(0, backgroundnewnewPal, sizeof backgroundnewnewPal); LoadTileData(4, 0, spritesheet4Tiles, sizeof spritesheet4Tiles); LoadTileData(0, 0, backgroundnewnewTiles, sizeof backgroundnewnewTiles); int levelnumber = 1; Level level(levelnumber); for (int screenblock = 21; screenblock < 31; screenblock++) { level.FillScreenblock(screenblock, 0); } level.DrawBackground(level.curdimension); bool gamerunning = true; //Main game loop while (gamerunning) { buttons.Update(); gamerunning = level.CheckIfLevelComplete(); level.TakeInput(buttons); level.MoveObjects(); level.Draw(); level.UpdateLevelObjects(framecounter); framecounter++; WaitVSync(); FlipBuffers(); } //Reload each tile in font_bold into it's corresponding position in charblock 0 for (int i = 0; i < 128; i++) { LoadTile8(0, i, font_bold[i]); } SetPaletteBG(0, RGB(0, 0, 0)); // black SetPaletteBG(1, RGB(31, 31, 31)); // white for (int screenblock = 25; screenblock < 31; screenblock++) { for (int y = 0; y < 32; y++) { for (int x = 0; x < 32; x++) { SetTile(screenblock, x, y, 0); } } } level.player.drawx = SCREEN_WIDTH; SetObject(level.player.GetObjNum(), ATTR0_SHAPE(2) | ATTR0_8BPP | ATTR0_HIDE, ATTR1_SIZE(2) | ATTR1_X(level.player.drawx), ATTR2_ID8(0) | ATTR2_PRIO(2)); UpdateObjects(); DrawText(6, (SCREEN_HEIGHT / 16) - 2, "That's all folks!!"); DrawText(3, (SCREEN_HEIGHT / 16), "Press start to try again"); while (true) { buttons.Update(); if (buttons.StartJustPressed()) { break; } WaitVSync(); } } }
int main() { init(); enterMenu(0); int cloudScroll = 0; int loopSlower = 0; bool shootCoolDown = true; int reloadTimer = 0; //GAME LOOP while (true) { //INPUT if((REG_KEYINPUT & KEY_RIGHT) == 0){ tryMove(2,0,player.getWidth()-2,player.getHeight()/2,player); player.setRunning(true); player.setDir(true); } if((REG_KEYINPUT & KEY_LEFT) == 0){ tryMove(-2,0,0,player.getHeight()/2,player); player.setRunning(true); player.setDir(false); } if((REG_KEYINPUT & KEY_UP) == 0 || (REG_KEYINPUT & KEY_B) == 0){ if(player.getLanded()){ player.jump(); player.updateFrame(); } player.setJumpHeight(player.getJumpHeight()+4); } if((REG_KEYINPUT & KEY_A) == 0){ if(shootCoolDown){ if(weapon == 8){ if(player.getDir())tryMove(-2,0,0,player.getHeight()/2,player); else tryMove(2,0,player.getWidth()-2,player.getHeight()/2,player); }else if(weapon == 1){ if(player.getDir())tryMove(-1,0,0,player.getHeight()/2,player); else tryMove(1,0,player.getWidth()-2,player.getHeight()/2,player); } shoot(); shootCoolDown = false; reloadTimer = 0; } } //Player movement if(player.getJumping()){ if(!tryMove(0,-3,player.getWidth()/2,0,player)){ player.setJumping(false); } }else{ if(!tryMove(0,2,player.getWidth()/2,player.getHeight(),player)){ tryMove(0,1,player.getWidth()/2,player.getHeight(),player); player.setLanded(true); player.setJumping(false); }else{ player.setLanded(false); } } //Monster Movement for(int i = 0; i < enemies.size(); i++){ if(!enemies.at(i).isDead()){ if(enemies.at(i).getDir()){ if(!tryMove(1,0,enemies.at(i).getWidth(),(enemies.at(i).getHeight()/2)+1,enemies.at(i))){ enemies.at(i).setDir(false); } }else{ if(!tryMove(-1,0,0,(enemies.at(i).getHeight()/2)+1,enemies.at(i))){ enemies.at(i).setDir(true); } } tryMove(0,2,enemies.at(i).getWidth()/2,enemies.at(i).getHeight(),enemies.at(i)); ObjBuffer[i+3].attr0 &= ~(ATTR0_HIDE); }else{ ObjBuffer[i+3].attr0 |= ATTR0_HIDE; } } //Bullet movement for(int i = 0; i < bullets.size(); i++){ if(!bullets.at(i).isDead()){ int yMove = 0; if(rand() % 3 == 0)yMove = bullets.at(i).getLift(); if(bullets.at(i).getType() == 4){ tryMove(0,1,bullets.at(i).getWidth(),bullets.at(i).getHeight()+4,bullets.at(i)); }else if(bullets.at(i).getType() == 6){ if(player.getDir()){ ObjBuffer[i+24].attr1 &= ~(ATTR1_HFLIP); bullets.at(i).move(player.getX()+8, player.getY()); }else{ ObjBuffer[i+24].attr1 |= ATTR1_HFLIP; bullets.at(i).move(player.getX()-8, player.getY()); } if(bullets.at(i).charge()){ bullets.at(i).setDead(true); int number = 0; if(player.getDir())number = (SCREEN_WIDTH - player.getX())/8; else number = (0 + player.getX())/8; for(int i = 0; i < number; i++){ spawnBullet(7); } } }else if(bullets.at(i).getType() == 7){ if(bullets.at(i).charge())bullets.at(i).setDead(true); }else{ if(bullets.at(i).getDir()){ if(!tryMove(2,yMove,bullets.at(i).getWidth(), bullets.at(i).getHeight(), bullets.at(i))){ if(bullets.at(i).getType() == 3 && !bullets.at(i).getBounce()){ bullets.at(i).setBounce(true); bullets.at(i).setDir(false); }else{ bullets.at(i).setDead(true); if(bullets.at(i).getType() == 0 || bullets.at(i).getType() == 4){ explode(bullets.at(i).getX(), bullets.at(i).getY()); } } } }else{ if(!tryMove(-2,yMove,bullets.at(i).getWidth(), bullets.at(i).getHeight(), bullets.at(i))){ if(bullets.at(i).getType() == 3 && !bullets.at(i).getBounce()){ bullets.at(i).setBounce(true); bullets.at(i).setDir(true); }else{ bullets.at(i).setDead(true); if(bullets.at(i).getType() == 0 || bullets.at(i).getType() == 4){ explode(bullets.at(i).getX(), bullets.at(i).getY()); } } } } } ObjBuffer[i+24].attr0 &= ~(ATTR0_HIDE); }else{ ObjBuffer[i+24].attr0 |= ATTR0_HIDE; } } for(int i = 0; i < enemies.size(); i++){ if(!enemies.at(i).isDead()){ if(checkEntityCollision(player, enemies.at(i))){ player.setDead(true); } for(int k = 0; k < bullets.size(); k++){ if(!bullets.at(k).isDead()){ if(checkEntityCollision(bullets.at(k), enemies.at(i))){ enemies.at(i).hurt(bullets.at(k).getDamage()); if(bullets.at(k).getType() != 3 && bullets.at(k).getType() != 6 && bullets.at(k).getType() != 7){ bullets.at(k).setDead(true); if(bullets.at(k).getType() == 0 || bullets.at(k).getType() == 4){ explode(bullets.at(k).getX(), bullets.at(k).getY()); } } break; } } } } } if(checkEntityCollision(player, crate)){ crate.setDead(true); weapon = crate.getWeapon(); score++; } if(crate.isDead()){ switch(rand() % 7){ case 0:crate.move(80,32); break; case 1:crate.move(150,32); break; case 2:crate.move(30,64); break; case 3:crate.move(200,64); break; case 4:crate.move(115,104); break; case 5:crate.move(80,144); break; case 6:crate.move(150,144); break; } int newWep = 0; do newWep = rand() % 9; while(newWep == weapon || newWep == 6); crate.setWeapon(newWep); crate.setDead(false); } //General Slow things if(loopSlower % 7 == 0){ cloudScroll++; REG_BG3HOFS = cloudScroll; SetTile(30, 14, 19, 16+rand()%5); SetTile(30, 15, 19, 16+rand()%5); player.updateFrame(); for(int i = 0; i < enemies.size(); i++){ if(!enemies.at(i).isDead()){ enemies.at(i).updateFrame(); } } ObjBuffer[2].attr2 = ATTR2_ID8(player.getFrame()); for(int i = 0; i < enemies.size(); i++){ ObjBuffer[i+3].attr2 = ATTR2_ID8(enemies.at(i).getFrame()); } } reloadTimer++; if(weapon == 0 || weapon == 5 || weapon == 6 || weapon == 7){ if(reloadTimer >= 60){ shootCoolDown = true; } }else if(weapon == 2 || weapon == 4){ if(reloadTimer >= 45){ shootCoolDown = true; } }else if (weapon == 3){ if(reloadTimer >= 20){ shootCoolDown = true; } }else if(weapon == 1){ if(reloadTimer >= 10){ shootCoolDown = true; } }else{ if(reloadTimer >= 5){ shootCoolDown = true; } } if(reloadTimer > 1000)reloadTimer = 60; //Monster spawner if(rand()%100 == 0){ spawnMonster(); } //Player state updates if(player.getJumping())player.setState(2); else if(player.getRunning())player.setState(1); else player.setState(0); if(!player.getDir()){ ObjBuffer[0].attr1 |= ATTR1_HFLIP; ObjBuffer[2].attr1 |= ATTR1_HFLIP; }else{ ObjBuffer[0].attr1 &= ~(ATTR1_HFLIP); ObjBuffer[2].attr1 &= ~(ATTR1_HFLIP); } if(weapon == 8)ObjBuffer[0].attr0 |= ATTR0_SHAPE(1); else ObjBuffer[0].attr0 &= ~(ATTR0_SHAPE(1)); ObjBuffer[0].attr2 = ATTR2_ID8(22+weapon); for(int i = 0; i < enemies.size(); i++){ if(!enemies.at(i).isDead()){ if(!enemies.at(i).getDir())ObjBuffer[i+3].attr1 |= ATTR1_HFLIP; else ObjBuffer[i+3].attr1 &= ~(ATTR1_HFLIP); } } player.update(); if(player.isDead())enterMenu(2); //Render if(!player.getDir()){ if(weapon != 8)SetObjectX(0, player.getX()-4); else{ if(player.getX()-12 <= 0) SetObjectX(0, 0); else SetObjectX(0, player.getX()-12); } }else{ SetObjectX(0, player.getX()+4); } SetObjectY(0, player.getY()+1); SetObjectX(1, crate.getX()); SetObjectY(1, crate.getY()); SetObjectX(2, player.getX()); SetObjectY(2, player.getY()); for(int i = 0; i < enemies.size(); i++){ if(!enemies.at(i).isDead()){ SetObjectX(i+3, enemies.at(i).getX()); SetObjectY(i+3, enemies.at(i).getY()); } } for(int i = 0; i < bullets.size(); i++){ if(!bullets.at(i).isDead()){ SetObjectX(i+24, bullets.at(i).getX()); SetObjectY(i+24, bullets.at(i).getY()); } } drawText(112,10,toString(score)); WaitVSync(); UpdateObjects(); clearText(); loopSlower++; } return 0; }