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;
	}
}
예제 #2
0
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;
    }
}
예제 #3
0
파일: Objet.cpp 프로젝트: eduardok/ZeldaOLB
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);
}
예제 #4
0
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);}
    }
}
예제 #5
0
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");
	}

	
}
예제 #6
0
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);

		}
	}
}
예제 #7
0
파일: Snipe.cpp 프로젝트: eduardok/ZeldaOLB
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;
}
예제 #8
0
파일: Snipe.cpp 프로젝트: eduardok/ZeldaOLB
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;
    }
}