#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;
}