///Function that starts the entire process. void ScreenSaver::execute(int& argc , char** argv) { ///Generating objects generateTable(); generateBall(); glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(WIDTH , HEIGHT); glutInitWindowPosition(50,50); windowID = glutCreateWindow(" Bouncy ball "); init(); threadInit(); initSkybox(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(handleMouse); glutKeyboardFunc(handleKeyboard); glutSpecialFunc(handleSpecial); //GLUI *glUserInterface = GLUI_Master.create_glui_subwindow( windowID,GLUI_SUBWINDOW_RIGHT ); menu.createMenu(); glutTimerFunc(DELTA_T , timer , 0); glutMainLoop(); for(int i=0; i<NUM_BALLS;i++) pthread_exit(&vecBallThread[i]); }
/* * qui bisogna gestire tutto quello che riguarda i vari "update" del gioco, quindi * movimento del verme(velocita', direzione...) , mappa, collision detection */ void loop(){ GLuint moveFrame = 0; GLuint delay = 0; /* calcolo del framerate */ programData.frame++; programData.time = glutGet(GLUT_ELAPSED_TIME); if(programData.timerender == 0) programData.timerender = programData.time; if(programData.time - programData.timebase > 1000){ sprintf(programData.fps, "FPS: %.0f", programData.frame*1000.0/(programData.time-programData.timebase)); programData.timebase = programData.time; programData.frame = 0; } /* controllo lo stato della partita */ switch(programData.gameStatus){ case 0: /* ho perso */ return; break; case 1: /* sto giocando */ /* continuo e stampo i punti */ sprintf(programData.pointsOSD, "PUNTI: %d",programData.points ); break; case 2: /* ho vinto */ return; break; default: break; } /* se sono nel menu' non devo muovere nulla */ if(programData.menu == 1){ return; } /* movimento della telecamera a scatti */ if(programData.time - programData.timerender > programData.timeFrame){ moveFrame = 1; delay = programData.time - (programData.timerender + programData.timeFrame); programData.timerender = programData.time + delay ; } /* controllo l'input dell'utente */ /* movimento verticale --> freccia up e down */ if((worldData.kup)||(worldData.kdown)){ if(worldData.yStatus == worldData.nextYstatus){ /* sono fermo */ switch(worldData.yStatus){ case 0: /*sono orizzontale*/ if(worldData.kup){ worldData.nextYstatus = 1; worldData.nextAngleX = worldData.angleX - 90.0f; worldData.nextAngleMX = worldData.angleMX -90.0f; worldData.angleX = worldData.angleMX; }else{ worldData.nextYstatus = 2; worldData.nextAngleX = worldData.angleX + 90.0f; worldData.nextAngleMX = worldData.angleMX + 90.0f; worldData.angleX = worldData.angleMX; } break; case 1: /*sono in alto*/ if(worldData.kdown){ worldData.nextYstatus = 0; worldData.nextAngleX = worldData.angleX + 90.0f; worldData.nextAngleMX = worldData.angleMX + 90.0f; worldData.angleX = worldData.angleMX; } break; case 2: /*sono in basso*/\ if(worldData.kup){ worldData.nextYstatus = 0; worldData.nextAngleX = worldData.angleX - 90.0f; worldData.nextAngleMX = worldData.angleMX -90.0f; worldData.angleX = worldData.angleMX; } break; default: break; } }else{ /* caso in cui sono in movimento*/ if(worldData.kup){ if(worldData.nextYstatus == 2){ /*sto andando verso il basso*/ worldData.nextYstatus = 0; worldData.yStatus = 2; worldData.angleX = worldData.nextAngleX; /* qui bisogna muovere il verme */ worldData.nextAngleX = worldData.angleX - 90.0f; worldData.nextAngleMX = worldData.angleX - 90.0f; } }else{ if(worldData.nextYstatus == 1){ /*sto andando verso l'alto*/ worldData.nextYstatus = 0; worldData.yStatus = 1; worldData.angleX = worldData.nextAngleX; /* qui bisogna muovere il verme */ worldData.nextAngleX = worldData.angleX + 90.0f; worldData.nextAngleMX = worldData.angleX + 90.0f; } } } worldData.kup = 0; worldData.kdown = 0; } /* movimento laterale --> freccia sx e dx */ if((worldData.kleft)||(worldData.kright)){ if(worldData.xStatus == 0){ /* sto andando dritto */ if(worldData.kleft){ worldData.nextXstatus = 1; /* vado a sinistra */ worldData.nextAngleY = worldData.angleY - 90.0f ; worldData.nextAngleMY = worldData.angleMY - 90.0f ; worldData.angleY = worldData.angleMY; } else{ worldData.nextXstatus = 2; /* vado a destra */ worldData.nextAngleY = worldData.angleY + 90.0f ; worldData.nextAngleMY = worldData.angleMY + 90.0f ; worldData.angleY = worldData.angleMY; } worldData.xStatus = 1; }else{ switch(worldData.nextXstatus){ case 1: /* sto andando verso sinistra */ if(worldData.kright){ worldData.nextAngleY = worldData.nextAngleY + 90.0f; worldData.nextAngleMY = worldData.nextAngleMY + 90.0f; worldData.nextXstatus = 2; worldData.angleY = worldData.angleMY; } break; case 2: /* sto andando verso destra */ if(worldData.kleft){ worldData.nextAngleY = worldData.nextAngleY - 90.0f; worldData.nextAngleMY = worldData.nextAngleMY - 90.0f; worldData.nextXstatus = 1; worldData.angleY = worldData.angleMY; } break; default: break; } } worldData.kleft = 0; worldData.kright = 0; } /* modifico l'angolo X */ if(worldData.yStatus != worldData.nextYstatus){ switch(worldData.nextYstatus){ case 0: /* devo arrivare sul piano */ switch(worldData.yStatus){ case 1: worldData.angleMX += programData.velAngolare; moveFrame = 0; if(worldData.angleMX > worldData.nextAngleMX){ worldData.angleMX = worldData.nextAngleMX; worldData.angleX = worldData.nextAngleX; worldData.yStatus = 0; } break; case 2: worldData.angleMX -= programData.velAngolare; moveFrame = 0; if(worldData.angleMX < worldData.nextAngleMX){ worldData.angleMX = worldData.nextAngleMX; worldData.angleX = worldData.nextAngleX; worldData.yStatus = 0; } break; default: break; } break; case 1: worldData.angleMX -= programData.velAngolare; moveFrame = 0; if(worldData.angleMX < worldData.nextAngleMX){ worldData.angleMX = worldData.nextAngleMX; worldData.angleX = worldData.nextAngleX; worldData.yStatus = 1; } break; case 2: worldData.angleMX += programData.velAngolare; moveFrame = 0; if(worldData.angleMX > worldData.nextAngleMX){ worldData.angleMX = worldData.nextAngleMX; worldData.angleX = worldData.nextAngleX; worldData.yStatus = 2; } break; default: break; } } /* modifico l'angolo Y */ if(worldData.xStatus){ switch(worldData.nextXstatus){ case 1: /* devo muovermi a sinistra */ worldData.angleMY -= programData.velAngolare; moveFrame = 0; if(worldData.angleMY < worldData.nextAngleMY){ worldData.angleMY = worldData.nextAngleMY; worldData.angleY = worldData.nextAngleY; worldData.xStatus = 0; worldData.nextXstatus = 0; } break; case 2: /* devo muovermi a destra */ worldData.angleMY += programData.velAngolare; moveFrame = 0; if(worldData.angleMY > worldData.nextAngleMY){ worldData.angleMY = worldData.nextAngleMY; worldData.angleY = worldData.nextAngleY; worldData.xStatus = 0; worldData.nextXstatus = 0; } break; default: break; } } /* controllo se sono in posizione tale da muovermi */ if(moveFrame){ float offSetX = 0.0f, offSetY = 0.0f, offSetZ = 0.0f; // collision detection double dist; int collision = 0; if(worldData.yStatus == 0){ /* movimento sul piano X */ offSetX = (float)sin(worldData.angleY * PIOVER180) * 3.5f; offSetZ = (float)cos(worldData.angleY * PIOVER180) * 3.5f; if(!moveWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0)){ programData.gameStatus = 0; } dist = dist2Point(-((myWorm.head)->x), -((myWorm.head)->y), (myWorm.head)->z, ball.x, ball.y, ball.z); if(dist<= ((WORMDIA+DIA)*(WORMDIA+DIA)) ) collision = 1; else collision = 0; if(checkWall((myWorm.head)->x+myWorm.dia, (myWorm.head)->z +myWorm.dia, 1)){ /*collision testa del verme*/ if(collision){ if(worldData.yStatus == 0){ increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0); increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0); increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0); increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0); } else{ increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1); increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1); increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1); increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1); } generateBall(); programData.points+=100; increaseVel(5); } }else{ /* e' uscito dai muri */ programData.gameStatus = 0; } }else{ /* movimento sul piano Y */ offSetY = (float)sin(worldData.angleX * PIOVER180) * 3.5f; offSetZ = (float)cos(worldData.angleX * PIOVER180) * 3.5f; if(!moveWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1)){ programData.gameStatus = 0; } dist = dist2Point(-((myWorm.head)->x), -((myWorm.head)->y), (myWorm.head)->z, ball.x, ball.y, ball.z); if(dist<= ((WORMDIA+DIA)*(WORMDIA+DIA)) ) collision = 1; else collision = 0; if(checkWall((myWorm.head)->y+myWorm.dia, (myWorm.head)->z +myWorm.dia, 2)){ /*collision testa del verme*/ if(collision){ if(worldData.yStatus == 0){ increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0); increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0); increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0); increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0); } else{ increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1); increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1); increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1); increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1); } generateBall(); programData.points+=100; increaseVel(5); } }else{ /* e' uscito dai muri */ programData.gameStatus = 0; } } } }