#include "gameview.h"
GameView::LoadMap(char *map)
{
vcg::XmlDoc xml;
xml.read(map);
mp.XMLRead(xml.root());
//inizializza la posizione della pallina sopra la tile start della mappa caricata
ball.init_posizione( mp.Start.first.X, mp.Map[mp.Start.first.X][mp.Start.first.Z].C, mp.Start.first.Z);
//inizializza la posizione delle palline nemiche
for (int i=0;i<MAXENEMY;i++)
if( mp.Enemys[i].first.X != -1)
enemy[i].init_posizione( mp.Enemys[i].first.X,mp.Map[mp.Enemys[i].first.X][mp.Enemys[i].first.Z].C,mp.Enemys[i].first.Z);
camera.PositionCamera(ball.vet_posizione.x()+300,ball.vet_posizione.y()+300,ball.vet_posizione.z()+300,ball.vet_posizione.x(),ball.vet_posizione.y(),ball.vet_posizione.z(), 0, 1, 0);
//=================temporizazione================
conto_alla_rovescia = time_game;
//=============numero vite=======================
num_vite=3;
//===============================================
mp.CalcNorm(); //calcolo le normali della mappa
//=========inizializzazione texture==============
mp.InitTexture();
return 0;
}
GameView::GameView(void)
{
console.ListMap(".");
if (console.filemap[0]!='*')
LoadMap(console.filemap);
console.ListSphere(".");
currentmap=0;
fps=1;
time=0;
timebase=0;
frame=0;
x=1;
y=1;
b_right=false;
b_left=false;
k=0;
h=10;
v=1;
vl=1;
hl=20;
dt=0.1;
sns=40;
pause=true;
camerafollowball=false;
optionGraphics=TEXTURED;
time_game=180;
item=1;
menu=MENU_MAIN;
//=================temporizazione===============
conto_alla_rovescia = time_game;
//=============numero vite=======================
num_vite=3;
optionEnemy=ROBOT;
scontrol=ROLLCONTROL;
option_materiale=METALLO;
}
GameView::~GameView(void)
{
}
void GameView::Init(int option)
{
glClearColor( 0.0, 0.0, 0.0, 0.0 );
float gllight_0_pos[4]={1,1,0.0}; //posizione luce 0
float gllight_0_dir[4]={1,0,1}; //direzione di ill. luce 0
float specular_0[4]={0.8,0.8,0.8,0.8}; //caratteristiche luce 0
float ambient_0[4]={0.8,0.8,0.8,0.8};
float diffuse_0[4]={0.8,0.8,0.8,0.8};
float specular[4]={0.5,0.5,0.5,0.5}; // caratteristiche dei materiali
float ambient[4]={0.7,0.7,0.7,0.7};
float diffuse[4]={0.6,0.6,0.6,0.6};
switch(option)
{
case METALLO:
specular_0[0]=1; specular_0[1]=1; specular_0[2]=1; specular_0[3]=1; //caratteristiche luce 0
ambient_0[0]=0; ambient_0[1]=0; ambient_0[2]=0; ambient_0[3]=1;
diffuse_0[0]=0; diffuse_0[0]=0; diffuse_0[0]=0; diffuse_0[0]=1;
specular[0]=1; specular[1]=1; specular[2]=1; specular[3]=1; // caratteristiche dei materiali
ambient[0]=0; ambient[1]=0; ambient[2]=0; ambient[3]=1;
diffuse[0]=0; diffuse[1]=0; diffuse[2]=0; diffuse[3]=1;
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,33.0); //settaggio brillantezza
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
break;
case VETRO:
specular_0[0]=1; specular_0[1]=1; specular_0[2]=1; specular_0[3]=1; //caratteristiche luce 0
ambient_0[0]=0; ambient_0[1]=0; ambient_0[2]=0; ambient_0[3]=1;
diffuse_0[0]=0; diffuse_0[0]=0; diffuse_0[0]=0; diffuse_0[0]=1;
specular[0]=0.99; specular[1]=0.91; specular[2]=0.81; specular[3]=1; // caratteristiche dei materiali
ambient[0]=0.33; ambient[1]=0.22; ambient[2]=0.03; ambient[3]=1;
diffuse[0]=0.78; diffuse[1]=0.57; diffuse[2]=0.11; diffuse[3]=1;
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,27.8); //settaggio brillantezza
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
break;
case PLASTICA :
specular_0[0]=1; specular_0[1]=1; specular_0[2]=1; specular_0[3]=1; //caratteristiche luce 0
ambient_0[0]=0; ambient_0[1]=0; ambient_0[2]=0; ambient_0[3]=1;
diffuse_0[0]=1; diffuse_0[0]=1; diffuse_0[0]=1; diffuse_0[0]=1;
specular[0]=1; specular[1]=1; specular[2]=1; specular[3]=1; // caratteristiche dei materiali
ambient[0]=0; ambient[1]=0; ambient[2]=0; ambient[3]=1;
diffuse[0]=1; diffuse[1]=1; diffuse[2]=1; diffuse[3]=1;
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0); //settaggio brillantezza
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
break;
case LUMINOSO :
specular_0[0]=1; specular_0[1]=1; specular_0[2]=1; specular_0[3]=1; //caratteristiche luce 0
ambient_0[0]=1; ambient_0[1]=1; ambient_0[2]=1; ambient_0[3]=1;
diffuse_0[0]=1; diffuse_0[0]=1; diffuse_0[0]=1; diffuse_0[0]=1;
specular[0]=1; specular[1]=1; specular[2]=1; specular[3]=1; // caratteristiche dei materiali
ambient[0]=1; ambient[1]=1; ambient[2]=1; ambient[3]=1;
diffuse[0]=1; diffuse[1]=1; diffuse[2]=1; diffuse[3]=1;
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,100.0); //settaggio brillantezza
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
break;
default :
glDisable(GL_COLOR_MATERIAL);
}
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE , diffuse);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR ,specular);
glLightfv(GL_LIGHT0,GL_POSITION,gllight_0_pos );
glLightfv(GL_LIGHT0,GL_SPECULAR,specular_0 );
glLightfv(GL_LIGHT0,GL_AMBIENT,ambient_0);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse_0);
// Abilita il calcolo dell'illuminazione
glEnable(GL_LIGHTING);
// Abilita la luce GL_LIGHT0
glEnable(GL_LIGHT0);
// anche le normali attraversano la pipeline, quindi devono essere
// rinormalizzate, prima del calcolo dell'illuminazione, altrimenti
// il calcolo dell'illuminazione viene sbagliato.
glEnable(GL_NORMALIZE);
// Abilita il test sullo zbuffer e quindi l'eliminazione delle
// superfici nascoste
glEnable(GL_DEPTH_TEST);
mp.CalcNorm();
mp.InitTexture();
ball.setTexture(console.filesphere);
for (int i=0; i<MAXENEMY;i++)
{
enemy[i].setTexture(mp.Tex[mp.TexEnemy]);
}
}
void GameView::setKey(int key)
{
setSKey(key);
}
void GameView::setSKey(int key)
{
switch (key)
{
case GLUT_KEY_PAGE_UP: vl=vl-0.1;break;
case GLUT_KEY_PAGE_DOWN: vl=vl+0.1; break;
case GLUT_KEY_F1: glutFullScreen();
Reshape(glutGet(GLUT_WINDOW_WIDTH),glutGet(GLUT_WINDOW_HEIGHT));
break;
case GLUT_KEY_F2: SizeViewX=800; SizeViewY=600;
Reshape(SizeViewX,SizeViewY);
glutReshapeWindow(SizeViewX,SizeViewY);
glutPositionWindow(50,50);
break;
case GLUT_KEY_F3 :
case 27:
menu=10;
item=1;
Pause();
break;
case GLUT_KEY_F4:
camerafollowball=!camerafollowball;
break;
case GLUT_KEY_F5:
option_materiale = (option_materiale+1)%4;
Init(option_materiale);
break;
case GLUT_KEY_UP:
if (pause && (item>1)) item=item-1;
if (!pause) {
moveBall(C_UP);
}
break;
case GLUT_KEY_DOWN:
if (pause && (item<console.numitem)) item=item+1;
if (!pause) {moveBall(C_DOWN);}
break;
case GLUT_KEY_LEFT:
if (!pause) {moveBall(C_LEFT); }
break;
case GLUT_KEY_RIGHT:
if(!pause) {moveBall(C_RIGHT);}
break;
case 13: selectMenuItem(menu,item);
break;
}
if (vl>M_PI-0.1) vl=M_PI-0.1;
if (vl<0.1) vl=0.1;
}
void GameView::selectMenuItem(int m, int i)
{
char *s;
char str[120];
printf("%s",console.selitem);
if (!pause) return;
if (m==MENU_MAP)
{
currentmap=i-1;
console.map[i-1].copy(str,console.map[i-1].npos);
s=strstr(str,".mnm");
s[4]='\0';
LoadMap(str);
}
if (m==MENU_BALL)
{
char str[120];
console.sphere[i-1].copy(str,console.sphere[i-1].npos);
s=strstr(str,".jpg");
s[4]='\0';
ball.setTexture(str);
}
else
switch(m+i)
{
case MENU_GOAL + ITEM_GOAL:
currentmap=currentmap+1;
if (currentmap>=console.nummap) currentmap=0;
console.map[currentmap].copy(str,console.map[currentmap].npos);
pause=false;
s=strstr(str,".mnm");
s[4]='\0';
LoadMap(str);
break;
case MENU_TIMEOUT+ ITEM_DEAD:
case MENU_DEAD + ITEM_DEAD:
ball.init_posizione( mp.Start.first.X, mp.Map[mp.Start.first.X][mp.Start.first.Z].C, mp.Start.first.Z);
num_vite--;
pause=false;
menu=MENU_MAIN;
conto_alla_rovescia=time_game;
item=1;
if (num_vite <=0) { menu=MENU_GAMEOVER;
pause=true;}
break;
case MENU_GAMEOVER+ ITEM_GAMEOVER:
menu=MENU_MAIN;
ball.init_posizione( mp.Start.first.X, mp.Map[mp.Start.first.X][mp.Start.first.Z].C, mp.Start.first.Z);
num_vite=3;
currentmap=0;
console.map[currentmap].copy(str,console.map[currentmap].npos);
pause=false;
s=strstr(str,".mnm");
s[4]='\0';
LoadMap(str);
item=1;
pause=true;
conto_alla_rovescia=time_game;
break;
case MENU_PAUSE + ITEM_MAIN_START:
case MENU_MAIN + ITEM_MAIN_START: pause=false;break;
case MENU_PAUSE + ITEM_MAIN_MAP:
case MENU_MAIN + ITEM_MAIN_MAP: menu=MENU_MAP;item=1;break;
case MENU_PAUSE + ITEM_MAIN_DISPLAY:
case MENU_MAIN + ITEM_MAIN_DISPLAY: menu=MENU_DISPLAY;item=1;break;
case MENU_PAUSE + ITEM_MAIN_CAMERA:
case MENU_MAIN + ITEM_MAIN_CAMERA: menu=MENU_CAMERA;item=1;break;
case MENU_PAUSE + ITEM_MAIN_GRAPHICS:
case MENU_MAIN + ITEM_MAIN_GRAPHICS: menu=MENU_GRAPHICS;item=1;break;
case MENU_PAUSE + ITEM_MAIN_BALL:
case MENU_MAIN + ITEM_MAIN_BALL: menu=MENU_BALL;item=1;break;
case MENU_PAUSE + ITEM_MAIN_CONTROL:
case MENU_MAIN + ITEM_MAIN_CONTROL: menu=MENU_CONTROL;item=1;break;
case MENU_PAUSE + ITEM_MAIN_TIMER:
case MENU_MAIN + ITEM_MAIN_TIMER: menu=MENU_TIMER;item=1;break;
case MENU_PAUSE + ITEM_EXIT:
case MENU_MAIN + ITEM_EXIT: exit(0);break;
default:
case MENU_MAP + ITEM_MAP_BACK: menu=MENU_MAIN; item=1;break;
case MENU_DISPLAY+ ITEM_DISPLAY_W_640x480:
SizeViewX=640; SizeViewY=480;
Reshape(SizeViewX,SizeViewY);
glutReshapeWindow(SizeViewX,SizeViewY);
glutPositionWindow(50,50);
break;
case MENU_DISPLAY+ ITEM_DISPLAY_W_800x600:
SizeViewX=800; SizeViewY=600;
Reshape(SizeViewX,SizeViewY);
glutReshapeWindow(SizeViewX,SizeViewY);
glutPositionWindow(50,50);
break;
case MENU_DISPLAY+ ITEM_DISPLAY_W_1024x768:
SizeViewX=1024; SizeViewY=768;
Reshape(SizeViewX,SizeViewY);
glutReshapeWindow(SizeViewX,SizeViewY);
glutPositionWindow(50,50);
break;
case MENU_DISPLAY+ ITEM_DISPLAY_FULLSCREEN:
glutFullScreen();
Reshape(glutGet(GLUT_WINDOW_WIDTH),glutGet(GLUT_WINDOW_HEIGHT));
break;
case MENU_DISPLAY+ ITEM_DISPLAY_BACK: menu=MENU_MAIN;item=1;break;
case MENU_CAMERA+ ITEM_CAMERA_FOLLOW :camerafollowball=true;break;
case MENU_CAMERA+ ITEM_CAMERA_NFOLLOW:camerafollowball=false;break;
case MENU_CAMERA+ ITEM_CAMERA_BACK: menu=MENU_MAIN;item=1;break;
case MENU_BALL + ITEM_BALL_METAL: Init(METALLO);break;
case MENU_BALL + ITEM_BALL_GLASS: Init(VETRO);break;
case MENU_BALL + ITEM_BALL_PLASTIC: Init(PLASTICA);break;
case MENU_BALL + ITEM_BALL_SHINING: Init(LUMINOSO);break;
case MENU_BALL + ITEM_BALL_BACK: menu=MENU_MAIN;item=1;break;
case MENU_CONTROL+ ITEM_CONTROL_ROLL: scontrol=ROLLCONTROL;break;
case MENU_CONTROL+ ITEM_CONTROL_LUKE: scontrol=LUKECONTROL;break;
case MENU_CONTROL+ ITEM_CONTROL_SNS20: sns=20;break;
case MENU_CONTROL+ ITEM_CONTROL_SNS40: sns=40;break;
case MENU_CONTROL+ ITEM_CONTROL_SNS60: sns=60;break;
case MENU_CONTROL+ ITEM_CONTROL_SNS80: sns=80;break;
case MENU_CONTROL+ ITEM_CONTROL_BACK: menu=MENU_MAIN;item=1;break;
case MENU_TIMER + ITEM_TIMER_100: time_game=100;conto_alla_rovescia=time_game;break;
case MENU_TIMER + ITEM_TIMER_300: time_game=300;conto_alla_rovescia=time_game;break;
case MENU_TIMER + ITEM_TIMER_600: time_game=600;conto_alla_rovescia=time_game;break;
case MENU_TIMER + ITEM_TIMER_UNLIMITED:time_game=65000;conto_alla_rovescia=time_game;break;
case MENU_TIMER + ITEM_TIMER_BACK: menu=MENU_MAIN;item=1;break;
case MENU_GRAPHICS+ ITEM_GRAPHICS_TEXTURED:
optionGraphics=TEXTURED;
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glTexEnvi( GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
break;
case MENU_GRAPHICS+ ITEM_GRAPHICS_SOLID:
optionGraphics=SOLID;
glDisable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
break;
case MENU_GRAPHICS+ ITEM_GRAPHICS_WIREFRAME:
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHT0);
glDisable(GL_LIGHTING);
optionGraphics=WIREFRAME;
break;
case MENU_GRAPHICS+ ITEM_GRAPHICS_ROBOT:optionEnemy=ROBOT;break;
case MENU_GRAPHICS+ ITEM_GRAPHICS_NOROBOT:optionEnemy=NOROBOT;break;
case MENU_GRAPHICS+ ITEM_GRAPHICS_BACK: menu=MENU_MAIN;item=1;break;
case MENU_GRAPHICS+ ITEM_GRAPHICS_NORMAL:
optionGraphics=TEXTURED;
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glTexEnvi( GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
break;
case MENU_GRAPHICS+ ITEM_GRAPHICS_ENV: menu=MENU_ENV;item=1;break;
case MENU_ENV + ITEM_ENV_DEFAULT:
option_materiale=DEFAULT;
Init(option_materiale);
break;
case MENU_ENV + ITEM_ENV_METAL:
option_materiale=METALLO;
Init(option_materiale);
break;
case MENU_ENV + ITEM_ENV_GLASS:
option_materiale=VETRO;
Init(option_materiale);
break;
case MENU_ENV + ITEM_ENV_PLASTIC:
option_materiale=PLASTICA;
Init(option_materiale);
break;
case MENU_ENV + ITEM_ENV_SHINING:
option_materiale=LUMINOSO;
Init(option_materiale);
break;
}
}
void GameView::setSKeyUp(int key)
{}
void GameView::Reshape(int w, int h)
{
SizeViewX=w;
SizeViewY=h;
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if(SizeViewY == 0) SizeViewX = 1;
float ratio = 1.0* SizeViewX / SizeViewY;
// Reset the coordinate system before modifying
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Set the viewport to be the entire window
glViewport(0, 0, SizeViewX , SizeViewY);
// Set the correct perspective.
gluPerspective(45,ratio,1,1000);
}
void GameView::moveCamera(void)
{
if (!pause)
{
float tmp_k, tmp_h;
float a= 2*M_PI*(x-ox)/SizeViewX;
tmp_k=k+a;
float b= 25*(oy-y)/(float)SizeViewY;
tmp_h=h+b;
if (tmp_h<1.5) tmp_h=1.5;
if (tmp_h>25) tmp_h=25;
if (mp.getY((camera.m_vPosition.x()+camera.m_vView.x()+sin(v)*tmp_h*sin(tmp_k))/2,(camera.m_vPosition.z()+camera.m_vView.z()+sin(v)*tmp_h*cos(tmp_k))/2)+1<
(camera.m_vPosition.y()+ball.vet_posizione.y()+cos(v)*tmp_h)/2)
{
hl=h;
kl=k;
k=tmp_k;
h=tmp_h;
}
else
{
h=hl; k=kl;
}
}
}
int GameView::Draw(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-100,100,-100,100,-100,100);
// Inizializzazione della Modelview Matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//==============================camera draw=============================
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(55.0f,(GLfloat)SizeViewX/(GLfloat)SizeViewY, .5f, 150.0f);
camera.Draw();
//======================================================================
//========================mappa draw====================================
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
mp.Draw(optionGraphics);
//=======================================================================
//========================enemy draw=====================================
for (int i=0;i<MAXENEMY;i++)
{
if( mp.Enemys[i].first.X != -1) enemy[i].Draw(optionGraphics+optionEnemy);
}
//=======================================================================
//==========================palla draw===================================
ball.Draw(optionGraphics);
//=======================================================================
if (!pause)
{
console.glPrintf(SizeViewX/2,5,1,12,false,"life:%d - Time:%d -Fps:%d",num_vite,conto_alla_rovescia,fps );
console.DrawBox(0,0,SizeViewX,20,false);
}
else
{
console.setSize(SizeViewX,SizeViewY);
console.menu(menu,item);
console.glPrintf(SizeViewX/2,5,1,12,false,"life:%d -Fps:%d",num_vite, fps,conto_alla_rovescia );
console.DrawBox(0,0,SizeViewX,20,false);
}
glFlush();
glutSwapBuffers();
return 0;
}
void GameView::moveBall(int type)
{
Point3f comp;
float j,n,a,b,vx,vz;
float ca;
switch(type)
{
case ROLLCONTROL:
j=(x-ox);
n=(y-oy);
if (j>sns) j=sns;
if (j<-sns) j=-sns;
if (n>sns) n=sns;
if (n<-sns) n=-sns;
a=(j)/(float) SizeViewX;
b=(n)/(float) SizeViewY;
vx=(-a*sin(k)+b*cos(k))*sns*1000*dt;
vz=(b*sin(k)+a*cos(k))*sns*1000*dt;
if (camerafollowball) {
ca=-2*M_PI*(x-ox)/SizeViewX;
kl=kl+ca;}
comp[2]=vx;
comp[0]=vz;
comp[1]=0;
break;
case C_UP:
vx=(0.0*sin(k)-0.1*cos(k))*sns/dt;
vz=(-0.1*sin(k)+0.0*cos(k))*sns/dt;
comp[2]=vx;
comp[0]=vz;
comp[1]=0;
break;
case C_DOWN:
vx=(0.0*sin(k)+0.1*cos(k))*sns/dt;
vz=(0.1*sin(k)+0.0*cos(k))*sns/dt;
comp[2]=vx;
comp[0]=vz;
comp[1]=0;
break;
case C_RIGHT:
vx=(-0.1*sin(k)+0*cos(k))*sns/dt;
vz=(0*sin(k)+0.1*cos(k))*sns/dt;
comp[2]=vx;
comp[0]=vz;
comp[1]=0;
if (camerafollowball) {
ca=-2*M_PI*0.1;
kl=kl+ca;}
break;
case C_LEFT:
vx=(0.1*sin(k)+0*cos(k))*sns/dt;
vz=(0*sin(k)-0.1*cos(k))*sns/dt;
comp[2]=vx;
comp[0]=vz;
comp[1]=0;
if (camerafollowball) {
ca= 2*M_PI*0.1;
kl=kl+ca;}
break;
break;
case LUKECONTROL:
int old_y=SizeViewY/2;
int old_x=SizeViewX/2;
float c = (sqrt( (x-old_x)*(x-old_x)+(y-old_y)*(y-old_y) ) );
if (c > 80.0) // e' il raggio del cerchi intorno alla pallina che modifica il vett velocita oltre 80
{ // pixel rimane 80 in norma
float d=c/80.0;
comp[2]= ((old_x-x)/d)*sin(k)+((y-old_y)/d)*cos(k);
comp[0]= ((y-old_y)/d)*sin(k)+((x-old_x)/d)*cos(k);
comp[1]= 0;
}
else
{
comp[2]= (old_x-x)*sin(k)+(y-old_y)*cos(k);
comp[0]= (y-old_y)*sin(k)+(x-old_x)*cos(k);
comp[1]= 0; //per piano inclinato
}
break;
}
ball.vet_compon_controllo = comp;
}
void GameView::Update (void)
{
int status_goal;
frame++;
time=glutGet(GLUT_ELAPSED_TIME);
if (time -timebase > 1000)
{
if (!pause)
{
//============conto alla rovescia=========================================
conto_alla_rovescia = (conto_alla_rovescia -((time -timebase)/1000 ) );
//========================================================================
}
fps =(( frame*1000.0)/(time-timebase));
timebase = time;
frame = 0;
}
if (fps==0) fps=1;
dt=1.0/fps;
if (!pause)
{
ball.Update(&mp,dt);
//==================================gestione morte e partita============================
int x=0;
int z=0;
x = floor(ball.vet_posizione.x());
z = floor(ball.vet_posizione.z());
if (!((x<0)||(z<0)||(z>=MAXMAP)||(x>=MAXMAP))) status_goal=mp.Map[x][z].goal;
else status_goal=0;
if(status_goal == 0)
{
if(conto_alla_rovescia==0)
{
pause=true;
menu=MENU_TIMEOUT;
}
if (ball.palla_viva == false)
{
pause=true;
menu=MENU_DEAD;
}
}
else
{
menu=MENU_GOAL;
pause=true;
}
//========================================================================================
//===============================gestione enemy===========================================
for (int i=0;i<MAXENEMY;i++)
{
if( mp.Enemys[i].first.X != -1)enemy[i].Intelligenza(&ball,&mp,enemy);
if( mp.Enemys[i].first.X != -1)enemy[i].Update(&mp,dt);
}
//========================================================================================
}
}
void GameView::setMouse(int cx, int cy)
{
ox=x;
oy=y;
x=cx;
y=cy;
}
void GameView::TargetCamera(void)
{
if (pause) { kl=kl+dt/10; }
if (!mp.intersect((camera.m_vPosition.x()+camera.m_vView.x()+sin(v)*h*sin(k))/2,
(camera.m_vPosition.y()+camera.m_vView.y()+cos(v)*h)/2,
(camera.m_vPosition.z()+camera.m_vView.z()+sin(v)*h*cos(k))/2,
(camera.m_vView.x()+ball.vet_posizione.x())/2,
(camera.m_vView.y()+ball.vet_posizione.y())/2,
(camera.m_vView.z()+ball.vet_posizione.z())/2))
{
v=v-0.1;
if (v<0.1){
v=0.1; }
h=h-0.1;
if (h<1.5) h=1.5;
}
else {
if (mp.intersect((camera.m_vPosition.x()+camera.m_vView.x()+sin(vl)*h*sin(k))/2,
(camera.m_vPosition.y()+camera.m_vView.y()+cos(vl)*h)/2,
(camera.m_vPosition.z()+camera.m_vView.z()+sin(vl)*h*cos(k))/2,
(camera.m_vView.x()+ball.vet_posizione.x())/2,
(camera.m_vView.y()+ball.vet_posizione.y())/2,
(camera.m_vView.z()+ball.vet_posizione.z())/2))
v=(v/(dt)+vl)/(1/dt+1);
if (mp.intersect((camera.m_vPosition.x()+camera.m_vView.x()+sin(v)*(hl)*sin(k))/2,
(camera.m_vPosition.y()+camera.m_vView.y()+cos(v)*(hl))/2,
(camera.m_vPosition.z()+camera.m_vView.z()+sin(v)*(hl)*cos(k))/2,
(camera.m_vView.x()+ball.vet_posizione.x())/2,
(camera.m_vView.y()+ball.vet_posizione.y())/2,
(camera.m_vView.z()+ball.vet_posizione.z())/2))
h=(h/(dt)+hl)/(1/dt+1);
if (mp.intersect((camera.m_vPosition.x()+camera.m_vView.x()+sin(v)*(h)*sin(kl))/2,
(camera.m_vPosition.y()+camera.m_vView.y()+cos(v)*(h))/2,
(camera.m_vPosition.z()+camera.m_vView.z()+sin(v)*(h)*cos(kl))/2,
(camera.m_vView.x()+ball.vet_posizione.x())/2,
(camera.m_vView.y()+ball.vet_posizione.y())/2,
(camera.m_vView.z()+ball.vet_posizione.z())/2))
k=(k/(dt)+kl)/(1/dt+1);
}
if (camera.m_vPosition.y()<mp.getY(camera.m_vPosition.x(),camera.m_vPosition.z())+1)
{if (h>=2.5) h=h-1;}
camera.PositionCamera((camera.m_vPosition.x()+camera.m_vView.x()+sin(v)*h*sin(k))/2,(camera.m_vPosition.y()+camera.m_vView.y()+cos(v)*h)/2,(camera.m_vPosition.z()+camera.m_vView.z()+sin(v)*h*cos(k))/2,
(camera.m_vView.x()+ball.vet_posizione.x())/2,(camera.m_vView.y()+ball.vet_posizione.y())/2,(camera.m_vView.z()+ball.vet_posizione.z())/2, 0, 1, 0);
}
void GameView::move(void)
{
if (!pause)
{
if (b_left) moveBall(scontrol);
if (b_right) moveCamera();
}
}
void GameView::Pause(void)
{
pause=!pause;
menu=MENU_PAUSE;
}