#pragma once
#include "MadMap.h"
#include "MarbleBall.h"
#include "MarbleEnemy.h"
#include "CCamera.h"
#include "Console.h"
#include <vcg/xml/xml.h>
//settaggio di init dell'ambiente opengl per la luce e i materiali
#define METALLO 0
#define VETRO 1
#define PLASTICA 2
#define LUMINOSO 3
#define DEFAULT -100
#define ROLLCONTROL 1
#define LUKECONTROL 2
#define C_UP 1000
#define C_DOWN -1000
#define C_RIGHT 100
#define C_LEFT -100
/**vista opengl del gioco*/
class GameView
{
public:
/**tasto destro del mouse*/
bool b_right;
/**tasto sinistro del mouse*/
bool b_left;
/**camera della vista del gioco*/
CCamera camera;
/**mappa del gioco*/
MadMap mp;
/**pallina del gioco*/
MarbleBall ball;
/**nemici**/
MarbleEnemy enemy[MAXENEMY];
/**angolo del camera per la rotazione intorno asse Y della pallina*/
float k;
/**angolo della camera per la rotazione intorno asse x/z della pallina*/
float v;
/**limite angolo della camera per rotazione intorno asse Y*/
float kl;
/**limite angolo della camera per rotazione intorno asse x/z*/
float vl;
/** h: distanza corrente della camera dalla pallina*/
float h;
/** limite della distanza della camera dalla pallina */
float hl;
/**delta temporale*/
float dt;
/** sensibilità del movimento controllo*/
float sns;
/**ampiezza X della vista */
int SizeViewX;
/**ampiezza Y della vista */
int SizeViewY;
/**variabile che indica se le texture della mappa nella vista sono inizializzate*/
bool inittexture;
/**tempo rimanente nel gioco in corso*/
int conto_alla_rovescia;
/**tempo iniziale del gioco in corso*/
int time_game;
/**frame per secondo*/
int fps;
/**numero di frame che sono stati calcolati dall'ultimo intervallo di tempo*/
int frame;
/**time iniziale dell'intervallo temporale*/
int timebase;
/**ultimo time dell'intervallo temporale*/
int time;
/**coordinate del mouse*/
int x, y;
/**vecchie coordinate del mouse*/
int ox, oy;
/**indica se la vista è in modalità pause*/
bool pause;
/**numero vite disponibili nel gioco in corso*/
int num_vite;
/**indica se la camera segue i movimenti della palla*/
bool camerafollowball;
/**il tipo di l'ambiente corrente : METALLO,VETRO, PLASTICA, LUMINOSO, DEFAULT*/
int option_materiale;
/**console usata per i menu*/
CConsole console;
/**menu corrente*/
int menu;
/**item corrente*/
int item;
/**il tipo di grafica corrente (WIREFRAME,SOLID,TEXTURED)*/
int optionGraphics;
/**il tipo di controllo del movimento della palla corrente:ROLLCONTROL, LUKECONTROL*/
int scontrol;
/**indice della mappa corrente*/
int currentmap;
/**il tipo di visualizzazione dei nemici corrente: ROBOT, NOROBOT*/
int optionEnemy;
//int moving;
public:
//==================Init============================
//Inizializza la vista del gioco
//==================================================
void Init(int option);
//==================SetKey==========================
//permette di indicare tasto premuto della tastiera nella vista
//==================================================
void setKey(int);
//==================SetSKey==========================
//permette di indicare tasto Speciale premuto della tastiera nella vista
//==================================================
void setSKey(int key);
//==================SetSKeyUp==========================
//permette di indicare tasto Speciale rilasciato della tastiera nella vista
//==================================================
void setSKeyUp(int key);
//==================SetMouse==========================
//aggiorno le coordinate del mouse nella vista
//====================================================
void setMouse(int cx, int cy);
GameView(void);
~GameView(void);
//==================Reshape============================================
//Imposta la visualizzazione della view in base alle dimensioni (w)X(h)
//=====================================================================
void Reshape(int w, int h);
//==================moveCamera===========================
//funzione che sposta la camera
//=======================================================
void moveCamera(void);
//==================Draw=================================
//renderizza un fotogramma nella view
//=======================================================
int Draw(void);
//==================moveBall==========================================
//sposta la pallina in base al type passato. <br>
//type può avere i seguenti valori: <br>
//ROLLCONTROL: spostamento rotolamento in base movimento del mouse<br>
//LUKECONTROL: spostamento elastico in base movimento del mouse <br>
//C_UP: spostamento avanti attraverso il tasto UP <br>
//C_DOWN: spostamento indietro attraverso il tasto DOWN <br>
//C_LEFT: spostamento a sinistra attraverso il tasto LEFT <br>
//C_RIGHT: spostamento a destra attraverso il tasto UP <br>
//====================================================================
void moveBall(int type);
//==================Update=============================
//Aggiorna lo stato della vista
//=======================================================
void Update(void);
//==================move=============================
//applica il movimento (camera e/o pallina)
//=======================================================
void move(void);
//==================Pause=============================
//mette in stato di pausa la vista
//=======================================================
void Pause(void);
//==================TargetCamera=======================================================
//calcola la posizione il punto di vista della camera in modo che la pallina sia sempre in vista
//=====================================================================================
void TargetCamera(void);
//==================selectMenuItem=============================
//permette di selezionare una voce nei menu <br>
//menu: menu corrente <br>
//item: item selezionato <br>
//=======================================================
void selectMenuItem(int menu, int item);
//==================LoadMap=============================
//carica una mappa. <br>
//map: nome della mappa <br>
//=======================================================
int GameView::LoadMap(char *map);
};