int chooseAlienToKill(int x, int y){ int i; int* alienBMP; for(i = 0; i < ALIEN_ROWS*ALIENS_PER_ROW; i++){ if(alienArray[i] > DEAD_ALIEN){ if((y >= (alienOriginY + i/ALIENS_PER_ROW*ALIEN_HEIGHT)) && (y < (alienOriginY + i/ALIENS_PER_ROW*ALIEN_HEIGHT+ALIEN_HEIGHT))){ //xil_printf("Made it into checking the alien Y bounds for alien %d.\n\r",i); int myLeftBound = alienOriginX + i%ALIENS_PER_ROW*ALIEN_WIDTH; int myRightBound = alienOriginX + i%ALIENS_PER_ROW*ALIEN_WIDTH+ALIEN_WIDTH; if((x >= (myLeftBound)) && (x < (myRightBound))){ if(DB_ON1){ xil_printf("You've hit alien %d! Blarg!\n\r",i);} /*alienArray[i] = DEAD_ALIEN; return 1;*/ switch(alienArray[i]){ case BIG_SQUID: alienBMP = (alienInOut == 0 ? bigSquidIn : bigSquidOut); addToScore(HIT_BIG_SQUID); break; case LITTLE_SQUID: alienBMP = (alienInOut == 0 ? littleSquidIn : littleSquidOut); addToScore(HIT_SMALL_SQUID); if(DB_ON1) xil_printf("We're in the little squid space.\n\r"); break; case JUMPING_JACK: alienBMP = (alienInOut == 0 ? jumpingJackIn : jumpingJackOut); addToScore(HIT_JUMPING_JACK); break; default: alienBMP = noAlien; break; } alienArray[i] = DEAD_ALIEN; //i like boys activeInvaderDieSound(); //activeInvaderDieSound(); drawAliens(); lastAlienKilled = i; return 1; } } } } return 0; }
void Player::bonusCollisionCheck() { if (!getExplosionState()){ //Bonus objects if (spriteCollision(&playerSprite, &getStarSprite())){ addToScore((500 * difficulty) * (hardcore + 1)); resetAdditionText(((500 * difficulty) * (hardcore + 1)) / 10, 0); playScoreSound(); resetStar(); } if (spriteCollision(&playerSprite, &getFuelSprite())){ increaseFuel(25); resetAdditionText(25, 2); playFuelSound(); resetFuelSprite(); playedShutdownSound = false; } if (spriteCollision(&playerSprite, &getHealthSprite())){ increaseHealth(10); resetAdditionText(10, 1); playHealSound(); resetHealthSprite(); } } }
//Fais passer le jeu au niveau suivant. //Ajouter ici des sons. void CJeu::niveauSuivant() { int i; addToScore(SC_NIVEAU); m_iNiveau+=1; makeChiffre(m_pNiveau,m_iNiveau); setDureeAttente(); m_iNbVies+=2; if (m_iNbVies>MAX_VIES) m_iNbVies=MAX_VIES; for (int i=0;i<MAX_BALLES;i++) { if (myBalle[i].getStatutBalle()==1) { myBalle[i].setSpeed(getVitesseBalle()); } } i=0; while (myBalle[i].getStatutBalle()==1) { i++; } if (m_iNbBalles<MAX_BALLES) { myBalle[i].startBalle(myRaquette.GetRect()->x + myRaquette.GetRect()->w/2,myRaquette.GetRect()->y-myBalle[0].GetRect()->h,getVitesseBalle()); m_iNbBalles++; } mySon.playEffet(S_NIVEAU); }
void GameScreen::update(float deltaTime) { for (std::vector<TouchEvent>::iterator itr = m_touchEvents.begin(); itr != m_touchEvents.end(); itr++) { if (m_touchEventsPool.size() < 50) { m_touchEventsPool.push_back(*itr); } } m_touchEvents.clear(); m_touchEvents.swap(m_touchEventsBuffer); m_touchEventsBuffer.clear(); m_backgroundElements->update(deltaTime); switch (m_gameState) { case RUNNING: updateRunning(deltaTime * m_timeButton->getSpeedScalar()); updateInputRunning(); if (World::getInstance()->getScoredEarnedThisFrame() > 0) { addToScore(World::getInstance()->getScoredEarnedThisFrame()); } if (World::getInstance()->getTimesCoreShipModuleHitThisFrame() > 0) { for (int i = 0; i < World::getInstance()->getTimesCoreShipModuleHitThisFrame(); i++) { coreShipModuleHit(); } } break; case PAUSED: updateInputPaused(); break; case GAME_OVER: updateInputGameOver(); break; } }
ScreenPoint tankBulletCollision(){//returns the number of the bunker you hit ScreenPoint myPoint; myPoint.xcoord = -1; myPoint.ycoord = -1; //check if in range of the aliens if(((tankBullet.y+BULLET_HEIGHT) >= alienOriginY) && (tankBullet.y <= (alienOriginY+ALIEN_HEIGHT*ALIEN_ROWS))){ int row, col; if(((tankBullet.x+BULLET_WIDTH) >= (alienOriginX + ALIEN_WIDTH * firstColAliveAliens)) && (tankBullet.x <= (alienOriginX + ALIEN_WIDTH * (lastColAliveAliens+1)))){ for(row = BULLET_HEIGHT-1; row >= 0; row--){ for(col = 0; col < BULLET_WIDTH; col++){ if((tankBulletSymbol[row % BULLET_HEIGHT] & (1<<(BULLET_WIDTH-1-col)))){ if(chooseAlienToKill(tankBullet.x + col, tankBullet.y + row)){ myPoint.xcoord = tankBullet.x + col; myPoint.ycoord = tankBullet.y + row; return myPoint; } } } } } } //check if in range of mothership if(((tankBullet.y+BULLET_HEIGHT) >= redSpaceshipOriginY) && (tankBullet.y <= (redSpaceshipOriginY+RED_SPACESHIP_HEIGHT))){ int row, col; if((((tankBullet.x+BULLET_WIDTH) >= redSpaceshipOriginX) && (tankBullet.x <= (redSpaceshipOriginX+RED_SPACESHIP_WIDTH)))){ for(row = BULLET_HEIGHT-1; row >= 0; row--){ for(col = 0; col < BULLET_WIDTH; col++){ if((tankBulletSymbol[row % BULLET_HEIGHT] & (1<<(BULLET_WIDTH-1-col)))){ if(destroyRedSpaceship(tankBullet.x + col, tankBullet.y + row)){ addToScore(HIT_RED_SPACESHIP); drawRedSpaceshipScore(YELLOW); myPoint.xcoord = tankBullet.x + col; myPoint.ycoord = tankBullet.y + row; return myPoint; } } } } } } //check if in the range of the bunkers if(((tankBullet.y+BULLET_HEIGHT) >= BUNKER_INITIAL_Y) && (tankBullet.y <= (BUNKER_INITIAL_Y+BUNKER_HEIGHT*3))){ int row, col; if((((tankBullet.x+BULLET_WIDTH) >= BUNKER0_INITIAL_X) && (tankBullet.x <= (BUNKER0_INITIAL_X+4*BUNKER_WIDTH)))){//bunker 0 for(row = BULLET_HEIGHT-1; row >= 0; row--){ for(col = 0; col < BULLET_WIDTH; col++){ if((tankBulletSymbol[row % BULLET_HEIGHT] & (1<<(BULLET_WIDTH-1-col)))){ if(chooseBunkerBlockToDamage(tankBullet.x + col, tankBullet.y + row)){ myPoint.xcoord = tankBullet.x + col; myPoint.ycoord = tankBullet.y + row; return myPoint; } /*if(framePointer0[(tankBullet.y + row)*640 + (tankBullet.x+col)] == GREEN){ myPoint.xcoord = tankBullet.x + col; myPoint.ycoord = tankBullet.y + row; return myPoint; }*/ } } } } else if((((tankBullet.x+BULLET_WIDTH) >= BUNKER1_INITIAL_X) && (tankBullet.x <= (BUNKER1_INITIAL_X+4*BUNKER_WIDTH)))){//bunker 1 for(row = BULLET_HEIGHT-1; row >= 0; row--){ for(col = 0; col < BULLET_WIDTH; col++){ if((tankBulletSymbol[row % BULLET_HEIGHT] & (1<<(BULLET_WIDTH-1-col)))){ if(chooseBunkerBlockToDamage(tankBullet.x + col, tankBullet.y + row)){ myPoint.xcoord = tankBullet.x + col; myPoint.ycoord = tankBullet.y + row; return myPoint; } /*if(framePointer0[(tankBullet.y + row)*640 + (tankBullet.x+col)] == GREEN){ myPoint.xcoord = tankBullet.x + col; myPoint.ycoord = tankBullet.y + row; return myPoint; }*/ } } } } else if((((tankBullet.x+BULLET_WIDTH) >= BUNKER2_INITIAL_X) && (tankBullet.x <= (BUNKER2_INITIAL_X+4*BUNKER_WIDTH)))){//bunker 2 for(row = BULLET_HEIGHT-1; row >= 0; row--){ for(col = 0; col < BULLET_WIDTH; col++){ if((tankBulletSymbol[row % BULLET_HEIGHT] & (1<<(BULLET_WIDTH-1-col)))){ if(chooseBunkerBlockToDamage(tankBullet.x + col, tankBullet.y + row)){ myPoint.xcoord = tankBullet.x + col; myPoint.ycoord = tankBullet.y + row; return myPoint; } /*if(framePointer0[(tankBullet.y + row)*640 + (tankBullet.x+col)] == GREEN){ myPoint.xcoord = tankBullet.x + col; myPoint.ycoord = tankBullet.y + row; return myPoint; }*/ } } } }else if((((tankBullet.x+BULLET_WIDTH) >= BUNKER3_INITIAL_X) && (tankBullet.x <= (BUNKER3_INITIAL_X+4*BUNKER_WIDTH)))){//bunker 3 for(row = BULLET_HEIGHT-1; row >= 0; row--){ for(col = 0; col < BULLET_WIDTH; col++){ if(chooseBunkerBlockToDamage(tankBullet.x + col, tankBullet.y + row)){ myPoint.xcoord = tankBullet.x + col; myPoint.ycoord = tankBullet.y + row; return myPoint; } /*if(framePointer0[(tankBullet.y + row)*640 + (tankBullet.x+col)] == GREEN){ myPoint.xcoord = tankBullet.x + col; myPoint.ycoord = tankBullet.y + row; return myPoint; }*/ } } } else{ return myPoint; //no collision } } //check if in range of the aliens else{ return myPoint; //no collision } return myPoint; }
//La gestion de la balle doit prendre en compte les différents éléments du terrain... Pas facile facile... //Il faut de plus détruire les briques touchées. void CJeu::deplacerBalle(const int& iElapsedTime) { int nbCaseDetruites; SDL_Rect* raqRect = myRaquette.GetRect(); int raqMidX=raqRect->x + raqRect->w/2; //Ajouter ici éventuellement une boucle pour gérer plusieurs balles. //Il faut gérer les collisions avec les briques, les murs, et la perte des balles. //Tous ceci se fait dans la fonction de déplacement de la balle. //On lui enverra en paramètre le terrain, pour qu'elle puisse procéder a ses test. for (int i=0;i<MAX_BALLES;i++) { if (myBalle[i].getStatutBalle()==1) { //Indique que la balle a été détruite. if (myBalle[i].deplacer(iElapsedTime,myTerrain,raqRect,mySon,myBonus)==true) { m_iNbBalles--; mySon.playEffet(S_PERDU_BALLE); } //Indique les destructions que la balle a causée. if (myTerrain.getBalleDestruction(nbCaseDetruites)==true) { mySon.playEffet(S_CASSE_LIGNE); addToScore(SC_LIGNE_BALLE); addLignes(1); } if (nbCaseDetruites!=0) {mySon.playEffet(S_CASSE_BRIQUE);} addToScore(nbCaseDetruites*SC_CASE_CASSEE); } } //On remet en jeu une nouvelle balle. //On baisse les vies. //+ animations ? if (m_iNbBalles==0 && m_iNiveau!=0) { m_iNbVies--; //Game Over !!!!! if (m_iNbVies==-1) { playing=false; } else { m_iNbBalles++; myBalle[0].startBalle(raqMidX,raqRect->y-myBalle[0].GetRect()->h,getVitesseBalle()); } } //Gestion des bonus est faites en même temps que la gestion des balles. int bonusObtenu[MAX_BONUS]; int nbBonus=myBonus.deplacerBonus(bonusObtenu, iElapsedTime, raqRect); if (nbBonus>0) { mySon.playEffet(S_GAGNE_BONUS); for (int i=0;i<nbBonus;i++) { addToScore(SC_BONUS); switch (bonusObtenu[i]) { case B_ADD_BALLE: if (m_iNbBalles<MAX_BALLES) { int i=0; while (myBalle[i].getStatutBalle()==1) { i++; } myBalle[i].startBalle(raqMidX,raqRect->y-myBonus.GetSurface()->h,getVitesseBalle()); m_iNbBalles++; } break; case B_ACC_BALLE: for (int i=0;i<MAX_BALLES;i++) { if (myBalle[i].getStatutBalle()==1) { myBalle[i].setSpeed(getVitesseBalle()+0.05); } } break; case B_RAL_BALLE: for (int i=0;i<MAX_BALLES;i++) { if (myBalle[i].getStatutBalle()==1) { double temp=getVitesseBalle()-0.2; if (temp<0.1) temp=0.1; myBalle[i].setSpeed(temp); } } break; case B_ADD_SCORE: addToScore(SC_BONUS_SCORE); break; case B_ADD_LIFE: if (m_iNbVies<MAX_VIES) m_iNbVies++; break; case B_DELETE_LINE: flipFigure(); //Supprime deux demi lignes. myTerrain.deleteLine(NBCASEY-1,false); myTerrain.deleteLine(NBCASEY-1,true); flipFigure(); break; case B_BLOQUE_STRAFE: //On bloque la figure latéralement pendant 10 secondes. m_iLastStrafe+=10000; break; case B_SMALL_RAQ: myRaquette.changerLargeur(1, myTerrain.GetRect()); modifRaquette=st_get_ticks(); break; case B_LARGE_RAQ: myRaquette.changerLargeur(4, myTerrain.GetRect()); modifRaquette=st_get_ticks(); break; case B_EXTRA_LARGE_RAQ: myRaquette.changerLargeur(10, myTerrain.GetRect()); modifRaquette=st_get_ticks(); break; case B_EXTRA_SMALL_RAQ: myRaquette.changerLargeur(0, myTerrain.GetRect()); modifRaquette=st_get_ticks(); break; } } } }
//déplacements de la figure. bool CJeu::allMoveFigure(int moveStrafe,bool bas,bool rotation, bool down) { long tempsActuel; int nbLignesFull; bool testDescente; int nbDescentes; bool nouvelleFigure=false; tempsActuel=st_get_ticks(); if (moveStrafe!=0) { if ((tempsActuel-m_iLastStrafe)>=2*m_iDureeStrafe) { m_iLastStrafe=tempsActuel+2*m_iDureeStrafe; if (myTerrain.moveFigure(moveStrafe,0)==true) mySon.playEffet(S_STRAFE); } else if ((tempsActuel-m_iLastStrafe)>=m_iDureeStrafe) { m_iLastStrafe=tempsActuel; if (myTerrain.moveFigure(moveStrafe,0)==true) mySon.playEffet(S_STRAFE); } } if (down==true) { nbDescentes=0; while (myTerrain.moveFigure(0,1)==true) { nbDescentes++; } addToScore(SC_DESCENTE*nbDescentes); //On force le test de descente d'une ligne, qui fait poser la pièce. m_iLastDescente=tempsActuel-m_iDureeAttente; } else { if (bas==true && ((tempsActuel-m_iLastChute)>=m_iDureeChute)) { m_iLastChute=tempsActuel; testDescente=myTerrain.moveFigure(0,1); if (testDescente==false) { m_iLastDescente=tempsActuel-m_iDureeAttente; } } } if (rotation==true) { if (myTerrain.rotationFigure()==true) mySon.playEffet(S_ROTATION); } if (tempsActuel-m_iLastDescente>=m_iDureeAttente) { m_iLastDescente=tempsActuel; if (myTerrain.moveFigure(0,1)==false) { nouvelleFigure=true; mySon.playEffet(S_POSE_BRIQUE); if (myTerrain.dropFigure()==true) { nbLignesFull=myTerrain.findFullLine(); myTerrain.findEmptyLine(); //Ne fais pas de points, car les lignes la ont été cassées en vol par le tetris. //Jouer eventuellement un son. switch (nbLignesFull) { case 0:break; case 1: addToScore(SC_LIGNE_1); mySon.playEffet(S_CASSE_LIGNE); break; case 2: addToScore(SC_LIGNE_2); mySon.playEffet(S_CASSE_LIGNE); break; case 3: addToScore(SC_LIGNE_3); mySon.playEffet(S_CASSE_LIGNE); break; case 4: addToScore(SC_LIGNE_4); mySon.playEffet(S_CASSE_LIGNE); break; } addLignes(nbLignesFull); //Vérifions maintenant si le terrain est vide. //Si c'est le cas, on va le remplir un peu pour rendre le jeu plus marant. if (myTerrain.isEmptyTerrain()==true) { myTerrain.rndFillTerrain(4); addToScore(SC_EMPTY_TERRAIN); } } else { playing=false; } } } return nouvelleFigure; }
void MGameMode::nextTurn(int addition) { addToScore(addition); }