Originariamente inviato da linoma
A mio modo di vedere le cs se il tuo codice fosse corretto al max si dovrebbe fermare prima, notando dello spazio tra la colonna ed il player. Mi spiego se io sn nel punto A aggiungo 1, collido nn faccio muovere il player. Giusto?
C'e una giusta proporzione tra il valore che aggiungi alla posizione del player e la cella della matrice? A mio avviso il tuo valore dovrebbe essere piu piccolo della dimensione della cella dell matrice, in modo che al max ti muverai di una cella alla volta.
ti posto un po di codice di esempio, così mi spiego meglio.
codice:
#define X 0
#define Y 1
#define Z 2
struct Player{
GLfloat position[3];
GLfloat forward[3];
GLfloat up[3];
} player;
int matrix[20][20];
void initMatrix()
{
int i,j=0;
for(i=0;i<20;i++)
for(j=0;j<20;j++)
matrix[i][j]=0;
matrix[10][10]=1; //a titolo di esempio alzo una colonna solo nella posizione 10,10
}
void disegnaStanza()
{
int x,y,z=0;
for(x=0;x<20 x++)
for(y=0;y<20; y++)
if(matrix[x][y]==1)
alzaMuro(x,y,5); //muro di altezza 5 nella posizione x,y
else
disegnaMattonella(x,y,z); //mattonella nella posizione x,y,z;
}
void posizioneInizialePlayer(){
player.position[X] = 1.0;
player.position[Y] = 1.0;
player.position[Z] = 1.0;
player.forward[X] = player.position[X] + 1.0;
player.forward[Y] = 1.0;
player.forward[Z] = 1.0;
player.up[X] = 0.0;
player.up[Y] = 0.0;
player.up[Z] = 1.0;
}
void RenderScene(void)
{
// Clear the window and the depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
//guardo dal punto di vista del giocatore
gluLookAt (player.position[X], player.position[Y], player.position[Z],
player.forward[X], player.forward[Y], player.forward[Z],
player.up[X], player.up[Y], player.up[Z] );
disegnaStanza();
glPopMatrix();
// Buffer swap
glutSwapBuffers();
}
void SpecialKeys(int key, int x, int y)
{
GLfloat shift = 0.20;
GLfloat tempX, tempY;
//mi muovo verso avanti nella stanza
if(key == GLUT_KEY_UP)
{
tempX = player.position[X] + shift * cos(2.0 * GL_PI * alpha / 360.0);
tempY = player.position[Y] + shift * sin(2.0 * GL_PI * alpha / 360.0);
//per evitare che si entra nei muri
if(matrix[(int)tempX][(int)tempY]!=1)
{
player.position[X] = tempX;
player.position[Y] = tempY;
player.forward[X] = player.position[X] + shift * cos(2.0 * GL_PI * alpha / 360.0);
player.forward[Y] = player.position[Y] + shift * sin(2.0 * GL_PI * alpha / 360.0);
}
}
...
}
int main(int argc, char *argv[])
{
...
}