#include "marbleenemy.h" void MarbleEnemy::init_posizione(float x, float y, float z) { vet_compon_controllo.Zero(); vet_posizione[0]= x + 0.5; vet_posizione[1]= y + 0.5; vet_posizione[2]= z + 0.5; palla_viva=true; // setta la palla viva muro_di_morte = 4; //inizializza la var che determina se la pallina si e' spiaccicata su un muro(0..3) o sul pavimento (4) vet_velocita.Zero(); //==================intell=============== vista_impedita=false;//booleani che determinano se c'e' la mappa tra la palla e l'enemy e se c'e' un precipizio nel percorso cado=false; //============================== //=============texture=========== // init_texture=false; //============================*/ } void MarbleEnemy::Draw(int option) {glMatrixMode(GL_MODELVIEW); Point3f zero; zero[XX]=0; zero[YY]=0; zero[ZZ]=0; glLoadIdentity(); glTranslatef(vet_posizione[0],vet_posizione[1],vet_posizione[2]); glBindTexture(GL_TEXTURE_2D,ti); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); if (palla_viva) { glRotatef(angolo_rotazione,vettore_rotazione[0],vettore_rotazione[1],vettore_rotazione[2]); switch(option) { case SOLID: glDisable(GL_TEXTURE_2D); case TEXTURED: CreateSphere(zero,0.5,30); break; default: CreateSphere(zero,0.35,30); case WIREFRAME: //glTranslatef(vet_posizione[0],vet_posizione[1],vet_posizione[2]-0.75); glDisable(GL_TEXTURE_2D); glutWireSphere(0.5,10,10); //glTranslatef(-vet_posizione[0],-vet_posizione[1],-vet_posizione[2]-0.75); break; } glEnable(GL_TEXTURE_2D); } else { glEnable(GL_TEXTURE_2D); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // glColor3f(0,1,0); switch (muro_di_morte) { case 0: glTranslatef(vet_posizione[0],vet_posizione[1],vet_posizione[2]-0.75); //zero[ZZ]=-0.75; CreateSphere(zero,0.4,0); break; case 1: glTranslatef(vet_posizione[0]+0.75,vet_posizione[1],vet_posizione[2]); glRotatef(90,0,1,0); //zero[XX]=+0.75; break; case 2: glTranslatef(vet_posizione[0],vet_posizione[1],vet_posizione[2]+0.75); break; case 3: glTranslatef(vet_posizione[0]-0.75,vet_posizione[1],vet_posizione[2]); glRotatef(90,0,1,0); break; case 4: glTranslatef(vet_posizione[0],vet_posizione[1]-0.5,vet_posizione[2]); glRotatef(90,1,0,0); //zero[YY]=-0.5; break; } CreateSphere(zero,0.35,30); glDisable(GL_TEXTURE_2D); glutWireTorus(0.35,0.25,20,20); } glEnable(GL_TEXTURE_2D); } MarbleEnemy::MarbleEnemy(void) { float circonferenza = 0.5*0.5*M_PI; angolo_rotazione=0.0; lung_arco_per_grado =circonferenza/360.0; attrito=ATTRITONORMALE; tocca_mappa_piana = true; tocca_mappa_inclinata = true; } MarbleEnemy::~MarbleEnemy(void) { } //modifica il vet_compon_controllo void MarbleEnemy::Intelligenza(MarbleSphere *ball,MadMap *mp,MarbleEnemy enemy[]) { //vettore direzione che il nemico prende se rileva la palla Point3f direzione; //distanza dalla palla del player float distanza; float norma_velocita; //Punto usato per capire se enemy vede la palla del giocatore nonostante la distanza //oppure se sta andando verso un precipizio Point3f punto_di_controllo; //vettore supporto per capire gli incrementi da dare alle componeti del vet punto di //controllo in modo tale che sia sempre spvrapposto al vet posizione Point3f incremento; //altezza della mappa nel punto(x,z) considerato float livello_del_suolo; float dislivello; direzione=(ball->vet_posizione -vet_posizione); distanza=direzione.Norm();//Norm( direzione ); //printf("distanza %f,\n",distanza); punto_di_controllo = vet_posizione; // printf("direzione_x direzione_y direzione_z %f, %f, %f\n",direzione.x(),direzione.y(),direzione.z()); //Calcolo dll'incremento per il controllo della mappa lungo la direzione incremento= (ball->vet_posizione -vet_posizione)/distanza; //printf("incremento_x incremento_y incremento_z %f, %f, %f\n",incremento.x(),incremento.y(),incremento.z()); //collision tra nemici for (int i=0;i<MAXENEMY;i++) { if (enemy[i].vet_posizione != vet_posizione) { Point3f direzione_tra_enemy = enemy[i].vet_posizione -vet_posizione; float distanza_tra_enemy=direzione_tra_enemy.Norm(); if( distanza_tra_enemy < 1.0 ) { vet_posizione=(enemy[i].vet_posizione + ( -( direzione_tra_enemy.Normalize() ) ) ); vet_velocita=-vet_velocita; enemy[i].vet_velocita=-(enemy[i].vet_velocita); } } } //rimbalzo tra palline nemiche e palla del giocatore if (distanza<1.0) { vet_posizione=(ball->vet_posizione+(-(direzione.Normalize()))); vet_velocita=-vet_velocita; ball->vet_velocita=-vet_velocita; } //se la distanza e` minore del RAGGIO_SENSORIALE si sposta verso la palla del giocatore //a meno che non sia in vista o ci sia un precipizio in lungo la direzione if (distanza < (float)RAGGIO_SENSORIALE) { for (int i=1;i<(int)ceil((double)distanza);i++) { //printf("loooooooooop"); punto_di_controllo= punto_di_controllo+incremento; livello_del_suolo=(mp->getY(punto_di_controllo.x(),punto_di_controllo.z())); // printf("livello del suolo %f,\n",(float)livello_del_suolo); if(livello_del_suolo > (punto_di_controllo.y())) vista_impedita=true; dislivello = punto_di_controllo.y() -livello_del_suolo; //printf("dislivello %f,\n",dislivello); if( dislivello > 6.0 ) cado=true; } if ((vista_impedita==false) && (cado==false )) { vet_compon_controllo= direzione*15; vet_compon_controllo.y()=0; //printf("sentita pallina \n"); } } norma_velocita=vet_velocita.Norm();//Norm(vet_velocita); //se la distanza e` maggiore di 7 e si muove gia si ferma velocemente if ((distanza > (float)RAGGIO_SENSORIALE)&&(norma_velocita>0.0)&&(tocca_mappa_piana || tocca_mappa_inclinata))//||(cado=true)||(vista_impedita=true)) { vet_velocita=vet_velocita/1.1; //vet_compon_controllo= direzione*2; //vet_compon_controllo.y()=0; } vista_impedita=false; cado=false; }