void sched (Info * info) { //mylogfd (SCHFD, "%d\n", info->state); // if (!info->video_info->is_valid) return; // mylogfd(SCHFD, "%d %d\n", IsEdgeValid(info), getEdgeX(info)); // mylogfd(SCHFD, "IsDoorSeen %d IsDoorAllSeen %d IsDoorLeft %d IsDoorRight %d IsDoorMiddle %d DoorMidX %d DoorMidY %d\n", // IsDoorSeen(info), IsDoorAllSeen(info), IsDoorLeft(info), IsDoorRight(info), IsDoorMiddle(info), getDoorMidx(info), getDoorMidy(info)); /*static int wait_edge = -1; if (wait_edge >= 0) { wait_edge ++; if (wait_edge >= 5) { mylogfd(SCHFD, "Touch edges->Stop\n"); do_stop(info); wait_edge = -1; } return; }*/ // mylogfd(SCHFD, "IsDoorSeen:%d IsEdgeValid:%d IsOutSide:%d edgeX %d\n", IsDoorAllSeen(info), IsEdgeValid(info), IsOutSide(info), getEdgeX(info)); estimate_seen_state(info); // mylogfd(SCHFD, "IsRobotSeen %d RobotX %d RobotY %d\n", IsRobotSeen(info), getRobotX(info), getRobotY(info)); if (info->last_cmd == CMD_FORWARD && info->state != SHOOTING && IsOutSide(info)) { mylogfd(SCHFD, "Outside\n"); info->last_cmd = CMD_STOP; do_stop(info); info->state = OUTSIDE; return; } /* if (info->last_cmd == CMD_FORWARD && IsOutSide(info) && IsEdgeValid(info)) { if (getEdgeX(info) < 50 && getEdgeX(info) >= 0) { mylogfd(SCHFD, "Touch edges %d\n", getEdgeX(info)); do_stop(info); info->state = DONE; //wait_edge = 0; return; } }*/ /* if (info->last_cmd == CMD_FORWARD && IsRobotSeen(info)) { if (IsRobotAcc(info)) { if (getRobotY(info) < 30) { do_stop(info); info->state = SEARCH_BALL; } else if (getRobotY(info) < 60) { info->destP.x = 0; info->destP.y = getRobotY(info) + 50; info->obstacle[0].x = getRobotY(info); info->obstacle[0].y = - getRobotX(info); do_obstacle(info); info->state = OBSTACLE; } } }*/ //mylogfd(-1, "s"); switch (info->state) { case START: //chang in state machine -- redwalker start(info); case FIND_PLACE: // find_place(info); break; case SEARCH_BALL: search_ball(info); break; case SEARCHING_BALL: searching_ball(info); break; case SEARCHING_ADJUST: searching_adjust(info); break; case FORWARDING_BALL: forwarding_ball(info); break; case CATCHING_BALL: catching_ball(info); break; case BALL_CATCHED: ball_catched(info); break; case SHOOT: shoot(info); break; case SHOOTING: shooting(info); break; case MOVING: moving(info); break; case CHANGE_PLACE: change_place(info); break; case FINDING_DIR: finding_dir(info); break; case CHANGING_PLACE: changing_place(info); break; case OBSTACLE: obstacle(info); break; case PROTECT_DOOR: protect_door(info); break; case OUTSIDE: if (!IsOutSide(info)) { mylogfd(SCHFD, "Inside restart to search_ball\n"); info->state = SEARCH_BALL; } break; case FACE_DOOR: face_door(info); break; case DONE: break; case GAME: //game(info); break; case SHOOTED: shooted(info); default : break; } }
// RENDERING DEL SISTEMA SOLARE void solarScene(void){ // ogni volta che disegno incremento il numero dei frame g_frames++; // Do all your OpenGL rendering here // cancelliamo il buffer video e lo z buffer glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* ------------------------------------------------------------------------- */ // attiva il viewport principale glViewport( 0, 0, width, height); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix(); g_camera.look(); // chiama la gluLookAt con i parametri opportuni // posizionando la luce dopo la telecamera la luce risulta fissa nel mondo glLightfv(GL_LIGHT0, GL_POSITION, g_light0_pos); glLightfv(GL_LIGHT1, GL_POSITION, g_light1_pos); glLightfv(GL_LIGHT2, GL_POSITION, g_light2_pos); glDisable(GL_CULL_FACE); // texture dello sfondo { GLUquadric* a = gluNewQuadric(); glPushAttrib(GL_ALL_ATTRIB_BITS); glEnable(GL_TEXTURE_2D); Point3 poscam = g_camera.getPos(); glPushMatrix(); glTranslatef(poscam.x, poscam.y, poscam.z); gluQuadricOrientation(a, GLU_INSIDE); glBindTexture(GL_TEXTURE_2D, g_textureSfondo[0]); gluQuadricTexture(a, GL_TRUE); gluSphere(a, 900, 24, 24); glPopMatrix(); glDisable(GL_TEXTURE_2D); glPopAttrib(); } glEnable(GL_CULL_FACE); /* PIANETI */ drawPlanet(posPlanet[0], radius[0], g_texturePlanet[0]); // mercury drawPlanet(posPlanet[1], radius[1], g_texturePlanet[1]); // venus drawPlanet(posPlanet[2], radius[2], g_texturePlanet[2]); // earth drawPlanet(posPlanet[3], radius[3], g_texturePlanet[3]); // mars drawPlanet(posPlanet[4], radius[4], g_texturePlanet[4]); // jupiter drawPlanet(posPlanet[5], radius[5], g_texturePlanet[5]); // saturn drawPlanet(posPlanet[6], radius[6], g_texturePlanet[6]); // uranus drawPlanet(posPlanet[7], radius[7], g_texturePlanet[7]); // neptune drawPlanet(posPlanet[8], radius[8], g_texturePlanet[8]); // pluto /* SATELLITI */ drawSatellite(&satellite[0], 'y', 0.00012, g_textureSatellite[0]); // moon //drawShield(satellite[0].pos, satellite[0].rad+1); drawSatellite(&satellite[1], 'z', 0.00024, g_textureSatellite[1]); // io drawSatellite(&satellite[2], 'y', 0.00012, g_textureSatellite[2]); // europa /* ANELLI DI SATURNO */ drawRing(posPlanet[5], 85, 120); // anello saturno // HENRY // gestione dei nemici: posizione, movimenti, inseguimenti // FILE: enemy_police.c insertEnemy(); insertPolice(); //ALBERTO // disegno di tutte le collisioni se attivate // FILE explosion.c insertExplosion(); //ALBERTO LASER // disegno di tutti i laser e controllo collisioni // FILE shooting.c hitEnemy=laserHitEnemy(); hitPolice=laserHitPolice(); insertRemoveLaser(); // se siamo stati colpiti dal laser nemico si decrementa la vita shooted(); // inseriamo il super-sparo insertSuperShoot(); glPopMatrix(); }