int main(){ cout << "Création d'un monde à partir des données" << endl; Monde monde; for(int i=0;i<7;i++){ cout << "Carte " << i << endl; afficherCarte(monde.getCarte(i)); cout << endl << endl; } }
void Projectile::testAgrippe() { if (hauteur>0) return; Monde* gpMonde = gpJeu->getMonde(); Joueur* gpJoueur = gpJeu->getJoueur(); //SDL_Rect* z = gpJoueur->getZoneBase()->getZone(); switch (direction) { case N: if(gpMonde->murValue(x+zx+(zw/2), y+zy) == BOIS) { vie=0; gpJoueur->setY(y+zy-3-4-4); while (!gpJoueur->verifZone()) gpJoueur->moveY(2); gpJoueur->setTypeAnim(AUCUNE); gpJeu->testFin(); gpJeu->verifZoneJoueur(gpJoueur->getX(), gpJoueur->getY()+8, 16, 16, 2); return; } break; case S: if(gpMonde->murValue(x+zx+(zw/2), y+zy+zh-1) == BOIS) { vie=0; gpJoueur->setY(y+zy-17); while (!gpJoueur->verifZone()) gpJoueur->moveY(-2); gpJoueur->setTypeAnim(AUCUNE); gpJeu->verifZoneJoueur(gpJoueur->getX(), gpJoueur->getY()+8, 16, 16, 2); gpJeu->testFin(); return; } break; case O: if(gpMonde->murValue(x+zx, y+zy+(zh/2)) == BOIS) { vie=0; gpJoueur->setX(x+zx+1); while (!gpJoueur->verifZone()) gpJoueur->moveX(2); gpJoueur->setTypeAnim(AUCUNE); gpJeu->verifZoneJoueur(gpJoueur->getX(), gpJoueur->getY()+8, 16, 16, 2); gpJeu->testFin(); return; } break; case E: if(gpMonde->murValue(x+zx+zw-1, y+zy+(zh/2)) == BOIS) { vie=0; gpJoueur->setX(x+zx-9); while (!gpJoueur->verifZone()) gpJoueur->moveX(-2); gpJoueur->setTypeAnim(AUCUNE); gpJeu->verifZoneJoueur(gpJoueur->getX(), gpJoueur->getY()+8, 16, 16, 2); gpJeu->testFin(); return; } break; } }
void Objet::draw(SDL_Surface* gpScreen) { int phg[2]; phg[0] = gpJeu->getPhg(0); phg[1] = gpJeu->getPhg(1); Joueur* gpJoueur = gpJeu->getJoueur(); Monde* gpMonde = gpJeu->getMonde(); int val = gpMonde->motifValue(x+8,y+8); if (type && vie && (val<30 || val>39)) { SDL_Rect src; src.h = h; src.w = w; SDL_Rect dst; dst.x = x-phg[0]; dst.y = y-phg[1]; switch(type) { case I_RUBIS_VERT : src.x = anim*16; src.y = 17; break; case I_RUBIS_BLEU : src.x = 48 + anim*16; src.y = 17; break; case I_RUBIS_ROUGE : src.x = anim*16; src.y = 34; break; case I_PETIT_COEUR : src.x = 48; src.y = 34; break; case I_FLECHE : if (gpJoueur->hasObjet(O_ARC) < 5) {src.x = 64; src.y = 34;} if (gpJoueur->hasObjet(O_ARC) == 5) {src.x = 208; src.y = 17;} break; case I_BOMBE : src.x = 0; src.y = 0; break; case I_MAGIE_PEU : src.x = 80; src.y = 34; break; case I_MAGIE_BCP : src.x = 96; src.y = 34; break; case I_QUART_COEUR : src.x = 80; src.y = 0; break; case I_COEUR : src.x = 64; src.y = 0; break; case I_EPEE : src.x = 96; src.y = 17; break; case I_CRISTAL : src.x = anim*16; src.y = 51; break; case I_EXCALIBUR : src.x = 160;src.y = 0; src.h = 22; src.w = 16; break; case I_PETITE_CLE : src.x = 32; src.y = 0; break; case I_TRIFORCE : src.x = 166; src.y = 26; src.h = 25;src.w = 26; break; case I_ARC : src.x = 144; src.y = 34; break; } w=src.w; h=src.h; SDL_BlitSurface(image, &src, gpScreen, &dst); if(max){ if(SDL_GetTicks() > lastAnimTime + vanim) { lastAnimTime = SDL_GetTicks(); anim++; if (anim > max) anim = 0; } } } if (suivant != NULL) if (((Objet*)suivant)->vie == 0) enleve(suivant); if (suivant != NULL) ((Objet*)suivant)->draw(gpScreen); }
void Projectile::move(int dx, int dy) { if ((id == 1 || id == 2) && max > 0) return; Monde* gpMonde = gpJeu->getMonde(); if (x+dx+zx <= gpMonde->regionValue(0) || x+dx+zx+zw >= gpMonde->regionValue(2) || y+dy+zy <= gpMonde->regionValue(1) || y+dy+zy+zh >= gpMonde->regionValue(3)) { fin(); return; } if (id == 3) testAgrippe(); int valeur=0; bool obstacle = false; switch (direction) { case N: valeur = gpMonde->murValue(x+dx+zx+(zw/2), y+dy+zy+4); if (valeur == PLEIN || valeur == BOIS) obstacle = true; else if (valeur == BAS || valeur == BAS_GAUCHE || valeur == BAS_DROITE) hauteur--; else if (valeur == HAUT || valeur == HAUT_GAUCHE || valeur == HAUT_DROITE) hauteur++; break; case S: valeur = gpMonde->murValue(x+dx+zx+(zw/2), y+dy+zy+zh-1-4); if (valeur == PLEIN || valeur == BOIS) obstacle = true; else if (valeur == BAS || valeur == BAS_GAUCHE || valeur == BAS_DROITE) hauteur++; else if (valeur == HAUT || valeur == HAUT_GAUCHE || valeur == HAUT_DROITE) hauteur--; break; case O: valeur = gpMonde->murValue(x+dx+zx+4, y+dy+zy+(zh/2)); if (valeur == PLEIN || valeur == BOIS) obstacle = true; else if (valeur == DROITE || valeur == HAUT_DROITE || valeur == BAS_DROITE) hauteur--; else if (valeur == GAUCHE || valeur == HAUT_GAUCHE || valeur == BAS_GAUCHE) hauteur++; break; case E: valeur = gpMonde->murValue(x+dx+zx+zw-1-4, y+dy+zy+(zh/2)); if (valeur == PLEIN || valeur == BOIS) obstacle = true; else if (valeur == DROITE || valeur == HAUT_DROITE || valeur == BAS_DROITE) hauteur++; else if (valeur == GAUCHE || valeur == HAUT_GAUCHE || valeur == BAS_GAUCHE) hauteur--; break; } if (((obstacle && !hauteur) || hauteur < 0 || (chmax>0 && chemin>=chmax)) && etape == 1) { fin(); }else { x+=dx; y+=dy; if (etape==1) chemin++; else chemin--; if (id == 3 && chemin <= 0) { vie = 0; gpJeu->getJoueur()->setTypeAnim(AUCUNE);} } }
void Mobile::bouge(void) { string debugMessage("L'élément "); debugMessage.append(this->getNom()); debugMessage.append(" est en train de bouger."); OutputDebugString(L"Bouge\n"); Monde* monde = Monde::getInstance(); bool coordTrouve = false; DIRECTIONS dir = NORD; Position nouvellePos(this->getPosition()); int i = 0; // On tire une direction au hasard entre 0 et 5 int rand = std::rand() % 6; // Tant que on a pas trouvé de coordonnées valide et que l'on ne les // a pas toutes testés while(!coordTrouve && i < 6) { nouvellePos = calculerNouvelleCoordonnees(this->getPosition(), (DIRECTIONS) rand); // Si la case est libre (et qu'elle existe) if(Monde::getInstance()->isCaseLibre(nouvellePos)) { coordTrouve = true; } if(rand == 5) { rand = 0; } else { rand++; } i++; } // Si l'élément n'a pas été bloqué on le déplace if(coordTrouve) { // On change la position de l'élément monde->deplacerElement(this, nouvellePos); } else { OutputDebugString(L"Element bloqué !\n"); } }
void Humain::agir() { CIBLE cible = NOURRITURE; // Si le stock de nourriture est en dessous du seuil if(Village::nourriture < Config::alerte_nourriture) { cible = NOURRITURE; } else if (Village::bois < Config::alerte_bois) { cible = BOIS; } else { cible = REPRODUCTION; } // On recherche la cible la plus proche Position positionCible = this->chercherPlusPres(cible); Monde* monde = Monde::getInstance(); bool trouver = false; for(unsigned int i = 0; i < this->getVitesse() && !trouver; i++) { // On trouve la direction adapté pour se rendre à la cible la plus proche DIRECTIONS directionCible = this->calculerDirectionPourAllerPosition(positionCible); Position nouvellePos = this->calculerNouvelleCoordonnees(this->getPosition(), directionCible); // Si la position sur laquelle on est , n'est pas déjà la bonne if(nouvellePos != this->getPosition()) { // On vérifie si il y ades ressource à obtenir // Si il ya un sanglier sur sa case et que l'homme cherche de la nourriture if(cible == NOURRITURE && monde->getTypeOccupant(nouvellePos) == SANGLIER) { // Si la position existe dans la map if(monde->getCarte().count(nouvellePos) > 0) { Element* aSupprimer = (*monde)[monde->getCarte()[nouvellePos]]; Monde::getInstance()->supprimerElement(aSupprimer); Village::recevoirNourriture(Config::sanglier_nourriture_donnee); trouver = true; // on sort de la boucle vu qu'on a attein l'objectif } // On vérifie si il y ades ressource à obtenir // Si il ya un abre sur sa case et que l'homme cherche de la bois }else if ( cible == BOIS && monde->getTypeOccupant(nouvellePos) == ARBRE){ int indiceElement = monde->getCarte()[nouvellePos]; Element* aSupprimer = (*monde)[indiceElement]; Monde::getInstance()->supprimerElement(aSupprimer); Village::recevoirBois(Config::arbre_bois_donnee); trouver = true; } // On consomme des ressources Village::consomerBois(); Village::consomerNourriture(); // On bouge this->bouger(directionCible); } } }
void Snipe::fin() { if (id == 7) { Monde* gpMonde = gpJeu->getMonde(); int valeur = gpMonde->murValue((int)(x+anglx), (int)y); bool obstacleX = (valeur == PLEIN || valeur == BOIS); valeur = gpMonde->murValue((int)x, (int)(y+angly)); bool obstacleY = (valeur == PLEIN || valeur == BOIS); if (obstacleX && obstacleY) {anglx=-anglx; angly=-angly; return;} if (x+anglx <= gpMonde->regionValue(0) || x+anglx >= gpMonde->regionValue(2) || obstacleX) { anglx=-anglx; return; } if (y+angly <= gpMonde->regionValue(1) || y+angly >= gpMonde->regionValue(3) || obstacleY) { angly=-angly; return; } return; } vie = 0; }
void Snipe::depl() { Monde* gpMonde = gpJeu->getMonde(); if (x+anglx <= gpMonde->regionValue(0) || x+anglx >= gpMonde->regionValue(2) || y+angly <= gpMonde->regionValue(1) || y+angly >= gpMonde->regionValue(3)) { fin(); return; } int valeur = gpMonde->murValue((int)(x+anglx), (int)(y+angly)); bool obstacle = (valeur == PLEIN || valeur == BOIS); if (angly < 0) { if (valeur == BAS || valeur == BAS_GAUCHE || valeur == BAS_DROITE) hauteur--; else if (valeur == HAUT || valeur == HAUT_GAUCHE || valeur == HAUT_DROITE) hauteur++; } if (angly > 0) { if (valeur == BAS || valeur == BAS_GAUCHE || valeur == BAS_DROITE) hauteur++; else if (valeur == HAUT || valeur == HAUT_GAUCHE || valeur == HAUT_DROITE) hauteur--; } if (anglx < 0) { if (valeur == DROITE || valeur == HAUT_DROITE || valeur == BAS_DROITE) hauteur--; else if (valeur == GAUCHE || valeur == HAUT_GAUCHE || valeur == BAS_GAUCHE) hauteur++; } if (anglx > 0) { if (valeur == DROITE || valeur == HAUT_DROITE || valeur == BAS_DROITE) hauteur++; else if (valeur == GAUCHE || valeur == HAUT_GAUCHE || valeur == BAS_GAUCHE) hauteur--; } if ((obstacle && !hauteur) || hauteur < 0 ) fin(); else { for (int i = 0; i < 7; i++) { historique[7-i][0]=historique[6-i][0]; historique[7-i][1]=historique[6-i][1]; } historique[0][0]=x; historique[0][1]=y; x+=anglx; y+=angly; } }