void Core::addPart() { t_pos tail; t_pos tmp; tail.x = (this->_width / 2 - this->_snakeSize); tail.y = (this->_height / 2); tmp.x = tail.x - 1; if (checkWall(tmp) == true) { tmp.x = tail.x + 1; if (checkWall(tmp) == true) { tmp.x = tail.x; tmp.y = tail.y - 1; if (checkWall(tmp) == false) { tmp.y = tail.y + 1; if (checkWall(tmp) == false) this->_lib->gameOver(this->_score); else tail.y = tmp.y; } else tail.y = tmp.y; } else tail.x = tmp.x; } else tail.x = tmp.x; _snakeSize++; this->_snake.push_back(tail); }
bool Core::isDead(const t_pos head) { if (checkWall(head) != true) { this->_isRunning = false; return (true); } if (biteHimself(head) == true) { this->_isRunning = false; return (true); } return (false); }
void checkWall(float *eye, QuadBuffer *q, int i, int *pos, int *index, int *processed) { float x[2], y[2]; float a[2], b[2]; int j; processed[i] = 1; if(shorten(x, y, q->quads + i, 0.01)) for(j = 0; j < q->current; j++) if(processed[j] == 0) { shorten(a, b, q->quads + j, 0.01); if(occlusiontest(x, y, eye, a, b)) checkWall(eye, q, j, pos, index, processed); } index[*pos] = i; (*pos)++; }
void Game::timerEvent(QTimerEvent*) { // check to see if any addition is necessary checkAddition(); // advance the scene myScene.advance(); // check to see if the score should be increased checkScore(); // check to see if he wants to jump (and can) checkJump(); // check to see if he is stuck in a wall checkWall(); // check to see if he has hit an obstacle checkLose(); // check to see if removal of items is necessary checkDeath(); }
int* getSortedQuads(QuadBuffer *q, float eye[3]) { int *index; int *processed; int pos = 0; int i; if(q->current == 0) return NULL; index = (int*) malloc(q->current * sizeof(int)); processed = (int*) malloc(q->current * sizeof(int)); /* memset(processed, 0, q->current * sizeof(int)); */ for(i = 0; i < q->current; i++) processed[i] = 0; for(i = 0; i < q->current; i++) if(processed[i] == 0) checkWall(eye, q, i, &pos, index, processed); free(processed); return index; }
/* * 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; } } } }
void Step(float dtime, unsigned char animBall) { float posChange, d; unsigned char i, j; static float time = 0.0f; time = time+dtime; ReadAccState(); if (animBall) { g_ballForceX = (float)(g_devAccelerationY-g_devAccOffsetY)/2.0f; g_ballForceY = (float)(g_devAccelerationX-g_devAccOffsetX)/2.0f; posChange = g_ballX + ((float)g_ballVelX * dtime) + (((g_ballForceX) / g_ballMass) * dtime * dtime) / 2.0f; g_ballVelX = (posChange - g_ballX) / dtime; g_ballX = posChange; posChange = g_ballY + ((float)g_ballVelY * dtime) + (((g_ballForceY) / g_ballMass) * dtime * dtime) / 2.0f; g_ballVelY = (posChange - g_ballY) / dtime; g_ballY = posChange; /* posChange = g_ballZ + (g_ballVelZ * dtime) + (((g_ballForceZ) / g_ballMass) * dtime * dtime) / 2.0f; g_ballVelZ = (posChange - g_ballZ) / dtime; g_ballZ = posChange;*/ if (g_ballY <= 3) { g_ballY = 3; g_ballVelY = -g_ballVelY*0.6f; if ((g_colDirs & 0x08) == 0x08) g_ballGth = 1; } if (g_ballY >= 53) { g_ballY = 53; g_ballVelY = -g_ballVelY*0.6f; if ((g_colDirs & 0x04) == 0x04) g_ballGth = 1; } if (g_ballX <= 3) { g_ballX = 3; g_ballVelX = -g_ballVelX*0.6f; if ((g_colDirs & 0x02) == 0x02) g_ballGth = 1; } if (g_ballX >= 118) { g_ballX = 118; g_ballVelX = -g_ballVelX*0.6f; if ((g_colDirs & 0x01) == 0x01) g_ballGth = 1; } } for (i = 0; i < g_usedWalls; i++) { for (j = 0; j < g_usedWallMovers; j++) { if (i == g_physWallMovers[j].wallId) { if (g_physWallMovers[j].orientation == HORIZONTAL) { if (g_walls[i].orientation == HORIZONTAL) { // < ------ > g_walls[i].c2_start = (float)g_physWallMovers[j].x + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time); g_walls[i].c2_end = (float)g_physWallMovers[j].y + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time); } else { // <|> g_walls[i].c = (float)g_physWallMovers[j].x + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time); } } else { if (g_walls[i].orientation == HORIZONTAL) { // /\ ----- \/ g_walls[i].c = (float)g_physWallMovers[j].y + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time); } else { // /\ | \/ g_walls[i].c2_start = (float)g_physWallMovers[j].x + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time); g_walls[i].c2_end = (float)g_physWallMovers[j].y + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time); } } GeneratePhysWall(&g_physWalls[i], g_walls[i]); } } } if (animBall) { // wall g_colDirs = 0; for (i = 0; i < g_usedWalls; i++) { checkWall(g_physWalls[i]); } if ((g_colDirs & 0x03) == 0x03 || (g_colDirs & 0x0C) == 0x0C) g_ballGth = 1; //holes for (i = 0; i < g_usedHoles; i++) { d = sqrt((float)(g_holes[i].x - g_ballX)*(float)(g_holes[i].x - g_ballX)+(float)(g_holes[i].y - g_ballY)*(float)(g_holes[i].y - g_ballY)); if (d < 8) { g_ballVelX += (g_holes[i].x - g_ballX)*0.5f; g_ballVelY += (g_holes[i].y - g_ballY)*0.5f; } if (d<4) { g_ballX = g_holes[i].x; g_ballY = g_holes[i].y; g_ballGth = 1; } } //Trigger d = sqrt((float)(g_levelEndX - g_ballX)*(float)(g_levelEndX - g_ballX)+(float)(g_levelEndY - g_ballY)*(float)(g_levelEndY - g_ballY)); if (d <= 5) { g_ballX = g_levelEndX; g_ballY = g_levelEndY; g_ballGtt = 1; } g_ballVelX *= 0.985f; g_ballVelY *= 0.985f; } return; }